Importar Datos de Consulta Access a Excel 2007 con código VBA

Tengo el siguiente código VBA en una hoja de excel el cual me permite conectarme usando ADODB a una base de datos de Access e importar datos de una Tabla especifica:Private Sub ActualizarCajas_Click()Dim oConexion As ADODB.ConnectionDim rsTabla As ADODB.RecordsetDim fld As ObjectDim sNombreTabla As StringDim sNombreAccess As StringDim i As IntegerstrHoja = ActiveSheet.Namefilasaborrar = Sheets(strHoja).Range("A3").End(xlDown).RowSheets(strHoja).Range("A3", "E" & filasaborrar) = clearConntentsNombreAccess = "C:\DICCIONARIO\EMPLEADOS.accdb"If sNombreAccess <> "" ThensNombreTabla = "Listado_CCF+CtaContable"Set oConexion = New ADODB.ConnectionoConexion.CursorLocation = adUseClientoConexion.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _"Data Source=" & sNombreAccess & ";Persist Security Info=False;"Set rsTabla = New ADODB.RecordsetrsTabla.Open "Select NroHum, NombreRegTbl, NitCaj, CodigoCaj, CuentasTer From [" & sNombreTabla & "]", _oConexion, _adOpenStaticFor i = 0 To rsTabla.Fields.Count - 1ActiveSheet.Cells(2, i + 1).Value = rsTabla.Fields(i).NameActiveSheet.Cells(2, i + 1).Font.Bold = TrueActiveSheet.Cells(2, i + 1).HorizontalAlignment = xlCenterNextfila = 3columna = 1While Not rsTabla.EOFFor Each fld In rsTabla.FieldsActiveSheet.Cells(fila, columna) = Trim(fld.Value)columna = columna + 1Nextcolumna = 1fila = fila + 1rsTabla.MoveNextWendcolumnasajustar = Sheets(strHoja).Range("A1").End(xlDown).RowRange("A1:E" & columnasajustar).EntireColumn.AutoFitrsTabla.CloseoConexion.CloseSet rsTabla = NothingSet oConexion = NothingEnd IfEnd Sub

Este código funciona perfectamente si a la variable sNombreTabla le asigno el nombre de una tabla, pero al asignarle el nombre de una consulta, que en este caso es "Listado_CCF+CtaContable" no extrae ningún dato a la hoja de Excel.

¿Podrían por favor indicarme que le hace falta para que me funcione ya sea con el nombre de una Tabla o una Consulta?

1 respuesta

Respuesta
1

Perdona, pero creo que lo que ocurre es que debes llevar los resultados de la consulta a una tabla. Yo creo acordarme de así haberlo hecho y me resultó. Tengo ya un par de días trabajando con ese mismo código para adaptarlo a mis necesidades.

Aprovecho a preguntarte: ¿Sabes cómo traerte los datos de la tabla de una manera ordenada o no te interesa?. A mi si, porque tuve que dividir la base de datos en dos hojas de Excel para que cupiera. Yo los ordeno previamente en Access pero luego se pierde el orden al usar el código que pegaste. Te pregunto porque por lo que veo es mas directo que hacer la pegunta en el tablón ya que casualmente lo utilizas.

Hola Experto:


Después de tanto probar y probar, logre corregir el problema. Resulta que yo tenia construida una consulta en mi BD de Access, y lo que hacia en el código de mi hoja de excel era llamar a dicha consulta para traer los datos obtenidos en la ejecución de la misma, pero no me funcionaba porque en la construcción de dicha consulta, en la clausula WHERE, estaba incluido un parámetro de comparación numérico (.... = 237010....) y resulta que la sintaxis generada en esta consulta SQL de access, en este tipo de parámetros es diferente a la consulta enviada desde VBA, por eso era que los registros arrojados por la consulta eran Cero. Fijate que en el código VBA quedo como (.... >='237010' AND .... <='237011' ....)
En razón a esto modifique el código VBA en el Excel y le coloque la consulta directamente así:

Private Sub ActualizarCajas_Click()
Dim oConexion As ADODB.Connection
Dim rsTabla As ADODB.Recordset
Dim fld As Object
Dim sNombreTabla As String
Dim sNombreAccess As String
Dim i As Integer
strHoja = ActiveSheet.Name
filasaborrar = Sheets(strHoja).Range("A3").End(xlDown).Row
Sheets(strHoja).Range("A3", "E" & filasaborrar) = clearConntent
sNombreAccess = "C:\DICCIONARIO\DATOSTEKASERVICES_F.accdb"
If sNombreAccess <> "" Then
Set oConexion = New ADODB.Connection
oConexion.CursorLocation = adUseClient
oConexion.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & sNombreAccess & ";Persist Security Info=False;"
Set rsTabla = New ADODB.Recordset
rsTabla.Open "SELECT TABLA_DESCRIPCION_CAJA_COMPENSACION.NitCaj, TABLA_DESCRIPCION_CAJA_COMPENSACION.NombreRegTbl, TABLA_MAESTRO_TERCEROS.CuentasTer, TABLA_DESCRIPCION_CAJA_COMPENSACION.NroHum FROM TABLA_DESCRIPCION_CAJA_COMPENSACION INNER JOIN TABLA_MAESTRO_TERCEROS ON TABLA_DESCRIPCION_CAJA_COMPENSACION.NitCaj = TABLA_MAESTRO_TERCEROS.NitTer WHERE TABLA_MAESTRO_TERCEROS.CuentasTer >= '237010' AND TABLA_MAESTRO_TERCEROS.CuentasTer <= '237011' AND TABLA_MAESTRO_TERCEROS.TTer = 'L'", oConexion, adOpenStatic
CreateObject("wscript.shell").popup "Por favor espere. Su solicitud esta siendo procesada...", 5, "Information:", 64
For i = 0 To rsTabla.Fields.Count - 1
ActiveSheet.Cells(2, i + 1).Value = rsTabla.Fields(i).Name
ActiveSheet.Cells(2, i + 1).Font.Bold = True
ActiveSheet.Cells(2, i + 1).HorizontalAlignment = xlCenter
Next
fila = 3
Columna = 1
While Not rsTabla.EOF
For Each fld In rsTabla.Fields
ActiveSheet.Cells(fila, Columna) = Trim(fld.Value)
Columna = Columna + 1
Next
Columna = 1
fila = fila + 1
rsTabla.MoveNext
Wend
columnasajustar = Sheets(strHoja).Range("A1").End(xlDown).Row
Range("A1:E" & columnasajustar).EntireColumn.AutoFit
rsTabla.Close
oConexion.Close
Set rsTabla = Nothing
Set oConexion = Nothing
End If
MsgBox "Relación de CCF Actualizada Exitosamente!!!", vbInformation, "Información"
Sheets(strHoja).Range("A3").Select
End Sub

