it-swarm.it

Copia i dati da un'altra cartella di lavoro tramite VBA

Ragazzi ecco cosa voglio fare e ho un po 'di problemi a farlo . Ho 1 cartella di lavoro in cui voglio raccogliere dati da file diversi facendo qualcosa di simile. 

Do While THAT_DIFFERENT_FILE_SOMEWHERE_ON_MY_HDD.Cells(Rand, 1).Value <> "" And Rand < 65536
        then 'I will search if the last row in my main worksheet is in this file... 
End Loop           

Se lo è, lascerò ilWhileLoop, se non lo farò, copierò tutto. In realtà questo non funzionerà come voglio ma non avrò problemi a trovare l'algoritmo giusto. 

Il mio problema è che non so come accedere a diverse cartelle di lavoro.

15
Andrei Ion

Ti potrebbe piacere la funzione GetInfoFromClosedFile ()


Modifica: Poiché il collegamento sopra non sembra funzionare più, sto aggiungendo link alternativo 1 e codice alternativo 2 + codice: 

Private Function GetInfoFromClosedFile(ByVal wbPath As String, _
    wbName As String, wsName As String, cellRef As String) As Variant
Dim arg As String
    GetInfoFromClosedFile = ""
    If Right(wbPath, 1) <> "" Then wbPath = wbPath & ""
    If Dir(wbPath & "" & wbName) = "" Then Exit Function
    arg = "'" & wbPath & "[" & wbName & "]" & _
        wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
    On Error Resume Next
    GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
End Function
7
Patrick Honorez

Il modo migliore (e più semplice) per copiare i dati da una cartella di lavoro a un'altra è utilizzare il modello a oggetti di Excel.

Option Explicit
Sub test()
    Dim wb As Workbook, wb2 As Workbook
    Dim ws As Worksheet
    Dim vFile As Variant

    'Set source workbook
    Set wb = ActiveWorkbook
    'Open the target workbook
    vFile = Application.GetOpenFilename("Excel-files,*.xls", _
        1, "Select One File To Open", , False)
    'if the user didn't select a file, exit sub
    If TypeName(vFile) = "Boolean" Then Exit Sub
    Workbooks.Open vFile
    'Set targetworkbook
    Set wb2 = ActiveWorkbook

    'For instance, copy data from a range in the first workbook to another range in the other workbook
    wb2.Worksheets("Sheet2").Range("C3:D4").Value = wb.Worksheets("Sheet1").Range("A1:B2").Value
End Sub
14
JMax

C'è ben poco motivo per non aprire più cartelle di lavoro in Excel. Le principali linee di codice sono:

Application.EnableEvents = False
Application.ScreenUpdating = False

... quindi non vedrai nulla durante l'esecuzione del codice e non verrà eseguito alcun codice associato all'apertura della seconda cartella di lavoro. Poi ci sono ...

Application.DisplayAlerts = False
Application.Calculation = xlManual

... in modo da impedirti di ricevere messaggi pop-up associati al contenuto del secondo file e di evitare qualsiasi lento ricalcolo. Assicurati di tornare a True/xlAutomatic alla fine della tua programmazione

Se aprire la seconda cartella di lavoro non causerà problemi di prestazioni, si potrebbe anche farlo. In effetti, avere la seconda cartella di lavoro aperta renderà molto vantaggioso il tentativo di eseguire il debug del codice se alcuni dei file secondari non sono conformi al formato previsto

Ecco alcune indicazioni di esperti sull'uso di più file Excel che forniscono una panoramica dei diversi metodi disponibili per i dati di riferimento

Una domanda di estensione sarebbe come passare in rassegna più file contenuti nella stessa cartella. Puoi utilizzare il selettore di cartelle di Windows utilizzando:

With Application.FileDialog(msoFileDialogFolderPicker)
.Show
     If .Selected.Items.Count = 1 the InputFolder = .SelectedItems(1)
End With

FName = VBA.Dir(InputFolder)

Do While FName <> ""
'''Do function here
FName = VBA.Dir()
Loop

Spero che alcuni di questi saranno utili

5
Ed Bolton

Stai cercando la sintassi per aprirli:

Dim wkbk As Workbook

Set wkbk = Workbooks.Open("C:\MyDirectory\mysheet.xlsx")

Quindi, puoi usare wkbk.Sheets(1).Range("3:3") (o qualsiasi altra cosa tu abbia bisogno)

4
jonsca

Ho avuto la stessa domanda ma l'applicazione delle soluzioni fornite ha modificato il file in cui scrivere. Una volta selezionato il nuovo file Excel, scrivevo anche in quel file e non nel mio file originale. La mia soluzione per questo problema è la seguente:

Sub GetData()

    Dim excelapp As Application
    Dim source As Workbook
    Dim srcSH1 As Worksheet
    Dim sh As Worksheet
    Dim path As String
    Dim nmr As Long
    Dim i As Long

    nmr = 20

    Set excelapp = New Application

    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = False
        .Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls; *.xlsb", 1
        .Show
        path = .SelectedItems.Item(1)
    End With

    Set source = excelapp.Workbooks.Open(path)
    Set srcSH1 = source.Worksheets("Sheet1")
    Set sh = Sheets("Sheet1")

    For i = 1 To nmr
        sh.Cells(i, "A").Value = srcSH1.Cells(i, "A").Value
    Next i

End Sub

Con excelapp verrà chiamata una nuova applicazione. Il blocco with imposta il percorso per il file esterno. Infine, ho impostato la cartella di lavoro esterna con source e srcSH1 come foglio di lavoro all'interno del foglio esterno.

0
Alex_P