ENVIAR DATOS DESDE EXCEL A UNA PAGINA WEB (CLASSNAME, NAME)

Hola a todos! Qué tal estáis?, espero que muy bien.

Hace unos días un lector me hacía la siguiente consulta en relación a este post: ENVIAR DATOS DESDE EXCEL A UNA PAGINA WEB – FORMULARIO, necesitaba realizar el mismo ejercicio pero utilizando la propiedad “Name” en lugar del ID. (podéis visitar el post para ver el código de referencia).

Pues bien, en realidad los cambios que hay que hacer en la macro son pocos. En el ejercicio, mediante VBA enviamos al formulario de búsqueda de Excel Signum una palabra y desde el código ejecutamos la búsqueda y mostramos el resultado. Para hacerlo con la propiedad Name, debemos identificar los elementos a incluir en nuestra macro:

ENVIAR DATOS DESDE EXCEL A UNA PAGINA WEB (CLASSNAME, NAME)

Como estamos trabajando con Name, tendremos que detectar los elementos necesarios para nuestro código, en este caso: name=”s” para indicar el contenido en buscador y “submit” para hacer click o ejecutar la búsqueda.

Así quedaría el código:

Sub CARGAR_DATOS_WEB_ByName()
Dim IE As Object
Dim document As Object
Application.ScreenUpdating = False
'Creamos objeto internet explorer
Set IE = CreateObject("InternetExplorer.Application")
'abrimos web
IE.navigate "https://excelsignum.com/"
'esperamos a que se carguen todos los elementos
Do Until IE.ReadyState = 4
DoEvents
Loop
'si necesitamos más tiempo lo podemos configurar aquí
Application.Wait (Now + TimeValue("0:00:01"))
'localizamos el name que hace referencia al cuadro de búsqueda
Set document = IE.document
With document
.getElementsByName("s")(0).Value = "ACCESS"
End With
'también buscamos "name" correspondiente al botón para buscar el valor
With document
.getElementsByName("submit")(0).Click
End With
'hacemos visible la web.
IE.Visible = True
Set IE = Nothing
Application.ScreenUpdating = True
End Sub

Como podéis observar identificamos el name (s) para indicar que el valor de la búsqueda sea “ACCESS”

.getElementsByName("s")(0).Value = "ACCESS"

y ejecutamos la búsqueda haciendo referencia al botón “Buscar”

.getElementsByName("submit")(0).Click

Este es el resultado:

ENVIAR DATOS DESDE EXCEL A UNA PAGINA WEB (CLASSNAME, NAME)1

Efectivamente, desde Internet Explorer se mostrará el resultado de la búsqueda con la palabra “ACCESS” en Excel Signum.

Pero aprovechando que estamos tratando las propiedades ID y Name, podemos también realizar el mismo código con ClassName.

Sub CARGAR_DATOS_WEB_ByClassName()
Dim IE As Object
Dim document As Object
Application.ScreenUpdating = False
'Creamos objeto internet explorer
Set IE = CreateObject("InternetExplorer.Application")
'abrimos web
IE.navigate "https://excelsignum.com/"
'esperamos a que se carguen todos los elementos
Do Until IE.ReadyState = 4
DoEvents
Loop
'si necesitamos más tiempo lo podemos configurar aquí
Application.Wait (Now + TimeValue("0:00:01"))
'localizamos el ClassName que hace referencia al cuadro de búsqueda
Set document = IE.document
With document
.getElementsByClassName("field")(0).Value = "ACCESS"
End With
'también buscamos "ClassName" correspondiente al botón para buscar el valor
With document
.getElementsByClassName("submit")(0).Click
End With
'hacemos visible la web.
IE.Visible = True
Set IE = Nothing
Application.ScreenUpdating = True
End Sub

El resultado es exactamente el mismo que con el código anterior. Y de esta forma ya podéis realizar el mismo ejercicio con el ID, el Name y el ClassName.

Obviamente existen otras formas de realizar estas programación, y es utilizando otros objetos en lugar en I.E. no obstante, eso lo iremos viendo en próximas publicaciones.