De esta manera me funciono perfectamente.


Ahora bien, si lo que deseas es que los registros te queden ordenados por alguna columna, simplemente agregale el ORDER BY tabla.columna después de la clausula WHERE y listo!!! Yo he construido otras consultas parecidas en la cual ordeno los datos y me funciona a la perfección. Espero poder haberte respondido adecuadamente a tus dudas. Saludos.

Ya que no haz retirado la pregunta, aprovecho para comentarte, primero que la instrucción WHERE no la tengo en mi código sino WEND y no me parece que deba ser allí. Por otro lado creo no haberme explicado correctamente. Tengo una tabla en Access com 1.500.000 registros, con este código la exporte a dos hojas de Excel. La dividí en dos para tenerlas todas quiero decir. Pero lo que ocurre es que me llegan con la columna 1 ordenada como es originalmente en vez de la 3 como es mi deseo. El ORDER BY si mas o menos entiendo la instrucción es un ordenamiento de toda la columna una vez que lleguen los datos, pero no ordenarlos según vayan llegando. Quiero decir QUE si yo tengo empezando con la letra "A" en la HOJA1 querria que en la HOJA2 terminara ordenado en "Z". ¿Sera qué ahora se entiende un poco mas?. ¿Parece qué hay una herramienta para pivotear Hojas pero no he encontrado en EXCEL 2007 donde está?.

Bueno, WEND es una palabra reservada de VBA que se utiliza para cerrar el ciclo WHILE y no tiene nada que ver con la clausula WHERE de la consulta SQL que estas ejecutando...
En cuanto al ordenamiento, si lo que estas haciendo en tu código es invocar una consulta que ya tienes construida en el Access, y si los datos te salen ordenados por la columna A y no la C como la quieres tu, debe ser porque en la consulta de Access le has definido el ORDER BY para esa columna, así que revisa en tu consulta de access y modifícala.
Para la opción de que te exporte el 1.500.00 de registros que tienes en el access en varias hojas de excel, se me ocurre que le coloques en tu código un condicional que te evalúe hasta la ultima fila a la que quieras llegar en cada hoja y que cuando se cumpla esa condicional cree una nueva hoja en el mismo libro y continué allí con el siguiente registro y así sucesivamente....
Saludos y me cuentas como te fue.

A ver. Lo cierto es que así hice para dividirla coloque un condicional para que llegado al limite del Excel seleccionara otra hoja y funcioná al dedillo :). Me quedó repartida en 2 hojas. Eso lo solucioné ayer mismo.

Lo de ordenar, pues que te digo, no lo hago en Access a través de una consulta propiamente, simplemente selecciono la tabla completa y ejecuto Filtro>Ordenar .Pero si a eso le dices consulta ok. Luego a las hojas de Excel me llegan igual como estaban originalmente, quiero decir, no interpreta el filtro al cual fue sometida la tabla. Pero si la cargo en Access me abre ordenada como yo quiero o como ya la guardé. Quien sabe que tengo mas bien que ordenarla diseñando una consulta para que así el Excel me la exporte como es. Probaré!. Cualquier sugerencia bienvenida :)

OK, Creo que lo mas conveniente en este caso es que envíes la consulta directamente desde VBA. Ej:
rsTabla.Open "SELECT * FROM NombreTabla ORDER BY Columna3", oConexion, adOpenStatic
Eso tiene que funcionar!!! Asi tengo yo diseñadas 3 consultas. Me cuentas...

Deja ver que ahora descubrí que una de las columnas tenia el nombre del campo invertido no se porque razón. Pareciera que Access cuando son bases de datos extensas se enreda un poco. La volví a cargar en Access la ordene y la guarde de nuevo borrando la original. Con la columna como es. Ejecutare el código, si me la sigue desordenando, probare la instrucción que me dices.

Nada !. La volvió a desordenar. Deja probar con lo que me dices y te cuento

Ok. Ya dimos un paso. Tengo que ver que es lo que falta en el código. La Hoja1 sigue desordenada pero la Hoja2 esta ordenada.

Listo !

Lo arreglé con esto

Set strHoja = Sheets("Hoja1")
strHoja.Select

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas