Como le responden si trabaja con ADO sin tablas vinculadas, ya sea que la base de datos backend este en Access u otro servidor de datos (en mi caso uso PostgreSQL) se requieren conocimientos avanzados de VBA y ADO.
Personalmente utilizo un módulo de clase para manipular tablas que están en otro pc o carpeta pero que NO están vinculadas. Le dejo solo la introducción de cómo sería la clase.
CÓDIGO DE LA CLASE
Esta clase es para bases de datos en Access. Le presento esta clase porque la mayoría de usuarios no utilizan servidores de datos como MySQL, PostrgreSQL etc.
Private cnn As Object ' Objeto ADODB.Connection
Private rs As Object ' Objeto ADODB.Recordset
Public Function Conectar() As Boolean
On Error GoTo hay_error
Dim strConexion As String
strConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CurrentProject.Path & "\Datos\datos_be.accdb;Persist Security Info=False;"
Set cnn = CreateObject("ADODB.Connection")
cnn.ConnectionString = strConexion
cnn.Open
Conectar = True
hay_error_exit:
Exit Function
hay_error:
MsgBox "Error al conectar a la base de datos: " & Err.Description, vbCritical, "Error...."
Conectar = False
Resume hay_error_exit
End Function
Public Function Desconectar() As Boolean
On Error GoTo hay_error
If Not (rs Is Nothing) Then rs.Close
If Not (cnn Is Nothing) Then cnn.Close
Set rs = Nothing
Set cnn = Nothing
Desconectar = True
hay_error_exit:
Exit Function
hay_error:
MsgBox "Error al desconectar a la base de datos" & Err.Description, vbCritical, "Error..."
Desconectar = False
Resume hay_error_exit
End Function
Public Function recordset_desc(sql As String, Optional bloqueo As Byte) As ADODB.Recordset
' Función para obtener un recordset ADO desconectado o conectado
' en este caso retorna el select pasado en el parámetro sql
' Sirve como origen de datos para formulario, cuadro combinado y cuadro de lista
' Parámtros:
' sql --> Una instruccion SQL
' Bloqueo --> 1. Recordset Solo lectura - desconectado
' 2. Recordset actualizable no visible para los demás usuarios - conectado
' 3. Recordset actualizar por lotes - desconectado
On Error GoTo hay_error
Dim strSQL As String
Dim rs As ADODB.Recordset
strSQL = sql
'Crear e iniciar el recordset
Set rs = New ADODB.Recordset
rs.ActiveConnection = cnn
rs.CursorLocation = adUseClient
Select Case bloqueo
Case 1
rs.CursorType = adOpenForwardOnly
rs.LockType = adLockReadOnly
Case 2
rs.CursorType = adOpenStatic
'rs.CursorType = adOpenKeyset
rs.LockType = adLockPessimistic
Case 3
rs.CursorType = adOpenKeyset
rs.LockType = adLockBatchOptimistic
End Select
rs.Open strSQL
'Desconectando
If bloqueo <> 2 Then ' solo lectura recordset desconectado
Set rs.ActiveConnection = Nothing
End If
'Devolver el recordset
Set recordset_desc = rs
'Quito la referencia a la variable objeto
Set rs = Nothing
hay_error_exit:
Exit Function
hay_error:
MsgBox "Error al obtener recordset" & Err.Description, vbCritical, "Error..."
Set rs = Nothing
Resume hay_error_exit
End Function
Con esta clase puede asignar a un formulario un recordset conectado o desconectado. Le dejo el código como sería en un formulario INDEPENDIENTE, es la forma como se debe trabajar.
Dim miTabla As New clsEPFADO
Dim rs As Object ' Objeto ADODB.Recordset
Dim cnn As ADODB.Connection
Private Sub Form_Load()
Dim strSQL As String
Dim sql As String
Dim sql1 As String
Dim sql2 As String
Dim rs As Object
Dim rs2 As Object
If CurrentProject.AllForms("frmPrincipal").IsLoaded Then
Forms!frmPrincipal.Visible = False
End If
Set miTabla = New clsEPFADO
miTabla.Conectar
sql = "SELECT * FROM tblclientes ORDER BY nombres"
sql2 = "SELECT idciudad,nombciudad FROM tblciudad ORDER BY nombciudad ASC;"
Set rs = miTabla.Consultar(sql)
Set rs2 = miTabla.Consultar(sql2)
If Not (rs.EOF And rs.BOF) Then
Set Me.Recordset = rs
Set Me.cboCiudad.Recordset = rs2
End If
'Cuadro combinado
strSQL = "SELECT tblclientes.idcliente" & vbCrLf
strSQL = strSQL & " , [nombres] & "" "" & [apellido1] & "" "" & [apellido2] AS Cliente" & vbCrLf
strSQL = strSQL & " FROM tblclientes" & vbCrLf
strSQL = strSQL & " ORDER BY [nombres] & "" "" & [apellido1] & "" "" & [apellido2];"
Set Me.cboCliente.Recordset = miTabla.recordset_desc(strSQL, 1)
End Sub
Observe como se instancia la clase clsEPFADO y como se asignan los recordset con el método recordset_desc() a los cuadros combinado y al formulario. Le dejo esta imagen como tengo el ejemplo.
Observe los botones de navegación, todo se hace gracias a la clase. Martha como tengo su correo le estaré enviando un ejemplo completo.