Espero que os resulta de interés : )

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Anuncios

LIMPIAR CONTENIDO DE CONTROLES DE FORMULARIO EN HOJA EXCEL O EN USERFORM

Hola a todos!.

Hoy me gustaría dejaros un par de códigos para borrar el contenido de los controles de formulario, tanto aquellos que se insertan en la hoja excel como aquellos que insertamos en nuestros userform o formularios en el editor de VBA.

Voy a comenzar con los controles insertados en una hoja (controles ActiveX), por ejemplo una en la que tengamos varios: Textbox, ComboBox, ListBox y CheckBox. Para que podamos automatizar el proceso de forma óptima debemos utilizar la instrucción Select Case:

Sub LIMPIAR_CONTROLES()
With ActiveSheet
'Por cada objeto que indiquemos en el select case, borramos contenido
For Each Control In .OLEObjects
Select Case TypeName(Control.Object)
Case "TextBox"
Control.Object.Text = vbNullString
Case "ComboBox"
Control.Object.Clear
Case "ListBox"
Control.Object.Clear
Case "CheckBox"
Control.Object.Value = False
End Select
Next Control
End With
End Sub

Dado que estamos trabajando con controles ActiveX debemos tratar en nuestro código con los objetos OLEObject, que son los que nos van a permitir interactuar con nuestra hoja. A continuación solo tendremos que especificar el tipo de objeto y la forma en la que debemos limpiarlo o vaciarlo en el Select – Case.

Con los Formularios o Userforms resulta más sencillo, dado que haremos referencia a la colección Controls. El resultado del código es similar al anterior:

Private Sub CommandButton1_Click()
'Por cada objeto que indiquemos en el select case, borramos contenido
For Each Control In Me.Controls
Select Case TypeName(Control)
Case "TextBox"
Control.Text = vbNullString
Case "ComboBox"
Control.Clear
Case "ListBox"
Control.Clear
Case "CheckBox"
Control.Value = False
End Select
Next Control
End Sub

Como podéis ver, ambas estructuras son idénticas (salvo por la forma de hacer referencia a los controles de formulario).

Dado que se trata de fragmentos de código bastante específicos y sencillos, considero que no requieren un archivo de ejemplo. Os invito a que los probéis en vuestros proyectos : )

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

BUCLES ANIDADOS. GENERAR SERIES NUMÉRICAS

Hola a todos:

En algunas ocasiones necesitamos generar series numéricas para nuestros proyectos. Dependiendo de las necesidades la complejidad de estos algoritmos suele ser alta, sin embargo podemos hacer un pequeño ejercicio a modo de ejemplo con el que se pueda comprender la idea.

Una forma de hacerlo es programando varios loops como bucles anidados, lo que nos proporcionará la técnica adecuada para la generación de números. Veamos una secuencia sencilla y cómo la podemos programar, imaginad que tenemos que generar la siguiente progresión:

1|1
1|2
1|3
1|4
1|5
1|6
1|7
1|8
1|9
1|10
2|1
2|2
2|3
2|4
2|5
2|6
2|7
2|8
2|9
2|10
3|1
3|2
3|3
3|4
3|5
3|6
3|7
3|8
3|9
3|10
4|1
4|2
4|3
4|4
4|5
4|6
4|7
4|8
4|9
4|10
5|1
5|2
5|3
5|4
5|5
5|6
5|7
5|8
5|9
5|10

Como podéis observar, cada 10 bucles aumentamos en +1 la fila de la izquierda. Lo hacemos hasta llegar a 5 (podríamos hacerlo hasta cualquier otro número y complicando hasta varias filas el resultado).

Para realizar esto, utilizaremos la siguiente rutina:

Sub GENERA_NUM()
'Declaramos variables
Dim i As Integer, j As Integer, n As Integer
Dim x As Integer, nNum As Variant
With Sheets(1)
.Cells(1, 1) = "DATOS"
'Iniciamos primer bucle, 1 a 5
'Mientras es 1 generamos segundo loop hasta 10
'cuando finaliza, pasamos a 2 y volvemos a generar loop hasta 10
For i = 1 To 5: For j = 1 To 10
'Creamos un contador
x = Application.CountA(.Range("A:A")) + 1
nNum = i & "|" & j
'Mostramos datos en la hoja1
.Cells(x, 1) = nNum
Next: Next
End With
End Sub

