Evitamos conectar Excel con Access.
Evitamos crear un tabla dinámica intermedia.
Ejemplo
- Descargamos el libro Tablas Neptuno.
- Creamos una hoja de destino, que nombramos como Destination, donde irán los resultados.
- Abrimos el editor de Visual Basic y en el menú de Herramientas clic en referencias añadimos: Microsoft ActiveX Data Objects 6.0 Library.
- Insertamos un módulo en el que añadimos el siguiente código.
- Ejecutamos la subrutina
- Guardamos el fichero como *.xlsm si queremos conservar el código.
Sub Excel_QueryTable()
Sheets("Destination").Cells.ClearContents
Dim oCn As ADODB.Connection
Dim oRS As ADODB.Recordset
Dim ConnString As String
Dim SQL As String
Dim qt As QueryTable
' Cadena de conexión
ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
& ThisWorkbook.Path & "\" & ThisWorkbook.Name & _
";Extended Properties=Excel 8.0;Persist Security Info=False"
Set oCn = New ADODB.Connection
oCn.ConnectionString = ConnString
oCn.Open
' Consulta en SQL
SQL = "SELECT [Ciudad], [País] FROM [Clientes$]" & _
"GROUP BY [Ciudad], [País]"
Set oRS = New ADODB.Recordset
oRS.Source = SQL
oRS.ActiveConnection = oCn
oRS.Open
' Hoja de destino
Set qt = Sheets("Destination").QueryTables.Add(Connection:=oRS, _
Destination:=Sheets("Destination").Range("A1"))
qt.Refresh
If oRS.State <> adStateClosed Then
oRS.Close
End If
If Not oRS Is Nothing Then Set oRS = Nothing
If Not oCn Is Nothing Then Set oCn = Nothing
End Sub
Resultado
El resultado en la hoja de destino serán 70 registros con sus encabezados de columna.
Notas
- Es necesario especificar el nombre de las hojas entre corchetes y con el símbolo dolar al final de la misma: [Clientes$]
- A menos que la hoja activa sea la hoja de destino, es necesarios especificar explícitamente la misma:
Set qt = Sheets("Destination").QueryTables.Add(Connection:=oRS, _ Destination:=Sheets("Destination").Range("A1")) - Empleamos una QueryTable en lugar de copyfromrecordset para obtener los encabezados de las columnas. Si no, emplearíamos en lugar de qt:
Sheets("Destination").Range("A1").CopyFromRecordset oRS
Referencias
Nube de datos
te agradezco mucho. es un excelente aporte!!
ResponderEliminarMuchas gracias, Luis. Saludos.
Eliminar