Importar dados de uma pasta de trabalho fechada (ADO) usando VBA no Microsoft Excel

Anonim

Se você deseja importar muitos dados de uma pasta de trabalho fechada, pode fazer isso com o ADO e a macro abaixo.
Se você deseja recuperar dados de outra planilha diferente da primeira planilha na pasta de trabalho fechada,
você deve se referir a um intervalo nomeado definido pelo usuário. A macro abaixo pode ser usada assim (no Excel 2000 ou posterior):

GetDataFromClosedWorkbook "C: \ FolderName \ WorkbookName.xls", "A1: B21", ActiveCell, False GetDataFromClosedWorkbook "C: \ FolderName \ WorkbookName.xls", "MyDataRange", Range ("B3"), True Sub GetDataFromClosedWorkbook "C: \ FolderName \ WorkbookName.xls", "MyDataRange", Range ("B3"), True Sub GetDataFromClosedWorkbook (SourceFile As String, SourceRange As String, _ TargetRange As Range, IncludeFieldNames As Boolean) 'requer uma referência à biblioteca Microsoft ActiveX Data Objects' se SourceRange for uma referência de intervalo: 'isso retornará dados da primeira planilha em SourceFile' se SourceRange for um referência de nome definido: 'isso retornará dados de qualquer planilha em SourceFile' SourceRange deve incluir os cabeçalhos de intervalo 'Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String Dim TargetCell As Range, i As Integer dbConnectionString = "DRIVER = {Driver Microsoft Excel (* .xls)}; " & _ "ReadOnly = 1; DBQ =" & SourceFile Set dbConnection = New ADODB.Connection On Error GoTo InvalidInput dbConnection.Open dbConnectionString 'abrir a conexão de banco de dados Set rs = dbConnection.Execute ("[" & SourceRange & "]") Definir 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 Defina TargetCell = TargetCell .Offset (1, 0) End If TargetCell.CopyFromRecordset rs rs.Close dbConnection.Close 'fecha a conexão do banco de dados Set TargetCell = Nothing Set rs = Nothing Set dbConnection = Nothing On Error GoTo 0 Exit Sub InvalidInput: MsgBox "O arquivo de origem ou o intervalo de origem é inválido! ", _ vbExclamation," Obter dados da pasta de trabalho fechada "End Sub

Outro método que não usa o método CopyFromRecordSet Com a macro abaixo você pode realizar a importação e ter melhor controle sobre os resultados retornados do RecordSet.

Sub TestReadDataFromWorkbook () 'preenche dados de uma pasta de trabalho fechada na célula ativa Dim tArray As Variant, r As Long, c As Long tArray = ReadDataFromWorkbook ("C: \ FolderName \ SourceWbName.xls", "A1: B21")' sem transpor '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) 'Próximo c' Próximo r 'transpondo 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) Próximo c Próximo r End Sub Função privada ReadDataFromWorkbook (SourceFile As String, SourceRange As String) As Variant 'requer uma referência à biblioteca Microsoft ActiveX Data Objects 'se SourceRange for uma referência de intervalo:' esta função só pode retornar dados da primeira planilha em SourceFile 'se SourceRange for uma referência de nome definida:' esta função pode retornar dados de m qualquer planilha em SourceFile 'SourceRange deve incluir os exemplos de cabeçalhos de intervalo:' 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 As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString AsString =" DRIVER " {Driver do Microsoft Excel (* .xls)}; ReadOnly = 1; DBQ = "& SourceFile Set dbConnection = New ADODB.Connection em erro GoTo InvalidInput dbConnection.Open dbConnectionString 'abre a conexão de banco de dados Set rs = dbConnection.Execute (" [" & SourceRange & "]") Em caso de erro GoTo 0 ReadDataFromWorkbook = rs.GetRows 'retorna uma matriz de dois dim com todos os registros em rs rs.Close dbConnection.Close' feche a conexão de banco de dados Set rs = Nothing Set dbConnection = Nothing On Error GoTo 0 Função de saída InvalidInput: MsgBox "O arquivo de origem ou o intervalo de origem é inválido! ", vbExclamation," Obter dados da pasta de trabalho fechada "Set rs = Nothing Set dbConnection = Nothing End Function

O exemplo de macro pressupõe que seu projeto VBA adicionou uma referência à biblioteca de objetos ADO.
Você pode fazer isso de dentro do VBE selecionando o menu Ferramentas, Referências e selecionando Microsoft
Biblioteca de objetos ActiveX Data Objects x.x.
Use ADO se você puder escolher entre ADO e DAO para importação ou exportação de dados.