Hola buenas tardes,
Nuevamente con una duda en cuestión de
VB6. Estoy haciendo un programita para importar datos de un archivo de
Excel a una base de datos de
Access.
El programa tiene dos frames, el primero ya funciona correctamente, pero en el segundo, tengo un
ListBox y un
Botón (llamado
btnImportar). En el botón Importar tengo el siguiente código:
Código:
Private Sub btnImportar_Click()
Call Excel_a_Access(App.Path & "D:\Sistema Registro Escolar\Diseño Sistema\BD\Registros.mdb", _
App.Path & "\ejemplo.xls", _
"Alumnos", 10, 10)
End Sub
Y tengo dos funciones adicionales:
Código:
Private Sub Excel_a_Access(Path_BD As String, _
Path_XLS As String, _
La_Tabla As String, _
Filas As Integer, _
Columnas As Integer)
Dim Obj_Excel As Object
Dim Obj_Hoja As Object
Dim cn_Ado As ADODB.Connection
Dim rst_Ado As ADODB.Recordset
Dim Fila_Actual As Integer
Dim Columna_Actual As Integer
Dim Dato As Variant
Screen.MousePointer = vbHourglass
'Nueva instancia de Excel
Set Obj_Excel = CreateObject("Excel.Application")
' Abre el libro de Excel
Obj_Excel.Workbooks.Open FileName:=Path_XLS
' si es la versión de Excel 97, asigna la hoja activa ( ActiveSheet )
If Val(Obj_Excel.Application.Version) >= 8 Then
Set Obj_Hoja = Obj_Excel.ActiveSheet
Else
Set Obj_Hoja = Obj_Excel
End If
'Abre una nueva conexión Ado
Set cn_Ado = New ADODB.Connection
' Cadena de conexión
cn_Ado.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Path_BD & ";" & _
"Persist Security Info=False"
On Error Resume Next
' Abre la base de datos
cn_Ado.Open
'Nuevo objeto recordset
Set rst_Ado = New ADODB.Recordset
'Abre el recordset
rst_Ado.Open "Select * FROM " & La_Tabla, _
cn_Ado, adOpenStatic, adLockPessimistic
'Se posiciona al final If rst_Ado.RecordCount <> 0 Then rst_Ado.MoveLast
' Recorre las filas y columnas de la hoja
For Fila_Actual = 1 To Filas
'Nuevo registro
rst_Ado.AddNew
For Columna_Actual = 0 To Columnas - 1
' Va leyendo los datos de la celda indicada
Dato = Trim$(Obj_Hoja.Cells(Fila_Actual, Columna_Actual + 1))
'Agrega los datos al campo indicado
rst_Ado(Columna_Actual).Value = Dato
Next
Next
Call Descargar_Objetos(rst_Ado, cn_Ado, Obj_Excel, Obj_Hoja)
Screen.MousePointer = vbDefault
MsgBox " Datos copiados ", vbInformation
Exit Sub
'Error
ErrSub:
Call Descargar_Objetos(rst_Ado, cn_Ado, Obj_Excel, Obj_Hoja)
MsgBox Err.Description, vbCritical
Screen.MousePointer = vbDefault
End Sub
Código:
Sub Descargar_Objetos(rst_Ado As ADODB.Recordset, cn_Ado As ADODB.Connection, _
Obj_Excel As Object, Obj_Hoja As Object)
Set rst_Ado = Nothing
cn_Ado.Close
Set cn_Ado = Nothing
Obj_Excel.ActiveWorkbook.Close False
Obj_Excel.Quit
Set Obj_Hoja = Nothing
Set Obj_Excel = Nothing
End Sub
Al parecer todo funcioona bien, ya que ejecuto el programa y no me envía algún mensaje de error. Sin embargo, cuando abró la base de datos para ver si en verdad se guardó la información, me encuentro con que está vacía
Ya verifiqué que los direccionamientos estén correctos, ya habilité el
DAO Library 2.6 o 2.8. Uso
Visual Basic 6 y el archivo de
Excel está en la versión 2003.
Ahora, sólo como
informativo: Tengo en el
frame1, un
listbox y un
botón, que funcionan de la siguiente manera: en el
listbox selecciono sólo archivos de texto (el archivo de texto contiene información en lineas, los campos están separados por una coma), al pulsar el botón, convierte el archivo en archivo de
Excel (
v 2003) que es el que uso para el
frame2. El paso de conversión lo hace correcto, verifico el archivo de excel y es creado correctamente.
Algo más, en la carpeta donde reciden los archivos me creo un archivo tipo LOG, que dice lo siguiente:
Cita: Línea 198: la clase MSAdodcLib.Adodc del control Adodc1 no era una clase de control cargada.
Línea 203: el nombre de la propiedad _ExtentX de Adodc1 no es válido.
Línea 204: el nombre de la propiedad _ExtentY de Adodc1 no es válido.
Línea 205: el nombre de la propiedad ConnectMode de Adodc1 no es válido.
Línea 206: el nombre de la propiedad CursorLocation de Adodc1 no es válido.
Línea 207: el nombre de la propiedad IsolationLevel de Adodc1 no es válido.
Línea 208: el nombre de la propiedad ConnectionTimeout de Adodc1 no es válido.
Línea 209: el nombre de la propiedad CommandTimeout de Adodc1 no es válido.
Línea 210: el nombre de la propiedad CursorType de Adodc1 no es válido.
Línea 211: el nombre de la propiedad LockType de Adodc1 no es válido.
Línea 212: el nombre de la propiedad CommandType de Adodc1 no es válido.
Línea 213: el nombre de la propiedad CursorOptions de Adodc1 no es válido.
Línea 214: el nombre de la propiedad CacheSize de Adodc1 no es válido.
Línea 215: el nombre de la propiedad MaxRecords de Adodc1 no es válido.
Línea 216: el nombre de la propiedad BOFAction de Adodc1 no es válido.
Línea 217: el nombre de la propiedad EOFAction de Adodc1 no es válido.
Línea 218: el nombre de la propiedad ConnectStringType de Adodc1 no es válido.
Línea 222: el nombre de la propiedad Orientation de Adodc1 no es válido.
Línea 224: el nombre de la propiedad Connect de Adodc1 no es válido.
Línea 225: el nombre de la propiedad OLEDBString de Adodc1 no es válido.
Línea 226: el nombre de la propiedad OLEDBFile de Adodc1 no es válido.
Línea 227: el nombre de la propiedad DataSourceName de Adodc1 no es válido.
Línea 228: el nombre de la propiedad OtherAttributes de Adodc1 no es válido.
Línea 229: el nombre de la propiedad UserName de Adodc1 no es válido.
Línea 230: el nombre de la propiedad Password de Adodc1 no es válido.
Línea 231: el nombre de la propiedad RecordSource de Adodc1 no es válido.
Línea 232: el nombre de la propiedad Caption de Adodc1 no es válido.
Línea 242: el nombre de la propiedad _Version de Adodc1 no es válido.
Tal véz estoy usando un método errónea o la lógica no es la adecuada, que creen que sea?
Saludos a todos.