Como podéis observar, anidamos las dos rutinas de modo que se sincronizan para generar la información:

BUCLES ANIDADOS. GENERAR SERIES NUMERICAS

Este tipo de procedimientos se suele utilizar para la generación de programas de descifrado de contraseñas, seguridad, etc. Aunque en este caso lo estamos utilizando para crear una serie numérica.

Lo realmente importante es conocer la utilidad de los bucles anidados y cómo programarlos. Esta es una forma y aunque hay más, por hoy creo que es suficiente.

Os dejo el archivo para el “trasteo” : )

Descarga el archivo de ejemplo pulsando en: BUCLES ANIDADOS. GENERAR SERIES NUMÉRICAS

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

AÑADIR UN NÚMERO ESPECÍFICO DE HOJAS A VARIOS ARCHIVOS CON VBA

Hola a todos:

Hace unos días me enviaron una consulta en la que me preguntaban la forma de realizar un proceso en el que pudiese seleccionar varios archivos y crear en ellos tantas pestañas como sean especificadas.

Bien, esta es una consulta relativamente sencilla, evidentemente requiere programación pero con la información de algunos post publicados en esta web se puede resolver perfectamente.

Probaremos con un libro que contiene 2 hojas:

AÑADIR UN NUMERO ESPECIFICO DE HOJAS A VARIOS ARCHIVOS CON VBA

Y queremos que tenga 5 hojas (contando con las que ya tenemos). Pues bien, para hacer este trabajo utilizaremos la siguiente macro:

Sub AÑADIR_HOJAS()
'Declaramos variables
Dim nArchivo As Variant, i As Long
Dim nHoja As Long, n As Long
Dim iHoja As Long
'Indicamos el número de hojas que queremos crear en nuestro libro
iHoja = Sheets("Hoja1").Cells(1, 2)
'Seleccionamos los archivos
Application.ScreenUpdating = False
nArchivo = Application.GetOpenFilename(FileFilter:="Excel (*.xls*),*.xls", _
Title:="SELECCIONAR ARCHIVOS", MultiSelect:=True)
'Si no seleccionamos nada salimos del proceso
If Not IsArray(nArchivo) Then
Exit Sub
Else
'Recorremos y abrimos cada archivo
For i = LBound(nArchivo) To UBound(nArchivo)
Workbooks.Open Filename:=(nArchivo(i))
'Contamos el número de hoja
nHoja = ActiveWorkbook.Worksheets.Count
'Seleccionamos la última hoja
Worksheets(nHoja).Select
'Añadimos hojas hasta completar las 5 que hemos indicado
For n = 1 To (iHoja - nHoja)
ActiveWorkbook.Sheets.Add after:=ActiveSheet
Next n
'Desactivamos advertencias y avisos y guardamos el archivo
Application.DisplayAlerts = False
ActiveWorkbook.Close SaveChanges:=True
Next i
End If
End Sub

Cuando ejecutamos el código, nos solicitará seleccionar uno o varios archivos y marcaremos en nuestra hoja el número de hojas a crear en los archivos que hemos seleccionado.

Luego, tras un loop que recorre cada libro y cuenta el número de hojas, pasaremos un segundo bucle que creará a partir de las hojas que ya tenemos el resto de hojas que deseamos generar. Este es el resultado:

AÑADIR UN NUMERO ESPECIFICO DE HOJAS A VARIOS ARCHIVOS CON VBA1

Y esta ha sido la respuesta a la consulta : )

Descarga el archivo de ejemplo pulsando en: AÑADIR UN NUMERO ESPECIFICO DE HOJAS A VARIOS ARCHIVOS CON VBA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS

Hola a todos!

El post de hoy será muy breve, es una pequeña explicación de cómo podemos utilizar un inputbox para modificar e interactuar con nuestros datos.

Vamos con el ejemplo, imaginad que tenemos una serie de fechas en una columna de nuestra hoja excel:

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS

Ahora vamos a programar un inputbox que nos permitirá seleccionar una fecha y, para este ejemplo, que si alguna de las fechas indicadas es mayor que la fecha que hemos indicado, coloree de verde esa celda.

El código que vamos a usar es el siguiente:

Sub EJEMPLO_INPUTBOX()
'Declaramos las variables
Dim Mensaje As String, Titulo As String, Formato As String
Dim MiFecha As Date, i As Long, fin As Long
'Indicamos el mensaje a mostrar
Mensaje = "INTRODUCE LA FECHA DE REFERENCIA." + Chr(13) + Chr(13) + "EL FORMATO DEBE SER: DIA/MES/AÑO"
'Indicamos el título del inputbox
Titulo = "ATENCION"
'Indicamos el contenido del cuadro de texto
Formato = "00/00/0000"
'Pasamos todos los datos al inputbox y formateamos el contenido a fecha
MiFecha = CDate(inputbox(Mensaje, Titulo, Formato))
'Con un loop recorremos los datos
With Sheets("Hoja1")
fin = Application.CountA(.Range("A:A"))
For i = 2 To fin
'Si las fechas de la hoja son mayores que la que he indicado en el inputbox
'entonces coloreamos la celda de color verde
If .Cells(i, 1) > MiFecha Then .Cells(i, 1).Interior.Color = vbGreen
Next i
End With
End Sub

Al ejecutarlo, mostraremos inicialmente el formato de fecha que queremos que se indique:

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS1

Una vez que introducimos la fecha, por ejemplo el 23/05/2018:

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS2

Y pulsamos aceptar, ya tenemos el resultado que esperamos:

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS3

Y ya lo tenemos!. Por supuesto, en la macro podéis programar otros controles para controlar errores que puedan saltar si el formato de la fecha no es válido o no seleccionamos una fecha. Con simple “On error goto” lo podríamos hacer perfectamente.

Y eso es todo, espero que os sea de utilidad.

Descarga el archivo de ejemplo pulsando en: UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

PASAR UNA CADENA DE TEXTO A UNA MATRIZ Y UTILIZARLO EN UN BUCLE

Hola a todos!

Hoy voy a tratar un tema concreto a nivel programación, un pequeño “tip” de una forma o método para realizar la siguiente tarea: pasar una cadena de texto a un array o matriz y a su vez, poder utilizarla en un bucle (en este caso usaré “for each”).

Voy a realizar un ejemplo sencillo con el que podréis entenderlo perfectamente. Este trabajo también se podría realizar con otras técnicas, pero hoy quiero centrarme en esta.

Veamos, imaginad que tenemos en una columna una serie de números:

PASAR UNA CADENA DE TEXTO A UN ARRAY Y UTILIZARLO EN UN BUCLE

Para poder pasar esta serie de números a una cadena de texto, tenemos que componerla y lo podemos hacer con un ciclo for – next:

Así:

With Sheets("Hoja1")
Fin = Application.CountA(.Range("A:A"))
For i = 2 To Fin
mStr = mStr & "|" & .Cells(i, 1)
Next i
End with
End sub

Utilizaremos la barra “|” como separador en nuestra cadena.

El resultado es el siguiente:

|371|282|404|881|804|812|742|833|242|294|931|725|942|909|103|519|380|190|42|892|764|333|352|18|887|889|319

Y como podéis observar, nos ha quedado una barra al inicio de la cadena que es necesario eliminar, para ellos debemos hacerlo con las siguientes funciones:

mStr = Mid(mStr, 2, Len(mStr))

Una vez que tenemos nuestra string o cadena de texto depurada, ya podemos dar el siguiente paso, crear una matriz con cada una de sus subcadenas. Utilizaremos la función “Split”:

mtrz = Split(mStr, "|")

Y ahora que tenemos toda la información, ya podemos utilizar la matriz en nuestro loop o bucle:

For Each numero In mtrz
.Cells(2, 3) = "RESULTADO: " & numero & "*2= " & numero * 2º1
Application.Wait (Now + TimeValue("00:00:01"))
Next numero

