miércoles, 8 de enero de 2025
domingo, 10 de noviembre de 2024
sábado, 19 de octubre de 2024
miércoles, 7 de agosto de 2024
miércoles, 24 de julio de 2024
lunes, 22 de julio de 2024
martes, 16 de julio de 2024
lunes, 15 de julio de 2024
domingo, 14 de julio de 2024
domingo, 3 de marzo de 2024
¿Es verdad que ya no podremos usar macros en Outlook?
¿Es verdad que ya no podremos usar macros en Outlook?
¡Saludos!
Abraham Valencia
Lima, Perú
domingo, 18 de febrero de 2024
¿Sabes que puedes grabar macros (VBA) y scripts (TypeScript) prácticamente al mismo tiempo?
¿Sabes que puedes grabar macros (VBA) y scripts (TypeScript) prácticamente al mismo tiempo?
¡Saludos!
Abraham Valencia
Lima, Perú
martes, 30 de enero de 2024
Conectando Excel a bases de datos: 8- Conectando Excel-Excel usando VBA, ADO y SQL. Rangos dinámicos
Conectando Excel a bases de datos: 8- Conectando Excel-Excel usando VBA, ADO y SQL. Rangos dinámicos
¡Saludos!
Abraham Valencia
Lima, Perú
lunes, 22 de enero de 2024
Conectando Excel a bases de datos: 7- Conectando Excel con Excel usando VBA, ADO y SQL
Conectando Excel a bases de datos: 7- Conectando Excel con Excel usando VBA, ADO y SQL
¡Saludos!
Abraham Valencia
Lima, Perú
sábado, 13 de enero de 2024
Consejos de VBA: 1- Saber si un archivo existe (DIR)
Consejos de VBA: 1- Saber si un archivo existe (DIR)
¡Saludos!
Abraham Valencia
Lima, Perú
viernes, 14 de julio de 2023
Conectando ChatGPT con VBA y Excel
Conectando ChatGPT con VBA y Excel
¡Saludos!
Abraham Valencia
Lima, Perú
domingo, 11 de septiembre de 2022
Excel y Access (IV): El uso de las fechas con WHERE y Between (SQL)
Tal y como comenté hace algunas semanas, hoy continuamos con SQL y Where, aplicado a fechas para importar datos a Excel desde Access. El archivo de ejemplo seguirá siendo el mismo que adjunté en el segundo artículo de esta serie, solo entren al enlace y descárguenlo: Enlace.
Lo primero es comentarle que cuando de fechas se trata, casi siempre hay complicaciones debido a que no es que todos los países usen el mismo tipo de formato; por ejemplo, en Perú el usado habitualmente es “dd/mm/yyyy” (entiéndase el “yyyy” como “aaaa”) pero en EE. UU. usan “mm/dd/yyyy”. Entonces, cuando usamos SQL ¿Cuál es el formato ideal? Pues sin duda yo les diría que es el siguiente: “yyyy-mm-dd” ¿Por qué? Porque SQL usa los estándares de la norma ISO 8601y respecto a fechas es la que les menciono. Entonces, por decirlo de un modo, con ese formato de fecha, no hay pierde.
Yendo al primer ejemplo, si queremos los datos de aquellas personas cuya fecha de nacimiento es menor al 01 de enero de 1978, basta colocar la sentencia de este modo:
sql = "SELECT * FROM Vendedores Where Nacimiento < #1978/01/01#"
Si se dan cuenta, coloqué la fecha en el formato que les mencioné previamente y he rodeado dicha fecha de almohadillas (#), eso último es importante para que el valor enviado se reconozca justamente como fecha. En nuestra hoja tendremos esto:
Ahora vamos más bien a obtener las fechas que son mayores al 01 de enero de 1978, es decir, aquellas posteriores. Basta cambiar el signo menor (<) por el signo mayor (>).
sql = "SELECT * FROM Vendedores Where Nacimiento > #1978/01/01#"
En esta ocasión tendremos esto en la hoja:
No olviden que también se puede usar el signo igual (=) junto con mayor o menor para tomar en cuenta la fecha que se usa en el criterio. Pero ¿qué pasas si lo que queremos obtener son los registros en un rango determinado de fechas? No hay problema, para eso tenemos a Between que es un operador que permite seleccionar valores entre un rango de datos, justamente. Between funciona del siguiente modo:
sql = "SELECT * FROM Vendedores Where Nacimiento BetWeen #1970-01-01# And #1979-12-01#"
Para ese caso, estamos seleccionado las fechas entre el 01 de enero de 1970 y el 01 de diciembre de 1979. Al correr la macro este será el resultado:
Ojo con el uso del “And” y que la fecha inicial siempre va primero. Si quieren ir un poquito más allá y ordenar por fecha de naciemiento, basta agregar la cláusula “Order By” que justaente ordena los registros de una consulta de forma ascendente (por defecto) o descendente. Si queremos agregar eso, se hace de la siguiente forma:
sql = "SELECT * FROM Vendedores Where Nacimiento BetWeen #1970-01-01# And #1979-12-01# Order by Nacimiento"
Si queremos los datos de forma descendente, basta agregar lo siguiente:
sql = "SELECT * FROM Vendedores Where Nacimiento BetWeen #1970-01-01# And #1979-12-01# Order by Nacimiento Desc"
No olviden tomar muy en cuenta que, después de la clausula Order By se agrega el nombre del campo por le cual se quiere ordenar y, de ser necesario, se agrega el “Asc” o “Desc” antes del nombre del campo. Amigos/as, en esta ocasión vamos a llegar hasta ahí, en el próximo artículo usaremos variables y datos de celdas para construir nuestra cadena SQL, así como seleccionaremos solo algunos de los campos de la tabla del archivo Access.
¡Hasta la próxima!
Abraham Valencia
Lima, Perú
miércoles, 10 de agosto de 2022
Entrevista a Benito Moreira Estévez: Complemento (add-in) MAccessExcel
Entrevista a Benito Moreira Estévez (España) para presentar su complemento (add-in) llamado "MAccessExcel", que ha elaborado y puesto al servicio de la comunidad de Excel. Acompáñennos y conozcan el interesante aporte que permite extraer datos desde Access y muchas otras cosas. ¡No se la pierdan!
Un abrazo a todos y todas.
Abraham Valencia
Lima, Perú
lunes, 25 de julio de 2022
Excel y Access (II): Nuestro primer RecordSet. Extrayendo datos de Access
Hoy vamos con la segunda parte de como trabajar en Access desde Excel. Como ya se explicó la forma de lograr una conexión a Access desde Excel (Enlace), esta vez iremos un paso más allá, es decir, vamos a extraer datos de Access.
Como en esta ocasión vamos a comenzar con algo relativamente simple, supondremos que en nuestra base de datos solo tenemos una tabla con cinco campos.
Para extraer los datos vamos a usar un RecordSet. El objeto RecordSet de ADO se utiliza para mantener un conjunto de registros de una tabla de base de datos. Es importante aclarar que dicho objeto puede manejarse con dos métodos, Execute y Open del Recordset, ambos tienen tiene sus pros y/o sus contras; yo creo que es relativamente complicado decir cuál es mejor que el otro y diría, a su vez, que lo que hay que saber es cuándo es mejor usar un método u otro. Por ejemplo, para el caso de solo eliminar registros yo me inclinaría por Execute, pero para manejar algunas propiedades del RecordSet y sus datos, es mejor Open. A lo largo de estos artículos trataré, en lo posible, de poner ambos y/o si uso solo uno, aclarar porque es el método elegido e igual queda como tarea de ustedes leer más sobre dichos temas.
Volviendo a lo nuestro, como se supone que ya sabemos cómo lograr la conexión, vamos a ver lo del RecordSet. Declaramos la variable adecuada y creamos el objeto RecordSet del siguiente modo:
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
Como se dijo antes, para manipular, extraer, modificar, etc., los datos, también vamos a usar SQL y como las sentencias de dichos lenguajes se mandan como texto, vamos a crear una variable del tipo String para ello.
Dim SQL as String
Como en esta ocasión supondremos que queremos todos los registros de la única tabla, usamos las sentencias respectivas: Select, para seleccionar los campos, usamos asterisco (*) para indicar que son todos los campos los que nos interesan, From para seleccionar la tabla, y por último el nombre de la tabla.
SQL = “Select * From Vendedores”
Como ya está creado el RecordSet y tenemos la sentencia SQL requerida, solo falta abrir dicho objeto con los datos.
rst.Open Sql, cnn
No olvidar que cnn es la variable de la conexión que usamos en el artículo anterior. Por cierto, aquí estamos yendo al grano, si quieren profundizar más en los RecorsSet, verán que hay algunas propiedades del método Open que podrían usar, de ser necesario.
Finalmente, en el entendido que necesitamos todos los datos y no solo algunos y/o recorrer por algún motivo todos los registros, pegamos directamente los registros a la hoja con una sola instrucción, el método CopyFromRecordset.
Range("A2").CopyFromRecordset rst
Si todo estuvo bien, en su hoja tendrán lo siguiente:
Ah, como ven, no están los nombres de los campos, pero eso lo dejaremos para la siguiente vez. Por cierto, todo junto se vería así:
Option Explicit 'Todo Sobre Excel 'Abraham Valencia 'https://abrahamexcel.blogspot.com/ 'https://www.facebook.com/TodosobreExcelAV/ 'https://twitter.com/Todosobre_Excel 'https://www.youtube.com/channel/UCxEe3aA5uGrtYDdboBT_ptg 'Lima, Perú 'Julio del 2022 Sub MiPrimerRecordSet() Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim sql As String Set cnn = New ADODB.Connection Set rst = New ADODB.Recordset With cnn .Provider = "Microsoft.ACE.OLEDB.12.0" .ConnectionString = "data source=" & ThisWorkbook.Path & "\Ejemplo.accdb" .Open End With sql = "Select * From Vendedores" rst.Open sql, cnn Range("A2").CopyFromRecordset rst 'Cerrar el RecordSet y la conexión no necesariamente es obligatorio rst.Close cnn.Close 'Como les he dicho varias veces, vaciar las variables no es obligatorio, pero lo pongo para conocimiento sql = vbNullString Set rst = Nothing Set cnn = Nothing End Sub
Para conocimiento, una forma corta de lograr lo mismo sería esta:
With CreateObject("ADODB.Recordset") .Open "Select * From Vendedores", _ " Data Source=" & ThisWorkbook.Path & "\Ejemplo.accdb;Provider=Microsoft.ACE.OLEDB.12.0" Range("A2").CopyFromRecordset .DataSource End With
Y eso es todo por hoy, espero les haya gustado. Esta historia continuará.
Abraham Valencia
Lima, Perú
Descargue el ejemplo aquí: Enlace
lunes, 20 de junio de 2022
El futuro del VBA de Excel
¿Cuál es el futuro del VBA de Excel? La semana pasada conversamos ese tema con grandes amigos, así que los/as invito a ver dicha interesante conversación y opinar sobre ello.
Un abrazo a todos y todas.
Abraham Valencia
Lima, Perú
domingo, 29 de mayo de 2022
Excel e historia (III): El Visual Basic for Applications (VBA) de Excel
En 1993 Microsoft lanza la versión 5.0 de Excel (arquitectura BIFF5); probablemente el primer gran cambo que incluye dicha versión es que los archivos podían tener varias hojas (libros), pero definitivamente el mayor cambio y que probablemente fue el de mayor impacto en Excel hasta el día de hoy fue la aparición de Visual Basic for Application (VBA).
En los años noventa, personal de Microsoft manifestaba que una de las primeras ideas que tuvieron como logro la inclusión de VBA, fue la necesidad de unificar el código usado entre las aplicaciones de Office. Recordemos que en aquel entonces se usaban las Macros 4.0 en Excel, así como AccessBASIC y WordBASIC, para Access y Word respectivamente.
Siempre se ha dicho que, ante el éxito de Visual Basic (VB) en aquel entonces, se decidió mantener con VBA la analogía al lenguaje Basic en general, pero manteniendo ciertas características semejantes al VB.
Esta primera versión de VBA (1.0) que aparece en Excel se programa en módulos que también se veían como pestañas (hojas) del libro, aunque de forma predeterminada llevaban le nombre “Módulo”.
El código VBA se escribía en dicho módulo, muy parecido, por no decir casi igual, a como se hace hoy en día. Claro, con la diferencia que no era un entorno propio de programación.
Imagen tomada de internet
Con esta primera versión la Grabadora de Macros funciona para VBA, claro que con la particularidad que aún podía usarse para también grabar Macros 4.0.
Imagen tomada de internet
Esta versión también incluyo los Diálogos, conocidos hoy como los Diálogos de Excel 5.0, que eran formularios con objetos que podían usarse con VBA y de los que hablaré próximamente.
Al año siguiente (1994) Microsoft incluye VBA 1.0 en Project. En 1995 se lanza Excel 95 (7.0) que sigue incluyendo VBA (1.0) pero retiran la opción para grabar Macros 4.0. En Access también se incluye VBA, pero es una versión mejorada, la 2.0, reemplazando a AccessBasic, lo que es muy aceptado por los usuarios de dicho programa. Durante ese tiempo se siguen implementando cambios en VBA e incluso la que hubiese podido ser la versión 3.0 es incluida como elemento de VB 4.0 en 1996. Ese mismo año se termina la versión 4.0 de VBA, la que está elaborada en C ++ y convierte dicho lenguaje en uno orientado a objetos. Dicha versión se incluye en Word reemplazando a WordBasic.
El cambio radical de VBA llegó con su versión 5.0, la cual es incluida en todos los productos de Office que se lanzan con Office 97 (8.0), excepto en Outlook. Asimismo, se deja de lado la programación en hojas y VBA pasa a tener su propio editor del lenguaje (Editor de Visual Basic – VBE). Otro cambio radical es la inclusión de los Userform de VBA, dejando de lado, en la práctica, los Diálogos anteriores. Estas versiones de Excel y VBA aumentan considerablemente la cantidad de eventos de los objetos, se introducen los objetos ActiveX y la Ayuda del VBA es mejorada bastante.
Imagen tomada de internet
Con Excel 2000 (9.0) llega VBA 6.0 que, si bien no introdujo cambios drásticos, sí permitió que los Userform sean también no modales y adaptó secuencias para la manipulación de algunas otras herramientas de Excel como por ejemplo los Gráficos Dinámicos. Con las actualizaciones de dicho programa llegó VBA 6.1 y VBA 6.2 aparece con Office 2000 SR-1. Excel 2002 – XP (10.0) llegó también con VBA 6.2, con algunos mínimos cambios relacionados a la nueva interfaz de Office y algunas herramientas nuevas de Excel. VBA 6.3 llegó con las actualizaciones de Office para esta versión XP. Excel 2003 (11.0) llegó con VBA 6.4 y con sus actualizaciones llegó VBA 6.5. Por aquellos años Microsoft anuncia que no habría versiones nuevas de VBA.
Con la llegada de Excel 2007 (12.0) y su nuevo entorno tipo NET, dejando prácticamente de lado COM, se incluyó VBA 6.5, con lo que parecía Microsoft cumplía con ese comunicado años antes sobre que no habría nuevas versiones de VBA. Eso sí, Microsoft eliminó la compatibilidad con VBA para Excel 2008 para Mac, aunque por presión de los usuarios tuvo que restaurarlo Excel para Mac 2011. En paralelo Microsoft informó que no tenía planes de eliminar VBA de la versión de Windows de Office, aunque la campaña para usar Visual Studio Tools for Office (VSTO) parecía encaminada a que se deje de lado VBA.
Excel 2010 (14.0) incluyó VBA 7.0, a pesar del anuncio de Microsoft unos años antes, aunque no hay nuevas características en dicha versión a comparación de la versión anterior 6.5. Eso sí, incluye tipos de datos de puntero como LongPtr para adaptarse a la nueva arquitectura implementada por Microsoft en Office, ya que salen al mercado tanto Office de 32 bits como de 64 bits a partir de dicha versión 2010. He de comentar que el Excel de 64 bits hizo que se pierda compatibilidad con muchos objetos ActiveX de 32 bits que los usuarios se habían acostumbrado a usar como el DateTimePicker (DtPicker), por mencionar uno (aunque hay trucos para usar algunos para algunas versiones de Excel de 64 bits bajo Windows de 32 bits y cosas así, pero no es tema de hoy).
La última versión de VBA que existe es la 7.1 que se lanza junto a Excel 2013 (15.0) y que es la que se sigue incluyendo en todas las versiones posteriores de Excel (2016, 2019, 2021, 365 – 16.0). Dicha versión básicamente, similar a las anteriores, es para adaptarse a las nuevas herramientas usadas en Excel.
Para terminar, con la aparición de las herramientas BI nuevamente comienzan los rumores sobre la desaparición de VBA, lo que se incrementa los últimos años con la aparición de Office Scripts y TypeScript en Excel (aunque solo vienen con Office 365 Empresa y algunas ediciones de Educación – 3 y 5), así como la fuerte recomendación sobre el uso de complementos para Excel hechos con Python. A pesar de ello, yo creo que tenemos VBA para buen rato. Hasta la próxima.
Abraham Valencia
Lima, Perú