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()
yIsEmpty()
: 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()
yIsEmpty()
: Funciones para validar el contenido de las celdas.