Donde “numero” se corresponde con cada subcadena de nuestra matriz, que en este caso es un número.

En el loop simplemente multiplico por 2 cada número y lo muestro en la hoja1 con un “retardo en la ejecución de cada multiplicación de 1 segundo”.

Y resulta esto:

PASAR UNA CADENA DE TEXTO A UN ARRAY Y UTILIZARLO EN UN BUCLE1

Sin embargo, el motivo de este post es mostrar una forma o método para crear una matriz a partir de un string y poder utilizarlo en un bucle.

Aunque este ejemplo es muy sencillo y se podría realizar lo mismo con un simple bucle for next, no os quedéis con esa idea, sino con que este  método os puede resultar muy útil para otros procedimientos más complejos.

Descarga el archivo de ejemplo pulsando en: PASAR UNA CADENA DE TEXTO A UNA MATRIZ Y UTILIZARLO EN UN BUCLE

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

REALIZAR CONSULTAS SQL DE UNIÓN EN EXCEL CON ADO

Hola a todos!:

Hacía tiempo que no subía un post nuevo, pero últimamente estoy bastante escaso de tiempo y esta semana me han enviado algunas consultas de gran complejidad, lo que me ha dejado poco margen para publicar. Pero hoy sí puedo : )

Para este post escribiré acerca de las ventajas de las consultas de unión a la hora de realizar nuestros trabajos y programaciones.

Básicamente una consulta de unión se especifica en SQL con las instrucciones UNION y UNION ALL, ambas realizan el trabajo de unir dos o más consultas SQL, solo que cuando es UNION el resultado de la consulta solo devuelve los valores distintos (sin duplicados) y cuando es UNION ALL devuelve todos los valores (pueden incluir duplicados).

Para el ejemplo de hoy se podrían utilizar ambas, dado que los elementos son distintos en las dos bases de datos.

Imaginad que tenemos dos tablas (que pueden ser archivos independientes, pero para este ejemplo lo hago todo dentro del mismo archivo). Una se corresponde con un grupo de trabajadores de unos grandes almacenes y la otra con otro grupo, las llamaré GRUPO1 y GRUPO2 respectivamente:

REALIZAR CONSULTAS SQL DE UNION EN EXCEL

Pues bien, deseamos obtener un único archivo con lo siguiente:

