Visual Basic for Applications en MS Excel 1 Las Macros en MS Excel. ¿Para qué sirve una macro en Excel? Una macro nos ayuda a automatizar aquellas tareas que hacemos repetidamente. Una macro es una serie de instrucciones que son guardadas dentro de un archivo de Excel para poder ser ejecutadas cuando lo necesitemos. Las macros se escriben en un lenguaje de computadora especial que es conocido como Visual Basic for Applications (VBA). Este lenguaje permite acceder a prácticamente todas las funcionalidades de Excel y con ello también ampliar la funcionalidad del programa. 2 Visualizar la Ficha Programador en la Cinta de Opciones (1 de 2). Botón derecho en una zona en blanco de la cinta. 3 Visualizar la Ficha Programador en la Cinta de Opciones (2 de 2). 4 La Ficha programador y la Grabadora de Macros 5 Grabar y Ejecutar una Macro 6 Visualizar el Código de una Macro 7 Visualizar el Código de una Macro 8 Libro de Macros Personal C:\Usuarios\[Usuario]\AppData\Roaming\Microsoft\Excel\XLSTART 9 Libro de Macros Personal 10 Objetos, Propiedades y Métodos de VBA • Cada elemento de Excel es representado en VBA como un objeto. Por ejemplo, existe el objeto Workbook que representa a un libro de Excel. También existe el objeto Sheet que representa una hoja y el objeto Chart para un gráfico. • Cada uno de estos objetos tiene propiedades y métodos. Por ejemplo, el objeto Workbook tiene propiedades como ActiveSheet (Hoja activa), Name (Nombre), ReadOnly (Solo Lectura), Saved (Guardado) y algunos de sus métodos son Save (Guardar), Close (Cerrar), PrintOut (Imprimir), Protect (Proteger), Unprotect (Desproteger). 11 Objetos, Propiedades y Métodos de VBA 12 Objetos, Propiedades y Métodos de VBA Para acceder a las propiedades y métodos de un objeto lo hacemos a través de una nomenclatura especial. Justo después del nombre del objeto colocamos un punto seguido del nombre de la propiedad o del método. Observa este ejemplo donde hacemos uso de la propiedad Value para la celda A1: Range("A1").Value = "Hola" De esta manera asignamos una cadena de texto al valor de la celda A1. Ahora bien, si queremos borrar ese valor que acabamos de colocar en la celda podemos utilizar el método Clear de la siguiente manera: Range("A1").Clear Los objetos tienen muchas propiedades y métodos y a veces es difícil pensar que los llegaremos a memorizar todos por completo. Sin embargo, el Editor de Visual Basic es de gran ayuda porque justamente al momento de escribir nuestro código nos proporciona la lista completa de propiedades y métodos para un objeto. 13 Objetos, Propiedades y Métodos de VBA Para tener acceso a los objetos que están por debajo del objeto Application podemos utilizar el punto. El punto nos ayuda a navegar por la jerarquía hacia un nivel inferior. Observa lo que se muestra en el Editor de Visual Basic al colocar un punto después del objeto Application: Por ejemplo, si deseamos poner en negrita el texto de la celda A1 debemos llegar al objeto Range el cual nos dará acceso a modificar la propiedad Bold de la siguiente manera: 14 Objetos, Propiedades y Métodos de VBA Objetos predeterminados Existe una funcionalidad intrínseca de VBA conocida como objetos predeterminados la cual nos permite omitir la escritura de algunos objetos y aun así tener un código funcional. Por ejemplo, en la sentencia mostrada previamente podemos omitir el objeto Application y tener nuestro código funcionando correctamente: Inclusive podemos omitir los objetos ActiveWorkbook y ActiveSheet sabiendo que el código se ejecutará siempre sobre el libro activo y la hoja que esté activa al momento de la ejecución: 15 Objetos, Propiedades y Métodos de VBA 16 Eventos en VBA Algunos ejemplos de eventos en VBA son los siguientes: WorkbookOpen: El usuario abre un libro de Excel. WorkbookActivate: El usuario activa un libro de Excel. SelectionChange: El usuario cambia la selección de celdas en una hoja. Para descubrir los eventos que tiene un objeto es suficiente con abrir el Editor de Visual Basic y posteriormente el Examinador de objetos (F2). En el panel izquierdo se mostrarán los objetos y en el panel derecho las propiedades, métodos y eventos de dicho objeto. Podrás distinguir los eventos porque tienen un icono en forma de rayo (color amarillo): 17 Eventos en VBA 18 Editor VBA 19 Ejemplos VBA en Excel Cadenas de Texto 20 Ejemplos VBA en Excel Cadenas de Texto 21 Ejemplos VBA en Excel Cadenas de Texto 22 Ejemplos VBA en Excel Tabla de Multiplicar Sub TablaMultiplicar() Dim n, i As Integer Dim s As String Dim r As Range s = InputBox("Tabla de multiplicar del número: ", "Título") If s <> "" Then n = Val(s) ActiveSheet.Range("C2").Value = "Tabla de multiplicar del " & n Set r = ActiveSheet.Range("C4") For i = 0 To 10 r.Offset(i, 0).Value = i r.Offset(i, 1).Value = i * n Next i End If End Sub 23 Ejemplos VBA en Excel Tabla ASCII Sub Exercise() Dim Character As String Dim Number As Integer Number = 114 Character = Chr(Number) ActiveCell = "The ASCII character of " & Number & " is " & Character End Sub Sub Exercise() Dim Character As String Dim Number As Long Number = 358 Character = ChrW(Number) ActiveCell = "The ASCII character of " & Number & " is " & Character End Sub Sub Exercise() Dim Number As Integer Number = 28645 ActiveCell = Hex(Number) End Sub 24 Ejemplos VBA en Excel Extraer números de una celda 25 Ejemplos VBA en Excel Extraer números de una celda Function EXTRAENUM(cadena As String) 'Variable numeros contendrá solo números de la cadena Dim numeros As String numeros = "" 'Recorrer la cadena For i = 1 To Len(cadena) 'Evaluar SI el carácter actual es un número If IsNumeric(Mid(cadena, i, 1)) Then 'Concatenar valor numérico a la variable numeros numeros = numeros & Mid(cadena, i, 1) End If Next 'Devolver los números encontrados EXTRAENUM = numeros End Function 26 Ejemplos VBA en Excel Operaciones con Colores en Excel Function OBTENERCOLOR(celda As Range) As Long OBTENERCOLOR = celda.Interior.Color End Function 27 Ejemplos VBA en Excel Operaciones con Colores en Excel Function SUMARPORCOLOR(celdaColor As Range, rango As Range) 'Variable resultado almacena la suma total Dim resultado Dim celda As Range For Each celda In rango 'Compara la propiedad Interior.Color If celda.Interior.Color = celdaColor.Interior.Color Then resultado = resultado + celda.Value End If Next celda SUMARPORCOLOR = resultado End Function 28 Ejemplos VBA en Excel Operaciones con Colores en Excel Function CONTARPORCOLOR(celdaColor As Range, rango As Range) 'Variable resultado almacena la cuenta total Dim resultado Dim celda As Range For Each celda In rango 'Compara la propiedad Interior.Color If celda.Interior.Color = celdaColor.Interior.Color Then resultado = resultado + 1 End If Next celda CONTARPORCOLOR = resultado End Function 29 Ejemplos VBA en Excel Cómo crear hojas de Excel Worksheets.Add.Name = "Enero" Worksheets.Add (After:=Worksheets("Hoja2")).Name = "Febrero" Worksheets.Add (After:=Worksheets(Worksheets.Count)).Name = "Marzo" 30 Ejemplos VBA en Excel Macro para ordenar datos automáticamente en Excel clic derecho sobre el nombre de la hoja y seleccionar la opción Ver código Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then With Columns(1) .Sort key1:=.Cells(1, 1) End With End If End Sub 31 Ejemplos VBA en Excel Macro para ordenar datos automáticamente en Excel Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 Then With Range("A:B") .Sort key1:=.Cells(1, 2), Header:=xlYes End With End If End Sub 32 Ejemplos VBA en Excel Concatenar múltiples celdas =CONCATENAR(B2, "; ", B3, "; ", B4, "; ", B5, "; ", C2, "; ", C3, "; ", C4, "; ", D2, "; ", D3, "; ", D4, "; ", D5, "; ", E2, "; ", E3, "; ", E4) Function CONCATENARCELDAS(Rango As Range) 'Bucle para recorrer todas las celdas del rango For Each celda In Rango.Cells 'Si la celda NO está vacía, entonces concatenarla If celda.Value <> "" Then resultado = resultado & "; " & celda.Value End If Next celda 'Se remueve el ; y espacio inicial resultado = Right(resultado, Len(resultado) ‐ 2) CONCATENARCELDAS = resultado End Function 33 Ejemplos VBA en Excel Generar Valores Aleatorios sin Repetición =ALEATORIO.ENTRE(‐50, 50) Function AleatoriosUnicos(Inferior As Integer, Superior As Integer, Cantidad As Integer) As String Dim iArr As Variant Dim i As Integer Dim r As Integer Dim temp As Integer Application.Volatile ReDim iArr(Inferior To Superior) For i = Inferior To Superior iArr(i) = i Next i For i = Superior To Inferior + 1 Step ‐1 r = Int(Rnd() * (i ‐ Inferior + 1)) + Inferior temp = iArr(r) iArr(r) = iArr(i) iArr(i) = temp Next i For i = Inferior To Inferior + Cantidad ‐ 1 AleatoriosUnicos = AleatoriosUnicos & " " & iArr(i) Next i AleatoriosUnicos = Trim(AleatoriosUnicos) End Function Private Sub CommandButton1_Click() Range("B4").Value = AleatoriosUnicos(Range("B1").Value, Range("B2").Value, Range("B3").Value) End Sub 34 Private Sub CommandButton1_Click() Dim fila As Long Dim duplicados As Boolean Ejemplos VBA en Excel Formulario para completar una lista sin duplicados 'Obtener la fila disponible fila = Application.WorksheetFunction.CountA(Range("A:A")) + 1 duplicados = False 'Validar si se han ingresado datos duplicados For i = 1 To fila If Cells(i, 1).Value = UserForm1.TextBox1.Value Then If Cells(i, 2).Value = UserForm1.TextBox2.Value Then 'Se encontraron datos duplicados MsgBox "Datos duplicados en la fila " & i duplicados = True End If End If Next i UserForm1.Show If Not duplicados Then 'Insertar datos capturados Cells(fila, 1).Value = UserForm1.TextBox1.Value Cells(fila, 2).Value = UserForm1.TextBox2.Value 'Limpiar cajas de texto UserForm1.TextBox1.Value = "" UserForm1.TextBox2.Value = "" 'Notificar al usuario MsgBox "Datos insertados en la fila " & fila End If End Sub Unload Me 35 Ejemplos VBA en Excel Copiar valores únicos de un rango Sub ValoresUnicos() Dim listaOrigen As Range On Error Resume Next Set listaOrigen = Application.InputBox _ (Prompt:="Rango de datos origen:", Title:="Seleccionar rango", Type:=8) listaOrigen.AdvancedFilter _ Action:=xlFilterCopy, CopyToRange:=ActiveCell, Unique:=True Canceled: End Sub 36 Ejemplos VBA en Excel Contar apariciones de un valor en un rango Function APARICIONES(rango As Range, valor As Variant) As Integer contador = 0 'Recorrer todas las celdas del rango For Each celda In rango.Cells posicion = 1 nuevoStr = celda.Value 'Mientras la posición encontrada por InStr sea diferente a cero Do posicion = InStr(posicion, nuevoStr, valor, vbTextCompare) If (posicion = 0) Then Exit Do Else 'Aumentar contador de apariciones contador = contador + 1 'Cadena de texto restante nuevoStr = Mid(nuevoStr, posicion + Len(valor) + 1) End If Loop While posicion <> 0 Next APARICIONES = contador End Function 37 Sub ValorExiste() 'Definición de variables Dim rango As String Dim valor As String Dim resultado As Range Dim primerResultado As String Dim cont As Integer Ejemplos VBA en Excel Contar y marcar apariciones de un valor en un rango 'Solicitar información al usuario rango = InputBox("Ingresa el RANGO a buscar:") valor = InputBox("Ingresa el VALOR a buscar:") 'Inicializar contador de coincidencias cont = 0 'Primera búsqueda del valor dentro del rango Set resultado = Range(rango).Find(What:=valor, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ SearchFormat:=False) 'Si el resultado de la búsqueda no es vacío If Not resultado Is Nothing Then primerResultado = resultado.Address 'Inicia bucle para hacer varias búsquedas Do cont = cont + 1 'Cambia el color de fondo de la celda resultado.Interior.ColorIndex = 6 'Vuelve a buscar el valor Set resultado = Range(rango).FindNext(resultado) Loop While Not resultado Is Nothing And _ resultado.Address <> primerResultado End If 'Muestra un cuadro de diálogo con el número de coincidencias MsgBox "Se encontraron " & cont & " coincidencias." End Sub 38