====== 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 [[https://learn.microsoft.com/es-es/dotnet/visual-basic/language-reference/statements/try-catch-finally-statement|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 [[https://learn.microsoft.com/es-es/dotnet/visual-basic/language-reference/statements/do-loop-statement|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 [[https://learn.microsoft.com/es-es/dotnet/visual-basic/programming-guide/language-features/arrays/|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 [[https://learn.microsoft.com/es-es/dotnet/visual-basic/programming-guide/concepts/collections|página oficial]], y [[https://learn.microsoft.com/es-es/dotnet/api/microsoft.visualbasic.collection?view=net-7.0|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 [[https://learn.microsoft.com/es-es/office/vba/language/reference/user-interface-help/dictionary-object|página oficial]].
===== Excel =====
==== Cheat Sheet ====
[[https://www.automateexcel.com/blockedfolder/AutomateExcel-VBA-Cheatsheet.pdf|Chuleta muy útil]] \\
==== 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.