Se vuoi importare molti dati da una cartella di lavoro chiusa, puoi farlo con ADO e la macro sottostante.
Se vuoi recuperare i dati da un altro foglio di lavoro rispetto al primo foglio di lavoro nella cartella di lavoro chiusa,
devi fare riferimento a un intervallo denominato definito dall'utente. La macro seguente può essere utilizzata in questo modo (in Excel 2000 o versioni successive):
GetDataFromClosedWorkbook "C:\FolderName\WorkbookName.xls", "A1:B21", ActiveCell, False GetDataFromClosedWorkbook "C:\FolderName\WorkbookName.xls", "MyDataRange", Range ("B3"), True Sub GetDataFromClosedWorkbook(SourceFile As String, SourceRange As String, _ TargetRange As Range, IncludeFieldNames As Boolean) ' richiede un riferimento alla libreria Microsoft ActiveX Data Objects ' se SourceRange è un riferimento di intervallo: ' questo restituirà i dati dal primo foglio di lavoro in SourceFile ' se SourceRange è un riferimento nome definito: ' questo restituirà i dati da qualsiasi foglio di lavoro in SourceFile ' SourceRange deve includere le intestazioni dell'intervallo ' 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 ' apre la connessione al database 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 ' chiude la connessione al database Set TargetCell = Nothing Set rs = Nothing Set dbConnection = Nothing On Error GoTo 0 Exit Sub InvalidInput: MsgBox "Il file di origine o l'intervallo di origine non è valido!", _ vbExclamation, "Ottieni dati dalla cartella di lavoro chiusa" End Sub
Un altro metodo che non utilizza il metodo CopyFromRecordSet Con la macro sottostante è possibile eseguire l'importazione e avere un controllo migliore sui risultati restituiti dal RecordSet.
Sub TestReadDataFromWorkbook() ' riempie i dati da una cartella di lavoro chiusa nella cella attiva Dim tArray As Variant, r As Long, c As Long tArray = ReadDataFromWorkbook("C:\FolderName\SourceWbName.xls", "A1:B21") ' senza trasporre ' 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) ' Next c ' Next r ' con trasposizione tArray = Application.WorksheetFunction.Transpose(tArray) Per r = LBound(tArray, 1) A UBound(tArray, 1) Per c = LBound(tArray, 2) A UBound (tArray, 2) ActiveCell.Offset(r - 1, c - 1).Formula = tArray(r, c) Next c Next r End Sub Private Function ReadDataFromWorkbook(SourceFile As String, SourceRange As String) As Variant ' richiede un riferimento alla libreria Microsoft ActiveX Data Objects ' se SourceRange è un riferimento di intervallo: ' questa funzione può restituire solo i dati dal primo foglio di lavoro in SourceFile ' se SourceRange è un riferimento di nome definito: ' questa funzione può restituire i dati per m qualsiasi foglio di lavoro in SourceFile ' SourceRange deve includere le intestazioni di intervallo ' esempi: ' 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 As String dbConnectionString = "DRIVER= {Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & SourceFile Set dbConnection = New ADODB.Connection On Error GoTo InvalidInput dbConnection.Open dbConnectionString ' apre la connessione al database Set rs = dbConnection.Execute("[" & SourceRange & "]") On Error GoTo 0 ReadDataFromWorkbook = rs.GetRows ' restituisce un array di due dimensioni con tutti i record in rs rs.Close dbConnection.Close ' chiude la connessione al database Set rs = Nothing Imposta dbConnection = Nothing On Error GoTo 0 Funzione di uscita InvalidInput: MsgBox "Il file sorgente o l'intervallo di origine non è valido!", vbExclamation, "Ottieni dati dalla cartella di lavoro chiusa" Set rs = Nothing Set dbConnection = Nothing End Function
L'esempio di macro presuppone che il progetto VBA abbia aggiunto un riferimento alla libreria di oggetti ADO.
Puoi farlo dall'interno del VBE selezionando il menu Strumenti, Riferimenti e selezionando Microsoft
Oggetti dati ActiveX x.x libreria di oggetti.
Usa ADO se puoi scegliere tra ADO e DAO per l'importazione o l'esportazione dei dati.