Herramientas de usuario

Herramientas del sitio


visual_basic_office:principal

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
visual_basic_office:principal [2023/05/15 12:40] – creado albertovisual_basic_office:principal [2023/05/17 17:06] (actual) – [Manejo de errores] alberto
Línea 26: Línea 26:
   * ValueType   * ValueType
  
-===== Flujo de datos ===== +===== Estructuras de control ===== 
-==== Sentencia de control IF ====+==== Sentencia IF ====
 La sentencia //if// se declara de la sigiente manera: La sentencia //if// se declara de la sigiente manera:
 <code vbnet> <code vbnet>
Línea 40: Línea 40:
 End If End If
 </code> </code>
 +
 +
 +==== Sentencia Select Case ====
 +Evalúa una expresión una vez y ejecuta diferentes conjuntos de instrucciones en función de diferentes valores posibles:
 +<code vbnet>
 +Select Case expresionVerdadera
 +   Case resultadoA:
 +      ... Código ...
 +   case resultadoB To ResultadoN
 +      ... Código ...
 +   case resultadoC
 +      ... Código ...
 +   case Else
 +      ... Código ...
 +End Select
 +</code>
 +
 +==== 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:
 +<code vbnet>
 +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
 +</code>
 +
 +
 +===== Bucles =====
 +==== While ====
 +Ejecuta una serie de instrucciones siempre y cuando una condición dada sea verdadera:
 +<code vbnet>
 +While condicionVerdadera
 +    ... Código ...
 +End While
 +</code>
 +
 +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''.
 +<code vbnet>
 +Do While|Until condicion
 +    ... Código ...
 +Loop
 +</code>
 +
 +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.
 +<code vbnet>
 +For v_indice As tipoDato = valorInicial To valorFinal Step OpcionalPaso
 +    ... Código ...
 +Next
 +</code>
 +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. 
 +<code vbnet>
 +For each v_indice As tipoDato In matrizOcoleccion
 +    ... Código ...
 +Next
 +</code>
 +
 +===== 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:
 +<code vbnet>
 +' 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
 +
 +</code>
 +
 +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:
 +<code vbnet>
 +Dim nombreColeccion As New Collection
 +</code>
 +
 +Para añadir elementos a la colección, acceder a ellos o recuperarlos:
 +
 +<code vbnet>
 +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
 +
 +</code>
 +
 +
 +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 ===== ===== 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 ==== ==== Variables ====
 En Excel las variables se declaran como se vio en un principio. En Excel las variables se declaran como se vio en un principio.
Línea 54: Línea 190:
  
  
 +===== Word =====
 +==== Macros en Word ====
 +Para manejar datos de un documento Word, primero debemos crear una instancia del documento.
 +<code vbnet>
 +Dim doc As Document
 +Set doc = ActiveDocument
 +</code>
 +
 +==== Sentencias útiles ====
 +=== Extraer el número total de páginas de un documento ===
 +<code vbnet>
 +Dim doc As Document
 +Dim totalPaginas As Integer
 +
 +Set doc = ActiveDocument
 +totalPaginas = doc.ComputeStatistics(wdStatisticPages)
 +</code>
 +
 +=== Guardar un documento o parte de él en PDF ===
 +<code vbnet>
 +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
 +</code>
 +
 +
 +==== 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
 +<code vbnet>
 + On Error Resume Next
 +</code>
 +
 +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:
 +<code vbnet>
 + 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
 +</code>
 +
 +Para restablecer el manejo normal de errores, se utiliza la sentencia: 
 +<code vbnet>
 + On Error GoTo 0
 +</code>
 +
 +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"
 +<code vbnet>
 +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
 +</code>
  
 +Hay que tener en cuenta que hay que cerrar las instancias abiertas para prevenir problemas de memoria.
visual_basic_office/principal.1684147225.txt.gz · Última modificación: por alberto

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki