Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    3

    [VBA] Copiare 50 file Excel in un unico file

    Buongiorno a tutti,ù
    premettendo la mia poca conoscenza del VBA, ho da poco imparato a fare dei brevi codice che, comunque, risultano di una efficacia incredibile. Desideravo chiedervi una soluzione o comunque un'indicazione per risolvere un problema:
    - ho circa 50 file in excel che devo processare;
    - di questi 50 file devo copiare un foglio, nome foglio "VR_Mansione" (nome uguale per tutti e 50 i file);
    - i file sono elencati in un file riassuntivo (file di destinazione) e, a partire dalla colonna "b3" del foglio "elencoVR" ho inserito i collegamenti ipertestuali dei file (indirizzi completi dei 50 file che devo processare);
    - devo aprire i 50 file, copiare il foglio "VR_Mansione" e chiudere i file;
    - tutti i dati dei 50 fogli "VR Mansione" devono essere scritti in un unico foglio del file riassuntivo nominato "tutte".

    Ho provato a fare un codice inserendo solo due dei cinquanta file: ecco il codice (che per due soli file funziona)


    codice:
    Sub copia() 'copia tutte le vr mansione presenti su un unico foglio 
    Dim Riassunto As Workbook
    Dim wk1 As Workbook
    Dim wk2 As Workbook 
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim dest1 As Worksheet
    Dim N1, N2, As String
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False 
    Set Riassunto = ThisWorkbook
    
    N1 = Riassunto.Worksheets("elencoVR").Range("B3").Value 'l'indirizzo lo prendo dall'elenco del primo foglio colonna "b"
    N2 = Riassunto.Worksheets("elencoVR").Range("B4").Value
    
    Set wk1 = Workbooks.Open(N1)
    Set wk2 = Workbooks.Open(N2)
    
    Set dest1 = Riassunto.Worksheets("Tutte") 'è il foglio di destinazione del file riassuntivo
     
    Set sh1 = wk1.Worksheets("VR_Mansione")
    Set sh2 = wk2.Worksheets("VR_Mansione")
     
    With sh1
    .Range("f4:M150").Copy Destination:=dest1.Range("a4")
    .Range("o4:z150").Copy Destination:=dest1.Range("j4")
    End With
     wk1.Close
     
    With sh2
    .Range("f4:M150").Copy Destination:=dest1.Range("a154")
    .Range("o4:z150").Copy Destination:=dest1.Range("j154")
    End With
    wk2.Close
      
     Application.ScreenUpdating = True
       
    End Sub

    Tutti funziona ma, ovviamente, non so come continuare. Teoricamente se i file fossero sempre tutti e 50 presenti ed elencati potrei aggiungere (con pazienza) tutte le istruzioni necessarie. Il problema è che i file sono di numero variabile e, quindi, spesso nella colonna "B" dell'elenco dei file non c'è quindi scritto niente. In questa situazione il codice non funziona.
    Andrebbe bene anche indicarmi una metodologia per procedere e poi passerei un po' di tempo a studiarci su nonostante l'età avanzata.
    Grazie.
    PS: VBA è veramente utilissimo e fenomenale.
    Ultima modifica di LeleFT; 15-12-2014 a 10:32 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da Bilio Visualizza il messaggio
    Buongiorno a tutti,ù
    premettendo la mia poca conoscenza del VBA, ho da poco imparato a fare dei brevi codice che, comunque, risultano di una efficacia incredibile. Desideravo chiedervi una soluzione o comunque un'indicazione per risolvere un problema:
    - ho circa 50 file in excel che devo processare;
    - di questi 50 file devo copiare un foglio, nome foglio "VR_Mansione" (nome uguale per tutti e 50 i file);
    - i file sono elencati in un file riassuntivo (file di destinazione) e, a partire dalla colonna "b3" del foglio "elencoVR" ho inserito i collegamenti ipertestuali dei file (indirizzi completi dei 50 file che devo processare);
    - devo aprire i 50 file, copiare il foglio "VR_Mansione" e chiudere i file;
    - tutti i dati dei 50 fogli "VR Mansione" devono essere scritti in un unico foglio del file riassuntivo nominato "tutte".

    Ho provato a fare un codice inserendo solo due dei cinquanta file: ecco il codice (che per due soli file funziona)

    Sub copia() 'copia tutte le vr mansione presenti su un unico foglio
    Dim Riassunto As Workbook
    Dim wk1 As Workbook
    Dim wk2 As Workbook
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim dest1 As Worksheet
    Dim N1, N2, As String
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set Riassunto = ThisWorkbook

    N1 = Riassunto.Worksheets("elencoVR").Range("B3").Value 'l'indirizzo lo prendo dall'elenco del primo foglio colonna "b"
    N2 = Riassunto.Worksheets("elencoVR").Range("B4").Value

    Set wk1 = Workbooks.Open(N1)
    Set wk2 = Workbooks.Open(N2)

    Set dest1 = Riassunto.Worksheets("Tutte") 'è il foglio di destinazione del file riassuntivo

    Set sh1 = wk1.Worksheets("VR_Mansione")
    Set sh2 = wk2.Worksheets("VR_Mansione")

    With sh1
    .Range("f4:M150").Copy Destination:=dest1.Range("a4")
    .Range("o4:z150").Copy Destination:=dest1.Range("j4")
    End With
    wk1.Close

    With sh2
    .Range("f4:M150").Copy Destination:=dest1.Range("a154")
    .Range("o4:z150").Copy Destination:=dest1.Range("j154")
    End With
    wk2.Close

    Application.ScreenUpdating = True

    End Sub

    Tutti funziona ma, ovviamente, non so come continuare. Teoricamente se i file fossero sempre tutti e 50 presenti ed elencati potrei aggiungere (con pazienza) tutte le istruzioni necessarie. Il problema è che i file sono di numero variabile e, quindi, spesso nella colonna "B" dell'elenco dei file non c'è quindi scritto niente. In questa situazione il codice non funziona.
    Andrebbe bene anche indicarmi una metodologia per procedere e poi passerei un po' di tempo a studiarci su nonostante l'età avanzata.
    Grazie.
    PS: VBA è veramente utilissimo e fenomenale.
    Ciao
    Non ha senso scrivere 50 volte le stesse istruzioni.. per questo esistono i cicli.
    Guardati degli esempi di istruzioni Do Loop o For Next..
    Sono fatti apposta per risolvere situazioni come queste...
    Direi che devi fare un ciclo che legge l'indirizzo del file VR_Mansione, apre il file estrae i dati e te li incolla dove vuoi tu e poi ripeti..
    Guardati anche la sintassi dell'istruzione cells(row,column) che ti permette di accedere ai valori delle celle passandogli coordinate riga/colonna, un po come battaglia navale!

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    3
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Ciao
    Non ha senso scrivere 50 volte le stesse istruzioni.. per questo esistono i cicli.
    Guardati degli esempi di istruzioni Do Loop o For Next..
    Sono fatti apposta per risolvere situazioni come queste...
    Direi che devi fare un ciclo che legge l'indirizzo del file VR_Mansione, apre il file estrae i dati e te li incolla dove vuoi tu e poi ripeti..
    Guardati anche la sintassi dell'istruzione cells(row,column) che ti permette di accedere ai valori delle celle passandogli coordinate riga/colonna, un po come battaglia navale!

    il ciclo for next l'ho già utilizzata ma sullo stesso foglio (ad esempio per nascondere/cancellare righe) ma non sono riuscito ad applicarli nel mio caso.
    La sintassi cells(row, column) la conosco
    Proverò a studiare meglio i cicli.
    Puoi indicarmi un esempio che posso utilizzare per studiare?
    Grazie mille comunque

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da Bilio Visualizza il messaggio
    il ciclo for next l'ho già utilizzata ma sullo stesso foglio (ad esempio per nascondere/cancellare righe) ma non sono riuscito ad applicarli nel mio caso.
    La sintassi cells(row, column) la conosco
    Proverò a studiare meglio i cicli.
    Puoi indicarmi un esempio che posso utilizzare per studiare?
    Grazie mille comunque
    Direi che un esempio dell'implementazione dei ciclo for è questa:
    Se ad esempio nella colonna B (cioè 3) hai gli indirizzi dei fogli esterni da copiare, puoi fare banalmente così:
    codice:
    dim r,l as integer 'contatori
    dim N1 as string
    for r = 1 to 51 '(le righe e le colonne sono array a base 1, nel tuo caso hai 50 file
       N1= Riassunto.Worksheets("elencoVR").cells(r,c).value 'nome del file da copiare
    Set wk1 = Workbooks.Open(N1)
    Set sh1 = wk1.Worksheets("VR_Mansione")
    
    With sh1
    .Range("f4:M150").Copy Destination:=dest1.Range("a4")
    .Range("o4:z150").Copy Destination:=dest1.Range("j4")
    End With
    wk1.Close
    next r 'ripeti il tutto per il 2 file
    Questo è un pezzo di codice grossolano scritto direttamente qua.
    TU dici che il problema sta nell'aprire i file giusti, nel sapere quanti sono ecc..
    Guarda questo link, l'esempio numero 6.
    Puoi definire una directory contenente tutti i tuoi file da incollare e col codice nell'esempio 6 li scrivi dove ti serve e po li apri uno alla volta e fai quello che ti serve..
    Ultima modifica di renygade; 13-12-2014 a 00:55

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    3
    Grazie mille!!!! Ieri sera mi sono messo a "studiare" fino all'una di notte ed ho capito bene il funzionamento del ciclo for next.
    Poi stamane ho preso il tuo codice, l'ho adattato (tra le altre cose, per indicare la destinazione, ho aggiunto l'istruzione .End(xlUp).Offset(1, 0) per scrivere i fogli uno sotto l'altro) e funziona alla grande.
    In pochi secondi, ed avendo da tempo predisposto i file sorgente in un certo modo, faccio un lavoro per il quale prima ci voleva un mese di lavoro (e non sto scherzando).
    Sei mitico.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da Bilio Visualizza il messaggio
    Sei mitico.

    Mica io.. VBA e un po' di studio e determinazione...
    alla prossima!

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    @Bilio: non puoi inserirti nelle discussioni altrui con un tuo quesito che nulla ha a che fare con quello originale, ma devi aprire una nuova discussione. Ho spostato il tutto in una nuova discussione.

    Inoltre, il codice va postato all'interno degli appositi tag [CODE] ... [/CODE] per mantenere indentazione e formattazione. Ho corretto io anche questo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.