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