Importar datos de un libro cerrado (ADO) usando VBA en Microsoft Excel

Anonim

Si desea importar una gran cantidad de datos de un libro de trabajo cerrado, puede hacerlo con ADO y la macro a continuación.
Si desea recuperar datos de otra hoja de trabajo que no sea la primera hoja de trabajo del libro cerrado,
tiene que hacer referencia a un rango con nombre definido por el usuario. La siguiente macro se puede utilizar así (en Excel 2000 o posterior):

GetDataFromClosedWorkbook "C: \ FolderName \ WorkbookName.xls", "A1: B21", ActiveCell, False GetDataFromClosedWorkbook "C: \ FolderName \ WorkbookName.xls", "MyDataRange", Rango ("B3"), True Sub GetDataFromClosedWorkbook (Fuente String, SourceRange As String, _ TargetRange As Range, IncludeFieldNames As Boolean) 'requiere una referencia a la biblioteca de Microsoft ActiveX Data Objects' si SourceRange es una referencia de rango: 'esto devolverá datos de la primera hoja de trabajo en SourceFile' si SourceRange es un referencia de nombre definido: 'esto devolverá datos de cualquier hoja de trabajo en SourceFile' SourceRange debe incluir los encabezados de rango 'Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String Dim TargetCell As Range, i As Integer dbConnectionString = "DRIVER = {Controlador de Microsoft Excel (* .xls)}; " & _ "ReadOnly = 1; DBQ =" & SourceFile Set dbConnection = New ADODB.Connection On Error GoTo InvalidInput dbConnection.Open dbConnectionString 'abre la conexión de base de datos Set rs = dbConnection.Execute ("[" & SourceRange & "]") Set TargetCell = TargetRange.Cells (1, 1) If IncludeFieldNames Then For i = 0 To rs.Fields.Count - 1 TargetCell.Offset (0, i) .Formula = rs.Fields (i) .Name Next i Set TargetCell = TargetCell .Offset (1, 0) End If TargetCell.CopyFromRecordset rs rs.Close dbConnection.Close 'cerrar la conexión de la base de datos Establecer TargetCell = Nothing Establecer rs = Nothing Establecer dbConnection = Nothing On Error GoTo 0 Salir Sub InvalidInput: MsgBox "El archivo de origen o ¡el rango de origen no es válido! ", _ vbExclamation," Obtener datos del libro cerrado "End Sub

Otro método que no usa el método CopyFromRecordSet Con la macro siguiente puede realizar la importación y tener un mejor control sobre los resultados devueltos por RecordSet.

Sub TestReadDataFromWorkbook () 'llena los datos de un libro cerrado en la celda activa Dim tArray As Variant, r As Long, c As Long tArray = ReadDataFromWorkbook ("C: \ FolderName \ SourceWbName.xls", "A1: B21")' sin transponer 'For r = LBound (tArray, 2) To UBound (tArray, 2)' For c = LBound (tArray, 1) To UBound (tArray, 1) 'ActiveCell.Offset (r, c) .Formula = tArray ( c, r) 'Siguiente c' Siguiente r 'con transposición tArray = Application.WorksheetFunction.Transpose (tArray) For r = LBound (tArray, 1) To UBound (tArray, 1) For c = LBound (tArray, 2) To UBound (tArray, 2) ActiveCell.Offset (r - 1, c - 1) .Formula = tArray (r, c) Siguiente c Siguiente r Fin Sub Función privada ReadDataFromWorkbook (SourceFile como cadena, SourceRange como cadena) Como variante 'requiere una referencia a la biblioteca de Microsoft ActiveX Data Objects 'si SourceRange es una referencia de rango:' esta función solo puede devolver datos de la primera hoja de trabajo en SourceFile 'si SourceRange es una referencia de nombre definida:' esta función puede devolver datos para m cualquier hoja de trabajo en SourceFile 'SourceRange debe incluir los encabezados de rango' ejemplos: 'varRecordSetData = ReadDataFromWorkbook ("C: \ FolderName \ SourceWbName.xls", "A1: A21")' varRecordSetData = ReadDataFromWorkbook ("C: \ FolderName \ SourceWbName. xls "," A1: B21 ") 'varRecordSetData = ReadDataFromWorkbook (" C: \ FolderName \ SourceWbName.xls "," DefinedRangeName ") Dim dbConnection como ADODB.Connection, rs como ADODB.Recordset Dim dbConnectionString String DRing db =" {Microsoft Excel Driver (* .xls)}; ReadOnly = 1; DBQ = "& SourceFile Set dbConnection = New ADODB.Connection On Error GoTo InvalidInput dbConnection.Open dbConnectionString 'abre la conexión de base de datos Set rs = dbConnection.Execute (" [" & SourceRange & "]") En caso de error Ir a 0 ReadDataFromWorkbook = rs.GetRows 'devuelve una matriz de dos dim con todos los registros en rs rs.Close dbConnection.Close' cerrar la conexión de base de datos Establecer rs = Nada Establecer dbConnection = Nada en error Ir a 0 Función de salida InvalidInput: MsgBox "El archivo de origen o el rango de origen no es válido ", vbExclamation," Obtener datos del libro cerrado "Establecer rs = Nada Establecer dbConnection = Nada Finalizar función

El ejemplo de macro asume que su proyecto de VBA ha agregado una referencia a la biblioteca de objetos ADO.
Puede hacer esto desde dentro del VBE seleccionando el menú Herramientas, Referencias y seleccionando Microsoft
Biblioteca de objetos ActiveX Data Objects x.x.
Utilice ADO si puede elegir entre ADO y DAO para importar o exportar datos.