¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Visual Basic Office
Variables
Para declarar una variable:
Dim miVariable as tipoVariable Dim miVariable1, miVariable2 As tipoVariable
Las variables en VBA pueden ser de tipo:
- Boolean: Valores True o False.
- Byte
- Char
- DateTime
- Decimal
- Double
- Integer
- Long
- Object
- Sbyte
- Short
- Single
- String
- UInteger
- ULong
- UShort
- ValueType
Estructuras de control
Sentencia IF
La sentencia if se declara de la sigiente manera:
If condicionVerdadera1 Then ... Código ... ElseIf condicionVerdadera2 Then ... Código ... ElseIf condicionVerdadera3 Then ... Código ... Else ... Código ... End If
Sentencia Select Case
Evalúa una expresión una vez y ejecuta diferentes conjuntos de instrucciones en función de diferentes valores posibles:
Select Case expresionVerdadera Case resultadoA: ... Código ... case resultadoB To ResultadoN ... Código ... case resultadoC ... Código ... case Else ... Código ... End Select
Sentencia de try Catch Finally
Proporciona un medio para controlar una parte o la totalidad de los posibles errores que pueden producirse en un bloque de código determinado, mientras se sigue ejecutando el código.
Puede tener una estructura bastante compleja, puede verse más información en la Página oficial.
Se puede considerar como estructura básica:
Try ... Código que puede producir el error ... Catch error As tipoError ... Código ejecutar, por ejemplo, mostrar el error y su tipo ... Finally ... Código que se ejecuta haya ocurrido o no un error ... End Try
Bucles
While
Ejecuta una serie de instrucciones siempre y cuando una condición dada sea verdadera:
While condicionVerdadera ... Código ... End While
Se pueden usar las sentencias Continue While para continuar con una iteración más del bucle sin continuar ejecutando el código restante, y Exit While para salir del bucle, aunque no se siga cumpliendo la condición.
Do
Repite un bloque de instrucciones mientras una condición es verdadera con la sentencia While, o hasta que se convierta en verdadera con la sentencia Until.
Do While|Until condicion ... Código ... Loop
Al igual que ocurre con While, se pueden usar las sentencias Continue Do para continuar con una iteración más del bucle sin continuar ejecutando el código restante, y Exit Do para salir del bucle, aunque no se respete la condición.
Puede tener una estructura más compleja, revisar la web oficial
For
Se usa para repetir un conjunto de instrucciones un determinado número de veces. Es posible declarar una variable que lleve la cuenta de las interacciones en el mismo bucle.
For v_indice As tipoDato = valorInicial To valorFinal Step OpcionalPaso ... Código ... Next
También se pueden usar las sentencias Continue For para continuar con una iteración más del bucle sin continuar ejecutando el código restante, y Exit For para salir del bucle, aunque no se respete la condición.
For each
Tipo especial de bucle For, que se usa para repetir un conjunto de instrucciones para cada elemento de una colección o matriz.
For each v_indice As tipoDato In matrizOcoleccion ... Código ... Next
Estructuras de datos
VBA tiene una gran cantidad de estructuras de datos.
Sólo se comentarán las más usadas para trabajar con documentos Excel o Word.
Matrices
Conjunto de valores, denominados elementos, que se agrupan en forma de tabla y están relacionados conceptualmente entre sí.\\Se pueden usar variables individuales para almacenar cada uno de estos elementos de datos.
Con las matrices se puede hacer referencia a estos valores relacionados usando el mismo nombre, así como utilizar un número denominado índice o subíndice para distinguir un elemento individual en función de su posición dentro de la matriz. Los índices de una matriz van de 0 a uno menos que el número total de elementos de la matriz.
Para trabajar con matrices:
' Diferentes formas de declarar matrices Dim nombreMatriz (n) As tipoElementos ' Esta matriz tiene una única fila de n elementos Dim nombreMatriz (numFilas, numColumnas) As tipoElementos Dim nombreMatriz = New tipoElementos(,) {{e1, e2, e3}, {e4, e5, e6}, {e7, e8, e9}} ' Se utiliza (,) cuando no se desea indicar el tamaño de la misma nombreMatriz (n) = valor ' Se asigna el valor al elemento n de la matriz
Las matrices puede ser declaradas, redimensionadas, accedidas o cambiadas de muchas formas. Más información de matrices en la página oficial.
Colecciones
Representa grupo de objetos similar a una matriz, pero en este caso pueden aumentar y reducirse de manera dinámica a medida que cambian las necesidades de la aplicación. Para algunas colecciones, de puede asignar una clave a cualquier objeto para recuperar rápidamente el objeto con la clave.
En VBA se le denomina colecciones a diferentes estructuras de datos similares (colecciones, listas, diccionarios). Nosotros en este caso, nos referimos siempre al tipo “colecciones”.
Las colecciones son un conjunto ordenado de elementos, accesibles mediante un índice numérico o una clave String. Puede agregar elementos especificando o sin especificar clave. Si agrega un elemento sin clave, debe usar su índice numérico para tener acceso a dicho elemento. El primer elemento de una colección tiene un índice de 1.
Las Colecciones son objetos, y por lo tanto hay que declararlas como tal:
Dim nombreColeccion As New Collection
Para añadir elementos a la colección, acceder a ellos o recuperarlos:
nombreColeccion.Add valorNuevo ' Añadimos un nuevo valor nombreColeccion.Add valorNuevo, clave ' Añadimos un nuevo par valor - clave miVariable = nombreColeccion(indice) ' Recuperamos un valor de la colección especificando un índice miVariable = nombreColeccion("clave") ' Recuperamos un valor de la colección especificando la clave
Más información de Colecciones (generales) en la página oficial, y aquí para la clase Collection.
Diccionarios
Son colecciones del tipo Dictionary, muy similares a las colecciones, ya que se representa una colección de pares valor - clave.
Recuperar un valor usando su clave es muy rápido porque la clase Dictionary se implementa como una tabla hash.
Para trabajar con diccionarios, se procede exactamente igual que con las colecciones, pero cambiando el literal Collection por Dictionary o Scripting.Dictionary cuando son creados.
Más información en la página oficial.
Excel
Cheat Sheet
Conceptos generales
Para trabajar con Excel, debemos tener presente que entodo momento debemos saber con qué Celda o conjunto de celdas estamos trabajando, qué celda está activa (seleccionada) y qué hoja está activa (seleccionada).
Variables
En Excel las variables se declaran como se vio en un principio. Los tipos de datos más usados son:
- Boolean
- Integer
- Long
- Double
- DateTime
- String
- Variant: Si no especifica un tipo de datos al declarar una variable o no declara una variable en absoluto, Visual Basic especifica automáticamente el tipo de datos variant para esta variable.
Word
Macros en Word
Para manejar datos de un documento Word, primero debemos crear una instancia del documento.
Dim doc As Document Set doc = ActiveDocument
Sentencias útiles
Extraer el número total de páginas de un documento
Dim doc As Document Dim totalPaginas As Integer Set doc = ActiveDocument totalPaginas = doc.ComputeStatistics(wdStatisticPages)
Guardar un documento o parte de él en PDF
Dim doc As Document Dim nombreArchivo As String Dim ruta As String Dim totalPaginas As Integer Set doc = ActiveDocument nombreArchivo = "mi_documento.pdf" ruta = "C:\OneDrive\Documentos\" totalPaginas = doc.ComputeStatistics(wdStatisticPages) ' En este caso se guardarán todas las páginas doc.ExportAsFixedFormat OutputFilename:=ruta & nombreArchivo, ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:=wdExportFromTo, From:=1, To:=totalPaginas, Item:=wdExportDocumentContent
Manejo de errores
En ocasiones es necesario evitar que se detenga la ejecución del programa si se detecta un error.
Para ello usamos la sentencia
On Error Resume Next
De modo que si se produce un error a continuación,la ejecución del programa continúa, y podremos manejar este error con la sentencia:
If Err.Number <> 0 Then ' Si es 0 es que no se ha producido error. También podría ponerse "= 'nº error' " Set ExcelApp = CreateObject("Excel.Application") End If
Para restablecer el manejo normal de errores, se utiliza la sentencia:
On Error GoTo 0
En el siguiente apartado se puede ver un ejemplo práctico al instanciar en Word elementos Excel.
Trabajar con Excel desde Word
Para trabajar con un Documento Excel desde Word, primero hay que fijar las instancias de los objetos de Excel con la que se va a trabajar.
Si no está abierto Excel, se producirá un error. En el siguiente código evitamos que se detenga la ejecución del programa por este motivo, de modo que si éste ocurre, se cree una nueva instancia. Se volverá a retomar el manejo normal de errores a partir de la sentencia “On Error GoTo 0”
Function LeerValorCeldaExcel(ByVal RutaArchivo As String, ByVal NombreHoja As String, ByVal Fila As Integer) As Variant Dim ExcelApp As Object Dim ExcelLibro As Object Dim ExcelHoja As Object Dim ValorCelda As Variant On Error Resume Next ' Crea una instancia de Excel Set ExcelApp = GetObject(, "Excel.Application") ' Si Excel no está abierto, crea una nueva instancia de Excel If Err.Number <> 0 Then Set ExcelApp = CreateObject("Excel.Application") End If On Error GoTo 0 ' Abre el archivo de Excel Set ExcelLibro = ExcelApp.Workbooks.Open(RutaArchivo) ' Selecciona la hoja especificada Set ExcelHoja = ExcelLibro.Worksheets(NombreHoja) ' Lee el valor de la celda en la primera columna y la fila especificada ValorCelda = ExcelHoja.Cells(Fila, 1).Value ' En este caso se lee el valor de una Celda que se va a devolver, pero el programa puede hacer cualquier otra cosa ' Cierra el archivo de Excel sin guardar cambios ExcelLibro.Close False ' Libera los objetos de Excel Set ExcelHoja = Nothing Set ExcelLibro = Nothing ExcelApp.Quit Set ExcelApp = Nothing ' Devuelve el valor de la celda LeerValorCeldaExcel = ValorCelda End Function
Hay que tener en cuenta que hay que cerrar las instancias abiertas para prevenir problemas de memoria.
