VBA Excel: Gestión Avanzada de Datos, Vectores y Matrices en Hojas de Cálculo

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 12,36 KB

Introducción a la Manipulación de Datos con VBA en Excel

Este documento presenta una serie de rutinas en VBA (Visual Basic for Applications) diseñadas para realizar operaciones comunes y esenciales en hojas de cálculo de Excel. Cada sección detalla una funcionalidad específica, desde la localización y ordenamiento de vectores hasta el procesamiento de matrices, demostrando la potencia de la automatización en Excel.


1. Localización de Vectores por Filas

Esta rutina permite identificar el inicio y fin de un vector de datos en la primera columna de la Hoja1, asumiendo que el vector está compuesto por celdas contiguas no vacías.

Código VBA: Búsqueda de Inicio y Fin de Vector (Columna 1)

Private Sub CommandButton1_Click()
    ' Donde comienza el vector
    Dim i As Long ' Declarar i como Long para evitar desbordamiento y buenas prácticas
    i = 1
    While Hoja1.Cells(i, 1) = ""
        i = i + 1
    Wend
    MsgBox "El vector comienza en la fila: " & i

    Dim inicio As Long ' Declarar inicio
    inicio = i

    ' Donde termina el vector
    While Hoja1.Cells(i, 1) <> ""
        i = i + 1
    Wend
    i = i - 1
    MsgBox "El vector termina en la fila: " & i
End Sub

Conceptos clave:

  • Hoja1.Cells(i, 1): Acceso a celdas específicas en la Hoja1.
  • While...Wend: Bucle para iterar mientras una condición sea verdadera.
  • MsgBox: Muestra mensajes al usuario.
  • Vector: Conjunto de datos en una sola columna o fila.

2. Procesamiento de Matriz: Pares en Diagonal y Mayor Valor

Esta subrutina recorre una matriz de 10x10 en la Hoja1 para identificar el número mayor y su posición, así como contar la cantidad de números pares presentes en su diagonal principal.

Código VBA: Detección de Pares y Máximo en Matriz (10x10)

Private Sub CommandButton2_Click()
    Dim numeroPares As Long
    Dim mayor As Variant ' Puede contener diferentes tipos de datos
    Dim c As Long, d As Long
    Dim i As Long, j As Long

    numeroPares = 0
    ' Inicializar 'mayor' con el primer valor de la matriz para manejar números negativos correctamente
    If Not IsEmpty(Hoja1.Cells(1, 1).Value) Then
        mayor = Hoja1.Cells(1, 1).Value
        c = 1
        d = 1
    Else
        ' Si la primera celda está vacía, buscar el primer valor no vacío para inicializar
        Dim foundFirst As Boolean
        foundFirst = False
        For i = 1 To 10
            For j = 1 To 10
                If Not IsEmpty(Hoja1.Cells(i, j).Value) Then
                    mayor = Hoja1.Cells(i, j).Value
                    c = i
                    d = j
                    foundFirst = True
                    Exit For
                End If
            Next j
            If foundFirst Then Exit For
        Next i
        If Not foundFirst Then
            MsgBox "La matriz está vacía o no contiene números."
            Exit Sub ' Salir si no hay números para procesar
        End If
    End If

    For i = 1 To 10
        For j = 1 To 10
            If i = j Then ' Elementos de la diagonal principal
                If IsNumeric(Hoja1.Cells(i, j).Value) And Hoja1.Cells(i, j).Value Mod 2 = 0 Then ' Corregido: Mod 2 = 0 para pares
                    numeroPares = numeroPares + 1
                End If
            End If
            If IsNumeric(Hoja1.Cells(i, j).Value) And Hoja1.Cells(i, j).Value > mayor Then
                mayor = Hoja1.Cells(i, j).Value
                c = i
                d = j
            End If
        Next j
    Next i

    MsgBox "El número mayor y su posición son: " & mayor & " y está en la posición (" & c & ", " & d & ")"
    Hoja1.Range("B52") = "La cantidad de números pares de la diagonal es: " & numeroPares
End Sub

Corrección importante: La condición If Hoja1.Cells(i, j) Mod 2 Then en VBA evalúa a True si el resultado de Mod 2 es distinto de cero (es decir, impar). Para contar números pares, la condición correcta es If Hoja1.Cells(i, j) Mod 2 = 0 Then. Además, se ha mejorado la inicialización de la variable mayor para manejar correctamente casos donde los números son negativos o la primera celda está vacía, y se ha añadido una verificación IsNumeric para evitar errores de tipo.

Conceptos clave:

  • For...Next: Bucles anidados para recorrer matrices.
  • If...Then...End If: Estructuras condicionales.
  • Mod 2 = 0: Operador módulo para verificar paridad (números pares).
  • Diagonal principal: Elementos donde el índice de fila es igual al índice de columna (i = j).
  • Hoja1.Range("B52"): Asigna un valor a una celda específica.
  • IsNumeric() y IsEmpty(): Funciones para validar el contenido de las celdas.

3. Ordenamiento de Vector en Dos Partes

Esta rutina implementa un algoritmo de ordenamiento tipo burbuja para un vector en la primera columna de la Hoja1, dividiéndolo en dos secciones con criterios de ordenación diferentes.

Código VBA: Ordenamiento Híbrido de Vector (Columna 1)

Private Sub CommandButton1_Click() ' Ordenar vector en 2 partes
    Dim i As Long, a As Variant, b As Variant

    ' Primera parte: Ordenar de menor a mayor (filas 1 a 49)
    For i = 1 To 49
        If Hoja1.Cells(i, 1) > Hoja1.Cells(i + 1, 1) Then ' Ordenar de menor a mayor
            a = Hoja1.Cells(i, 1)
            b = Hoja1.Cells(i + 1, 1)
            Hoja1.Cells(i, 1) = b
            Hoja1.Cells(i + 1, 1) = a
        End If
    Next i

    ' Segunda parte: Ordenar de mayor a menor (filas 51 a 99)
    For i = 51 To 99
        If Hoja1.Cells(i, 1) < Hoja1.Cells(i + 1, 1) Then ' Ordenar de mayor a menor
            a = Hoja1.Cells(i, 1)
            b = Hoja1.Cells(i + 1, 1)
            Hoja1.Cells(i, 1) = b
            Hoja1.Cells(i + 1, 1) = a
        End If
    Next i
End Sub

Conceptos clave:

  • Algoritmo de burbuja: Método de ordenamiento simple que compara y, si es necesario, intercambia elementos adyacentes.
  • Hoja1.Cells(i, 1) > Hoja1.Cells(i + 1, 1): Condición para ordenamiento ascendente.
  • Hoja1.Cells(i, 1) < Hoja1.Cells(i + 1, 1): Condición para ordenamiento descendente.
  • Intercambio de valores: Uso de variables temporales (a, b) para reordenar elementos.

4. Conteo de Filas, Columnas y Elementos Específicos en Matriz

Esta rutina determina las dimensiones de una matriz (número de filas y columnas) y cuenta la cantidad de ceros y, por inferencia, la cantidad de "unos" (elementos no cero) dentro de un rango definido.

Código VBA: Dimensiones y Conteo de Elementos en Matriz

Private Sub CommandButton1_Click()
    Dim n As Long ' Cantidad de filas
    Dim m As Long ' Cantidad de columnas
    Dim i As Long, j As Long
    Dim cero As Long

    n = 0
    m = 0

    ' Contador de filas (desde la fila 3 hasta la 100, columna 2)
    For i = 3 To 100
        If Hoja1.Cells(i, 2) <> "" Then
            n = n + 1
        End If
    Next i

    ' Contador de columnas (desde la columna 2 hasta la 100, fila 3)
    For j = 2 To 100
        If Hoja1.Cells(3, j) <> "" Then
            m = m + 1
        End If
    Next j

    ' Mensaje para filas
    MsgBox "La matriz tiene: " & n & " filas"
    ' Mensaje para columnas
    MsgBox "La matriz tiene: " & m & " columnas"

    cero = 0
    ' Recorrido de la matriz para contar ceros (asumiendo que la matriz comienza en (3,2))
    ' Los límites de los bucles deben ajustarse para recorrer el rango real de la matriz detectada.
    ' Si 'n' es la cantidad de filas y la matriz empieza en la fila 3, el bucle va de 3 a (3 + n - 1).
    ' Similarmente para las columnas.
    For i = 3 To (3 + n - 1) ' Recorre desde la fila inicial (3) hasta la última fila detectada
        For j = 2 To (2 + m - 1) ' Recorre desde la columna inicial (2) hasta la última columna detectada
            If Hoja1.Cells(i, j) = 0 Then
                cero = cero + 1
            End If
        Next j
    Next i

    MsgBox "La matriz tiene: " & cero & " ceros"
    MsgBox "La matriz tiene: " & (n * m) - cero & " unos" ' Asumiendo que los no-ceros son "unos"
