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
te agradezco mucho. es un excelente aporte!!
ResponderEliminarMuchas gracias, Luis. Saludos.
Eliminar