Problemas con conexión ADO, al intentar exportar datos de excel a archivo de texto.
la versión de excel que utilizo es la 12, adapte una conección ADO , que encontré en internet, donde conecto una tabla creada en excel con un archivo de texto (base de datos), El código funciona bien hasta que en algún momento, la conexión abre otra instancia del mismo libro activo, y desde ahí en mas no vuelve a actualizar la base con los cambios que genero en la planilla. Dejo código que utilizo.
esta es la macro que abre la base de datos llamada Ajenda.txt
Sub EXPORTANDO()
'establezco variables
Dim datConnection As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strDB, strSQL As String
'llamo macro para establecer región (rango)
Call REGIÓN
'guardo los cambios
ActiveWorkbook.Sabe
'establezco ruta de conexión
strDB = "D:\0J1ND0\AJENDA.XLSM"
'creo objetos
Set datConnection = New ADODB.Connection
Set rst = New ADODB.Recordset
'abro la conexión
datConnection.Open "DRIVER=Microsoft Excel Driver (*.xls);" & "DBQ=" & strDB
'realizo la consulta SQL
strSQL = "SELECT * FROM [TABLA1]"
'abro el recordset
rst.Open strSQL, datConnection, adOpenStatic
'llama a función exportar_recordset
Call Exportar_Recordset(rst, "D:\0J1ND0\AJENDA.TXT", vbTab)
'desconecto objetos adodb
rst.Close
datConnection.Close
'cierro los objetos adodb
Set rst = Nothing
Set datConnection = Nothing
End Sub
y esta es la función que baje de internet.
Option Explicit
' -- Variables para la conexión y el recordset
Private cn As New ADODB.Connection
Private rst As New ADODB.Recordset
' --------------------------------------------------------------------------------
' \\ -- Función que exporta el recordset a un archivo de texto
' --------------------------------------------------------------------------------
Public Function Exportar_Recordset( _
rs As Object, _
Optional sFileName As String, _
Optional sDelimiter As String = ";", _
Optional bPrintField As Boolean = False) As Boolean
Dim iFreeFile As Integer
Dim iField As Long
Dim i As Long
Dim obj_Field As ADODB.Field
On Error GoTo error_handler:
'Screen.MousePointer = vbHourglass
' -- Otener número de archivo disponible
iFreeFile = FreeFile
' -- Crear el archivo
Open sFileName For Output As #iFreeFile
With rs
iField = .Fields.Count - 1
On Error Resume Next
' -- Primer registro
.MoveFirst
On Error GoTo error_handler
' -- Recorremos campo por campo y los registros de cada uno
Do While Not .EOF
For i = 0 To iField
' -- Asigna el objeto Field
Set obj_Field = .Fields(i)
' -- Verificar que el campo no es de ipo binario o un tipo no válido para grabar en el archivo
If isValidField(obj_Field) Then
If i < iField Then
If bPrintField Then
' -- Escribir el campo y el valor
Print #iFreeFile, obj_Field.Name & ":" & obj_Field.Value & sDelimiter;
Else
' -- Guardar solo el valor sin el campo
Print #iFreeFile, obj_Field.Value & ";";
End If
Else
If bPrintField Then
' -- Escribir el nombre del campo y el valor de la última columna ( Sin delimitador y sin punto y coma para añadir nueva línea )
Print #iFreeFile, obj_Field.Name & ": " & obj_Field.Value
Else
' -- Guardar solo el valor sin el campo
Print #iFreeFile, obj_Field.Value
End If
End If
End If
Next
' -- Mover el cursor al siguiente registro
.MoveNext
Loop
End With
' -- Cerrar el recordset
rst.Close
Exportar_Recordset = True
'Screen.MousePointer = vbDefault
Close #iFreeFile
Exit Function
error_handler:
On Error Resume Next
Close #iFreeFile
'rst.Close
'Screen.MousePointer = vbDefault
End Function
' ----------------------------------------------------------------------------------------------
' -- Si el campo es nulo ( binario, o tipo desconocido etc..) devuelve False para no añadir el dato
' ----------------------------------------------------------------------------------------------
Private Function isValidField(obj_Field As ADODB.Field) As Boolean
With obj_Field
On Error GoTo error_handler
Select Case obj_Field.Type
Case adBinary, adIDispatch, adIUnknown, adUserDefined
isValidField = False
' -- Campo válido
Case Else
isValidField = True
End Select
End With
Exit Function
error_handler:
End Function
conclusión la pregunta es como evito que se abra una instancia nueva del libro activo o como la cierro. Sin cerrar el libro activo. Desde ya muchas gracias