Del GRUPO1 personas con sexo = “MUJER” y estudios = “DIPLOMADOS” y que los nombres no sean nulos (dado que hemos detectado que en algunas ocasiones el campo “NOMBRE COMPLETO” tiene celdas vacías. La sentencia SQL sería esta:

"SELECT [GRUPO1$].[NOMBRE COMPLETO],[GRUPO1$].[EDAD], [GRUPO1$].[SEXO], [GRUPO1$].[ESTUDIOS], 'GRUPO1' AS GRUPO FROM [GRUPO1$] WHERE NOT [GRUPO1$].[NOMBRE COMPLETO] IS NULL AND [GRUPO1$].[SEXO]='MUJER' AND [GRUPO1$].[ESTUDIOS]='DIPLOMADOS' "

Del GRUPO2 personas con sexo = “HOMBRE” y estudios = “DIPLOMADOS” y que los nombres no sean nulos (dado que hemos detectado que en algunas ocasiones el campo “NOMBRE COMPLETO” tiene celdas vacías. La sentencia SQL sería esta:

SELECT [GRUPO2$].[NOMBRE COMPLETO],[GRUPO2$].[EDAD], [GRUPO2$].[SEXO], [GRUPO2$].[ESTUDIOS], 'GRUPO2' AS GRUPO FROM [GRUPO2$] WHERE NOT [GRUPO2$].[NOMBRE COMPLETO] IS NULL AND [GRUPO2$].[SEXO]='HOMBRE' AND [GRUPO2$].[ESTUDIOS]='DIPLOMADOS' "

Una vez definidas las consultas, introducimos la instrucción UNION ALL y componemos nuestro string para pasar la consulta en nuestro código, así sería completo:

obSQL = "SELECT [GRUPO1$].[NOMBRE COMPLETO],[GRUPO1$].[EDAD], [GRUPO1$].[SEXO], [GRUPO1$].[ESTUDIOS], 'GRUPO1' AS GRUPO FROM [GRUPO1$] WHERE NOT [GRUPO1$].[NOMBRE COMPLETO] IS NULL AND [GRUPO1$].[SEXO]='MUJER' AND [GRUPO1$].[ESTUDIOS]='DIPLOMADOS' UNION ALL " & _
"SELECT [GRUPO2$].[NOMBRE COMPLETO],[GRUPO2$].[EDAD], [GRUPO2$].[SEXO], [GRUPO2$].[ESTUDIOS], 'GRUPO2' AS GRUPO FROM [GRUPO2$] WHERE NOT [GRUPO2$].[NOMBRE COMPLETO] IS NULL AND [GRUPO2$].[SEXO]='HOMBRE' AND [GRUPO2$].[ESTUDIOS]='DIPLOMADOS' "

El resultado de ejecutar la consulta sería el siguiente:

REALIZAR CONSULTAS SQL DE UNION EN EXCEL1

Efectivamente, nuestras dos consultas se han unido en una única consulta. Mostrando un total de 3 mujeres en el GRUPO1 y 1 hombre en el GRUPO2. Indicar que tal y como queríamos hemos obviado las celdas en blanco del campo NOMBRE COMPLETO.

Ahora os dejo la macro completa:

Option Explicit
Sub GENERAR_CONSULTA()
Dim Dataread As ADODB.Recordset, obSQL As String
Dim cnn As ADODB.Connection, fin As Integer, milibro As String, i As Long
Dim titulo As String
fin = Application.CountA(Sheets("UNION").Range("A:A"))
'Borramos datos de consultas anteriores
Sheets("UNION").Range("A2:E" & fin + 1).Clear
'construimos nuestras dos consultas y las unimos
obSQL = "SELECT [GRUPO1$].[NOMBRE COMPLETO],[GRUPO1$].[EDAD], [GRUPO1$].[SEXO], [GRUPO1$].[ESTUDIOS], 'GRUPO1' AS GRUPO FROM [GRUPO1$] WHERE NOT [GRUPO1$].[NOMBRE COMPLETO] IS NULL AND [GRUPO1$].[SEXO]='MUJER' AND [GRUPO1$].[ESTUDIOS]='DIPLOMADOS' UNION ALL " & _
"SELECT [GRUPO2$].[NOMBRE COMPLETO],[GRUPO2$].[EDAD], [GRUPO2$].[SEXO], [GRUPO2$].[ESTUDIOS], 'GRUPO2' AS GRUPO FROM [GRUPO2$] WHERE NOT [GRUPO2$].[NOMBRE COMPLETO] IS NULL AND [GRUPO2$].[SEXO]='HOMBRE' AND [GRUPO2$].[ESTUDIOS]='DIPLOMADOS' "
'Obtenemos el nombre del libro
milibro = ThisWorkbook.Name
'Creamos la conexión ADO
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "DATA SOURCE=" & Application.ActiveWorkbook.Path + "\" & milibro
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
Set Dataread = New ADODB.Recordset
With Dataread
.Source = obSQL
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
'pasamos información a la hoja UNION
Do Until Dataread.EOF
Dataread.MoveFirst
With Worksheets("UNION")
.Cells(2, 1).CopyFromRecordset Dataread
'Indicamos encabezados
For i = 0 To Dataread.Fields.Count - 1
titulo = Dataread.Fields(i).Name
.Cells(1, i + 1) = titulo
Next
End With
Loop
'ejecutamos el resto de consultas
Set Dataread = Nothing
Set cnn = Nothing
End Sub

Como podéis observar, la estructura del código es la misma que suelo publicar en los post en los que trabajo con ADO y SQL en Excel.

Y eso es todo. Es una forma útil cuando necesitamos consolidar información de varios archivos pero especificando criterios distintos en cada base de datos.

Descarga el archivo de ejemplo pulsando en: REALIZAR CONSULTAS SQL DE UNIÓN EN EXCEL CON ADO

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies