domingo, 31 de julio de 2022

Automatizando Excel con VSTO ¿Quieres tú aprenderlo?

Hoy en día nuevamente entra en boga el tema de proteger nuestras macros y, ante las nuevas formas que van apareciendo para automatizar Excel, VSTO parece volver a presentarse como alternativa que impide se pueda copiar dichos códigos y a la vez seguir automatizando las tareas de Excel, entonces ¿Es importante aprender otros lenguajes, a ti te gustaría conocer más sobre ellos? En este video les dejo algunos detalles del uso y ventajas del VSTO, pero sobre todo creo dejo algunas preguntas abiertas para el debate. Espero les guste y comenten..

Un abrazo a todos y todas.

Abraham Valencia
Lima, Perú

miércoles, 27 de julio de 2022

Excel e historia (VI): Las desconocidas funciones "THAI"

Debe haber sido entre los años 2005 y 2006, cuando más y más gente usaba Excel 2002 (XP) y/o Excel 2003 cuando en varios foros preguntaban sobre cómo lograr que una función que muchos tenían para convertir números en letras pudiese usarse también para convertirlas en letras, pero en castellano, ya que aquella solo lo hacía en tailandés. Por si alguien aún no sabe de que función estoy hablando, pues me refiero a TEXTOBAHT (BAHTTEXT).

¿Qué hace dicha función exactamente? Pues convierte el número que se le pasa en el único argumento que tiene y lo convierte en letras en idioma tailandés y con el sufijo “baht” (también en tailandés) que es la moneda de Tailandia (Thailand).

=TEXTOBATH(100)

หนึ่งร้อยบาทถ้วน

Antes de seguir hablando de dicha función, vamos a recordar algunas cosas. Microsoft, a partir de Excel 4.0 (1992) comienza a lanzar al mercado versión en distintos idiomas y ya no solo en inglés, además de eso, a partir de Excel 97 en algunos paquetes incluye funciones que solo son compatibles con las versiones de Excel de ciertos idiomas. TEXTOBATH es una de ellas. Dicha función fue incluida en Excel 97, pero solo para la versión Thai. Fue recién con Excel 2002 (XP) que se incluyó en las versiones de distintos idiomas y es compatible con esa y con todas las futuras versiones, incluyendo Excel 2021 y Excel 365. Dicha función está documentada en la ayuda de Excel de versiones de inicio de este siglo, así como en la web de funciones que Microsoft mantiene actualizada (Enlace). A diferencia de SIFECHA (Enlace), esta función no está “oculta” y puede ser encontrada y usada con la herramienta “Insertar función” de Excel.

Pero ¿Por qué menciono una función oculta cuando hablo de TEXTOBATH? Pues, cuando se incluyó dicha función en Excel 97 Thai, pues, no vino sola; junto a dicha función vinieron diez funciones más para usarse en lo que se llaman las “funciones Thai” ¿Cuáles son estas? Pues son: AÑOTAI, CADENANUMTAI, DIASEMTAI, DIGITOTAI, ESDIGITOTAI, LONGCADENATAI, MESAÑOTAI, REDONDEAR.BAHT.MAS, REDONDEAR.BAHT.MENOS y SONNUMTAI. Todas estas funciones están disponibles en las versiones de Excel a partir de la 2002, tal como TEXTOBATH, pero Excel no da ayuda sobre ellas ni pueden usarse desde la herramienta “Insertar función”. Si uno coloca alguna de esas funciones Excel te la admite y hasta te mostrará el tipo de argumento a usarse, pero nada más y por eso para muchos/as es una de las tantas funciones “ocultas”.

Eso sí, para que dichas funciones actúen correctamente, hay que hacer algunos cambios de idioma/región en Office y/o en tu sistema operativo, pero ya eso es tarea para quien quiera experimentar mucho más. Por cierto, en internet hay muy poca información respecto a dichas funciones, lo que supongo es parte de que tan pocas personas las conozcan, aunque ahora ya todos/as los que lean esto las conocerán. ¿Por qué priorizó Microsoft el tailandés para algunas funciones? Por años se dijo que parte del equipo de desarrollo de Excel de mediados de los años noventa, del siglo pasado, era afín a la comida tailandesa, pero al parece en realidad fue solo iniciativa del equipo de Excel encargado de desarrollar las versiones compatibles con idiomas del este asiático, forma de trabajo que por cierto se dejó de lado hace muchos años, siendo mucho más en conjunto el desarrollo actual. Eso es todo por hoy ¡Hasta la próxima!

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

miércoles, 20 de julio de 2022

"Desarmando" íconos de Excel (Office 365)

Hoy vamos a ver como "desarmar" algunos íconos de Excel que usamos en nuestras hojas y así obtener más objetos de ello.

Un abrazo a todos y todas.

Abraham Valencia
Lima, Perú

lunes, 11 de julio de 2022

Excel y Access (I): Realizando nuestra primera conexión a un archivo Access

En muchas ocasiones, y durante años, he leído/visto preguntas relacionadas a cómo usar datos almacenados en Access, pero a través de Excel, así que hoy comenzaremos a ver cómo se hace eso paso a paso.

Lo primero es comentar que usaremos ADO para lo mencionado. Por si aún no saben lo que es ADO, son las iniciales de ActiveX Data Objects, que es un mecanismo para comunicarse con bases de datos y así poder trabajar con sus datos. Una de las ventajas es su compatibilidad con VBA y, además, permite conexiones con Access. También vamos a usar los Recordset, que son estructuras de datos cuya utilidad es la de almacenar información desde una tabla. Por último, para el manejo de datos usaremos SQL (por sus siglas en inglés Structured Query Language), que es un lenguaje de consulta estructurada que sirve para administrar y recuperar información de sistemas de gestión de bases de datos relacionales. Ojo, hay otras formas de hacer conexiones o utilizar otras propiedades y/o formas de manipular registros, pero yo prefiero las recomendadas y que usaré ahora. Ah, si bien ya he colocado ejemplos de todo esto en el blog e incluso he publicado un par de artículos sobre conexiones de Excel con MySQL, lo que haré a partir de hoy con Access será mucho más secuencial, estructurado y detallado a través de más de un artículo; de ese modo incluso podrían aplicarlo a otros tipos de bases de datos.

Ahora sí, regresando a Excel y Access, en esta ocasión, por ser la primera, básicamente vamos a establecer la conexión a una base de datos de Access, para eso lo que haremos ahora es activar la referencia a “Microsoft ActiveX Data Object 6.1 Library”, en donde el 6.1 puede variar dependiendo de tu versión de Office y/o la librería que desees usar.

Lo primero que haremos será declarar la variable (de objeto) que usaremos para la conexión:

Dim cnn As ADODB.Connection

Luego daremos valor a esa variable asignándole una conexión:

Set cnn = New ADODB.Connection

Del objeto conexión de ADO, lo que nos interesa son dos propiedades y un método: ConnectionString, Provider y Open, respectivamente (para ver otras puede entrar aquí: Enlace).

Cuando hablamos de Provider o proveedor, hacemos referencia a un conjunto de bibliotecas que se utiliza para comunicarse con una fuente de datos. En este caso vamos a usar un archivo Access del tipo *.accdb llamado "Ejemplo", por lo que necesitaremos tener el instalado “Microsoft.ACE.OLEDB.12.0”. Si de casualidad no lo tienen, pueden descargarlo de aquí: Enlace. A la propiedad Provider vamos a darle justamente dicho valor.

Para la propiedad ConnectionString podemos fácilmente recurrir a esta web para adaptar a nuestra necesidad: Enlace.

En el caso de método Open, basta llamarlo para establecer la conexión con el origen de datos.

Entonces, dicho eso, y en el supuesto que vamos a trabajar con el archivo Excel en la misma carpeta que nuestro archivo Access, esta parte quedaría así:

With cnn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "data source=" & ThisWorkbook.Path & "\Ejemplo.accdb"
    .Open
End With

La cantidad de líneas incluso podrían ser menos, pero eso ya queda como tarea para ustedes ya que ko importante hoy es aprender y que se entienda todo.

Podríamos tener todo junto de este modo:

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 MiPrimeraConexion()

Dim cnn As ADODB.Connection

Set cnn = New ADODB.Connection

With cnn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "data source=" & ThisWorkbook.Path & "\Ejemplo.accdb"
    .Open
End With

MsgBox "Conexión realizada con exito", vbOKOnly, "Todo Sobre Excel"

cnn.Close 'Esto cierra la conexión pero no es obligatorio ponerlo para este caso

Set cnn = Nothing 'Esto descarga la variable, pero en realidad el End Sub también lo hace
 
End Sub

Entonces amigos y amigas, hoy hemos aprendido a conectar, sé que probablemente estén con ansiedad de seguir, pero vamos paso a paso, aspí que eso es todo por hoy. Hasta la próxima!

Abraham Valencia
Lima, Perú

viernes, 8 de julio de 2022

Mis redes favoritas de Excel (I) #TIPSTSE3

Hoy quiero recomendar algunas redes de Excel, parte de mis favoritas, sobre todo de gente que considero mis amigos/as. Vean y entérense de foros, grupos de Facebook, blog y canales de Excel.

Un abrazo a todos y todas.

Abraham Valencia
Lima, Perú

lunes, 4 de julio de 2022

Excel e historia (V): La función "oculta" SIFECHA

Quiero comenzar diciéndoles que, tal como se lee en el título, hoy vamos a hablar un poco de la historia de Excel y SIFECHA; si ustedes lo que desean es ver cómo funciona dicha función, miren por aquí: Enlace. Eso sí, Antes de pasar a hablar de la función SIFECHA por si misma, vamos a recordar a algunas cosas sobre Excel y sus funciones ya que incluso quizá haya personas que no saben lo que pasaré a narrar.

Para crear Excel, Microsoft se basó en su programa Multiplan, primera hoja de cálculo desarrollada por Microsoft, en 1982, y que no había podido superar a Lotus 1-2-3 en posicionamiento y ventas. El 30 de septiembre de 1985, Microsoft puso en venta la primera versión de Excel (1.0) para las Macintosh (MAC) de Apple; esta versión de Excel mantenía funciones que ya se usaban en Multiplan, teniendo ellas incluso el mismo nombre y tipo de funcionabilidad (AVERAGE, COUNT, etc.) y manteniendo la compatibilidad con dicho programa. Asimismo, para que Excel sea compatible con Lotus 1-2.3, se incluyeron algunas funciones de dicho programa con el mismo nombre y funcionabilidad (ACOS, ASIN, etc.), en un intento de comenzar a lograr la migración de los usuarios/as de dicho programa hacia Excel, pudiendo usar sus propios archivos previamente creados en Lotus.

Ahora sí, volvamos a SIFECHA. Por años hemos sabido que SIFECHA es una función que existe en Excel desde hace algunos años, que es útil, que fue documentada en Excel 2000 y después por años dejada de lado por Microsoft, aunque hoy sí está en la ayuda en línea (Enlace), además aún hoy podemos seguir usándola, aunque no está en la lista de funciones del Excel ni puede ser usada con la herramienta “Insertar función” y no hay descripción alguna que nos dé la “Intellisense” cuando usamos dicha función. Todo eso podría tratar de explicarse cuando recordamos, como nos dijo Microsoft por años, que finalmente SIFECHA es una función “heredada” de Lotus 1-2-3, pero lo raro es que el año 1985, Lotus 1-2-3 no tenía una función así y si revisamos Excel 1.0, tampoco existía, entonces ¿No que fue heredada de Lotus 1-2-3 como se hizo con varias otras funciones de dicho programa que se incluyeron en Excel 1.0?

Pues lo que ocurrió fue lo siguiente. En 1987 Microsoft lanza al mercado Excel 2.0, con la particularidad de que dicha versión funcionaba en el sistema operativo Windows, mientras Lotus 1-2-3 seguía siendo solo compatible con D.O.S. A inicios de 1990, Windows se iba haciendo más popular al igual que Excel. Recién en esos años Lotus Software incursiona en Windows con su Lotus 1-2-3/W (para Windows), incluyendo nuevas herramientas y funciones a comparación de sus versiones para D.O.S. A pesar de ellos, el mercado estaba cada vez más copado por Excel.

En junio de 1993 Lotus Software lanza Lotus 1-2-3 para Windows Release 4, versión mejorada que incluía varias nuevas decenas de funciones y herramientas, con lo que pensaban competir con Excel. La particularidad de dicha versión es que incluía la función SIFECHA (DATEDIF) como una de las novedades. Por esos meses ya Microsoft anunciaba el lanzamiento de su siguiente versión de Excel, la cual aún estaba en revisión. Esos meses el equipo de Microsoft que veía lo nuevo para Excel, decide integra a SIFECHA para mantener la compatibilidad de dicha función de Lotus 1-2-3 con el programa, por lo que cuando Excel 5.0 ve la luz el 01 de octubre de 1993, incluía dicha función, aunque no se le menciona en las guías de Microsoft ni se incluía en su Ayuda, pero sí es comentada por varios usuarios y en algunas revistas, incluso por personal de Microsoft. Es bueno mencionar que las funciones heredadas de Lotus 1-2-3 y Multiplan en la versión 1.0 de Excel, sí estaban incluidas en guías y ayudas de Excel. Justamente eso lleva a Microsoft a documentar dicha función en Excel 2000, aunque, como ya comenté, igual se retiró dicha documentación en versiones posteriores.

Hoy en día SIFECHA sigue estando vigente en todas las versiones de Excel posteriores a la 5.0, pero Microsoft sigue sin ofrecernos facilidades para usarla en nuestras hojas y al parecer eso no cambiará, es en la práctica una función “oculta”, aunque les adelanto que no es la única.

Espero les haya gustado, hasta la próxima.

Abraham Valencia
Lima, Perú