End Sub

Corrección importante: Los bucles para contar ceros deben ajustarse para recorrer el rango real de la matriz detectada. Si n es la cantidad de filas y la matriz empieza en la fila 3, entonces el bucle debe ir de 3 To 3 + n - 1. Similarmente para las columnas, de 2 To 2 + m - 1. Esto asegura que se procesen solo las celdas dentro de las dimensiones de la matriz identificada.

Conceptos clave:

  • Dimensiones de matriz: Determinación del número de filas y columnas ocupadas.
  • Hoja1.Cells(i, j) = 0: Condición para identificar celdas con valor cero.
  • Conteo de elementos: Suma de ocurrencias de un valor específico.
  • Rango dinámico: Adaptación de los límites de los bucles según los datos encontrados.

5. Localización y Búsqueda de Mayor Valor en Vector por Columnas

Esta rutina se enfoca en un vector ubicado en la fila 5 de la Hoja1. Localiza su inicio y fin por columnas y, posteriormente, encuentra el valor más grande dentro de ese vector, indicando también la columna donde se encuentra.

Código VBA: Búsqueda de Vector y Máximo por Columnas (Fila 5)

Private Sub CommandButton1_Click()
    Dim j As Long
    Dim inicio As Long
    Dim Final As Long
    Dim mayor As Variant ' Puede contener diferentes tipos de datos
    Dim c As Long

    ' Encontrar donde comienza el vector (en la fila 5)
    j = 1
    While Hoja1.Cells(5, j) = ""
        j = j + 1
    Wend
    inicio = j
    MsgBox "El vector comienza en la columna: " & inicio

    ' Encontrar donde termina el vector (en la fila 5)
    While Hoja1.Cells(5, j) <> ""
        j = j + 1
    Wend
    Final = j - 1
    MsgBox "El vector termina en la columna: " & Final

    ' Mayor valor en el vector
    ' Inicializar 'mayor' con el primer valor del vector para manejar números negativos correctamente
    If Not IsEmpty(Hoja1.Cells(5, inicio).Value) Then
        mayor = Hoja1.Cells(5, inicio).Value
        c = inicio ' Inicializar la columna del mayor valor
    Else
        ' Si la primera celda está vacía, buscar el primer valor no vacío para inicializar
        Dim foundFirstInRow As Boolean
        foundFirstInRow = False
        For j = inicio To Final
            If Not IsEmpty(Hoja1.Cells(5, j).Value) Then
                mayor = Hoja1.Cells(5, j).Value
                c = j
                foundFirstInRow = True
                Exit For
            End If
        Next j
        If Not foundFirstInRow Then
            MsgBox "El vector en la fila 5 está vacío o no contiene números."
            Exit Sub ' Salir si no hay números para procesar
        End If
    End If

    For j = inicio To Final
        If IsNumeric(Hoja1.Cells(5, j).Value) And Hoja1.Cells(5, j).Value > mayor Then
            mayor = Hoja1.Cells(5, j).Value
            c = j
        End If
    Next j

    MsgBox "El número mayor es: " & mayor
    MsgBox "La columna del número mayor es: " & c
End Sub

Conceptos clave:

  • Vector horizontal: Datos dispuestos en una fila.
  • While...Wend: Para determinar los límites del vector.
  • For...Next: Para recorrer el vector y encontrar el máximo.
  • Búsqueda de máximo: Algoritmo iterativo para encontrar el valor más alto.
  • IsNumeric() y IsEmpty(): Funciones para validar el contenido de las celdas.

Entradas relacionadas: