Ordenar array VBA

Este script nos permite oredenar un array de manor a mayor en VBA

Sub BubbleSort(arr)
   ' Ordena de menor a mayor un array
   ' Call BubbleSort(MyArray)
  Dim strTemp As String
  Dim i As Long
  Dim j As Long
  Dim lngMin As Long
  Dim lngMax As Long
  lngMin = LBound(arr)
  lngMax = UBound(arr)
 
   For i = lngMin To lngMax - 1
    For j = i + 1 To lngMax
     If arr(i) > arr(j) Then
       strTemp = arr(i)
       arr(i) = arr(j)
       arr(j) = strTemp
     End If
    Next j
   Next i
End Sub

Estructuras de control o Bucles en VBA

Las estructuras de control permiten la repetición de determinadas acciones.

Uno de los errores más comunes que se producen en la utilización de bucles de este tipo, es la no inicialización de las variables utilizadas como contadores de iteraciones, produciendo un error de no finalización del bucle.

Do… Loop Until

Esta estructura de control se puede usar para ejecutar un bloque de instrucciones un número indefinido de veces. Las instrucciones se repiten hasta que una condición llegue a ser True.

Ejemplo:

Sub Ejemplo1()
  Dim contador As Integer
  Dim numero As Integer
  numero = 9
  Do Until numero = 10
   If numero <= 0 Then Exit Do
     numero = numero – 1
     contador = contador + 1
  Loop
  MsgBox “Se alcanzó el valor ” & numero & ” ” & contador
End Sub

Do While… Loop

En este caso, las instrucciones se repiten mientras una condición sea True (al contrario que con el Do… Loop Until).

Ejemplo:

Sub Ejemplo2()
  Dim Escribir As Integer
  Escribir = 1
  Do While Escribir < 7
    ActiveCell.FormulaR1C1 = “Excel”
    lastrow = Cells(Rows.Count, 1).End(xlUp).Row
    Cells(lastrow, 1).Offset(1, 0).Select
    Escribir = Escribir + 1
  Loop
End Sub

While … Wend

El bucle WHILE…WEND sirve para realizar un tipo de bucle muy utilizado en programación que es el bucle Mientras, que se ejecuta mientras que se cumpla una condición.

Ejemplo

Sub Ejemplo3()
  dim a As Integer
  a = 0
  While (a < 13)
    a = a + 1
  End While
  MsgBox “Se alcanzó el valor ” & a 
End Sub

For… To… Next

El bucle FOR NEXT nos permite repetir una acción un número de veces dado.

Ejemplo:

En este ejemplo tenemos el bucle FOR NEXT en VBA más sencillo. El bucle cuenta de 1 a 10 y va poniendo en una columna el valor del contador.

Sub Ejemplo4()
  dim fila As Integer
  For CONTADOR = 1 To 10
    fila = CONTADOR
    Cells(fila, 1) = CONTADOR
  Next
End Sub

With

La estructura With en Vba nos permite ejecutar un conjunto de instrucciones sin tener que volver a hacer referencia al mismo objeto.

Sub Ejemplo5()
  With Cells(1, 1)
   .Value = “Hola informaticaea.com”
   .Font.Bold = True
  End With
End Sub

Condición en VBA

La estrucura básica de las condiciones en VBA es la siguiente

If condición Then
   'Acciones si se cumple la condición
Else
   'Acciones si no se cumple la condición
End if

Las instrucciones If…Then…Else se pueden presentar en varios formatos, con unas características determinadas. Normalmente, se presentan anidadas en tantos niveles como sea necesario, sin embargo, puede hacer menos legible el código, por lo que es aconsejable utilizar una instrucción Select Case en vez de recurrir a múltiples niveles de instrucciones If…Then…Else anidadas (únicamente en caso de que el excesivo número de anidamientos pudiera dar problemas en la legibilidad del programa, o errores en la depuración de éste).

Select Case mi_expresion
 Case mi_expresion_1
 'código para expresion_1
 Case mi_expresion_2
 'código para expresion_2
 '...
 Case mi_expresion_n
 'código para expresion_n
 Case Else
 'código para cuando no hay coincidencias
End Select

Problemas con las variables en VBA

Definir una variable

1
Dim NombreVariavle As TipoVariable

Con esto queda la variable perfectamente definida, si no se pusiera no ocurriría posiblemente nada, salvo que se utilizaría una mayor cantidad de memoria de la necesaria, al definirse instantáneamente en el momento de utilizarla como de tipo Value.

1
Option Explicit

Con esta aplicación, se avisaría en caso de no tener definida una variable, o en caso de utilizar datos de páginas diferentes a la activa.

En algunos casos nos podemos encontrar que trate la variable como un tipo que no nos interesa (tipo int cuando queremos que sea un tipo string) y de este modo forzamos a que no se produzca este error.

Las funciones de conversión se utilizan para cambiar el tipo de dato, de una expresión a fin de poder operar con ella.

Función Tipo Valor que devuelve la función
CBool Boolean Cualquier cadena o expresión numérica válida
CByte Byte 0 a 255
CCur Currency 922 337 203 685 477,5808 a 922 337 203 685 477,5807
CDate Date Cualquier expresión de fecha válida
CDbl Double -1.79769313486231E308 a -4,94065645841247E-324 para los valores negativos ; 4,94065645841247E-324 a 1,79769313486232E308 para los valores positivos
CDec Decimal +/-79 228 162 514 264 337 593 543 950 335 para los número sin décimales. El rango de numeros  para  28 décimales +/-7,9228162514264337593543950335. El número más pequeño es diferente de cero 0,0000000000000000000000000001
CInt Integer -32 768 a 32 767 , las fracciones se redondean. Las partes decimales se redondean a 0.5 y el número par más cercano
CLng Long 2 147 483 648 a 2 147 483 647 , las fracciones son redondeadas.  Las partes decimales se redondean a 0.5 y el número par más cercano
CSng Single -3,402823E38 a -1,401298E-45 para los valores negativos,  1,401298E-45 à 3,402823E38 para los valores positivos
CStr String Los valores devueltos por la función Cstr de la expresión dependiente
CVar Variant Mismo rango de valores para los números de tipo doble y el tipo de cadenas no númericas.

Ocultar pestañas excel con VBA

Para ocultar una pestaña determinada con VBA:

1
Sheets("Hoja3").Visible = False

Para mostrar la pestaña:

1
Sheets("Hoja3").Visible = True

Si queremos buscar si existe una hoja en un documento en concreto:

1
2
3
4
5
6
7
8
9
10
11
12
Function BuscarHoja(nombreHoja As String) As Boolean
 
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = nombreHoja Then
            BuscarHoja = True
            Exit Function
        End If
    Next
 
    BuscarHoja1 = False
 
End Function

En el caso de querer ocultar todas las hojas menos la “Hoja3”

1
2
3
4
5
6
7
For i = 1 To Worksheets.Count
        If Worksheets(i).Name = "Hoja3" Then
            Sheets("Hoja3").Visible = True
         Else
            Worksheets(i).Visible = False
        End If
    Next

Si queremos mostrar todas las pestañas ocultas:

1
2
3
For i = 1 To Worksheets.Count
        Worksheets(i).Visible = True
    Next

Eliminar filtros VBA

Para eliminar un filtro aplicado a la pestaña actual de excel con VBA:

1
2
3
    If ActiveSheet.AutoFilterMode = True Then
        ActiveSheet.AutoFilterMode = False
    End If

Para seleccionar una pestaña en concreto:

1
Sheets("Pestaña").Select