Estrazione automatica fogli



  • Estrazione automatica fogli
    di Criap (utente non iscritto) data: 22/01/2010

    Salve a tutti,
    questo è il mio primo post.

    vi scrivo per sottoporvi il mio problema al fine di trovare qualche utente in grado di passarmi la propria esperienza per risolverlo.
    per questo vi ringrazio anticipatamente per la pazienza che dedicherete alla lettura del mio post.

    problema:

    generare tanti file excel quanti sono i fogli di lavoro di un certo file originario.

    esempio pratico:

    ho un file excel con 30 fogli di lavoro.
    voglio estrarre tali fogli per avere le informazioni in essi contenute salvate in 30 files excel distinti.
    tali 30 files excel devono avere come nome il nome del foglio di lavoro.

    vorrei sapere se esiste una modalità automatica per eseguire tale operazione.

    ho già provato a procedere registrando una macro che estraesse un primo foglio di lavoro e lo salvasse in un file excel con nome uguale al foglio stesso. successivamente, ho lavorato con la macro e l'ho elaborata in modo che divenisse una macro in grado di estrarre tutti i fogli dall'excel.

    questa procedura però è un pò troppo laboriosa nel caso debba applicarla ad un numero elevato di excel contenenti fogli aventi tutti nomi differenti.
    si richiederebbe infatti l'adattamento della macro al cambiamento dei nomi dei fogli di lavoro e al loro numero totale.

    esempio:

    ho 1000 file excel.
    ognuno di essi ha un numero di fogli di lavoro variabile tra 5 e 80.
    ogni file excel ha fogli di lavoro con nomi differenti rispetto agli altri.
    devo fare in modo di avere un totale di tanti file excel quanti sono i fogli di lavoro complessivi.
    i file finali dovranno avere lo stesso nome del foglio di lavoro da cui sono stati generati.

    e' prevista una procedura automatica per fare ciò?

    ringraziandovi ancora per la vostra attenzione, aspetto una vostra gentile risposta.

    emanuele



  • di Baz (utente non iscritto) data: 22/01/2010

    Ciao,
    innanzitutto benvenuto nel forum

    sarebbe stato bello avessi esposto i tuoi risultati/tentativi in modo da modificare quanto da te ottenuto per capire, forse meglio, dove andare a modificare la macro.

    cmq prova il seguente codice da inserire un modulo di un file qualunque; quello che importa è il file attivo al momento del lancio della macro.

    modifica il percorso (variabile mypath) nella destinazione dei tui files

    ciao

     
    Sub SalvaFogli()
    Dim n As Long
    Dim myNome As String
    Dim myPath As String
    
    myPath = "C:Temp"     'da modificare
    With ActiveWorkbook
        For n = 1 To .Sheets.Count
            myNome = .Sheets(n).Name
            .Sheets(n).Copy
        
            ActiveWorkbook.SaveAs Filename:=myPath & myNome
            ActiveWorkbook.Close
        Next n
    End With
    MsgBox "Sono stati creati " & n - 1 & " files"
    
    End Sub
    



  • di Criap (utente non iscritto) data: 22/01/2010

    Grazie mille per la considerazione del mio post!

    allora...

    avrei potuto mettere la macro...ma non l'ho fatto volutamente per non influenzare nelle risposte...se lo ritieni utile, posso tranquillamente inserire il codice...

    comunque, nel leggere il codice che hai riportato e che non ho testato ho notato che forse non risolve il mio problema.

    infatti, la tua macro necessita di sapere il nome del foglio di lavoro a estrarre...e quindi proprio per questo non può essere applicata fintanto che manualmente non si sia inserito tale nome.

    quello che mi chiedevo con il post era proprio questo:

    e' possibile attivare una procedura totalmente automatica con la quale andare a leggere il nome dei vari fogli di lavoro e creare così tanti excel distinti aventi come nome il nome del foglio stesso?




  • di Criap (utente non iscritto) data: 22/01/2010

    ...

    cvd

    prima di aprire bocca...collega il cervello... :)

    allora sto eseguendo la macro...

    mi scuso con baz...ma non avevo capito io quello che mi aveva scritto...

    appena ho finito il test...vi dico come è andata!

    grazie per ora baz!!!

    mitico!



  • di Baz (utente non iscritto) data: 22/01/2010

    Ciao,
    in conclusione non ho cpait ose ti va bene così e se necessita di modifiche...

    attendo i tuoi controlli



  • di Teovba (utente non iscritto) data: 22/01/2010

    Ciao, prova a vedere se va bene cosi', imposti la cartella in cui hai tutti i file xls e si arrangia ad aprirti tutti i file ed a rinominare i fogli come singoli file..fammi sapere.
    matteo
     
    Function SeparaFogli(strPath, File)
    '@@utilities@@ i fogli contenuti in una cartella xls diventano singoli file xls (chiede dove salvarli)
    Dim ChDir, NomeFile, StrCartella, Vuoi As String
    Workbooks.Open Filename:=strPath & "" & File
    NomeF = ActiveWorkbook.Name
       MsgBox (NomeF)
       
    ChDir = ActiveWorkbook.Path
        Vuoi = MsgBox("Salvo in questa Cartella->" & ChDir & "?", vbYesNo)
     
        If Vuoi = vbNo Then
        On Error Resume Next
        Set FD = Application.FileDialog(msoFileDialogFolderPicker)
        With FD
           
            If .Show = False Then
            Exit Function
            End If
            StrCartella = .SelectedItems(1)
            End With
        If StrCartella <> "" Then
        ChDir = StrCartella
        End If
        End If
       
    For g = 1 To Sheets.Count
    
       Worksheets(g).Activate
        ActiveSheet.Select
        ActiveSheet.Copy
    NomeFile = NomeF & "_" & ActiveSheet.Name & ".xls"
    
    
    
        ActiveWorkbook.SaveAs Filename:=ChDir & "" & NomeFile _
            , FileFormat:=xlNormal, password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
            
    ActiveWorkbook.Close
        Windows(NomeF).Activate
        Next
        ActiveWorkbook.Close
    End Function
    Sub ElencaFile()
    ' Elenca tutti i file in una cartella
    Dim objFso, objFolder, objFiles, strFolder, strFile
    ' impostare qui la cartella desiderata
    strPath = "c:prova"
         
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFso.GetFolder(strPath)
    Set objFiles = objFolder.Files
    
    For Each strFile In objFiles
    
    c = SeparaFogli(strPath, strFile.Name)
     
       
    Next
      
    Set objFso = Nothing
    Set objFolder = Nothing
    Set objFiles = Nothing
    
    End Sub
    


  • Problemi...
    di Criap (utente non iscritto) data: 22/01/2010

    Ho testato la macro..

    potenzialmente esegue quello che voglio!

    ci sono due aspetti che però vorrei capire:

    1 - come mai se il mio file di partenza ha 50 fogli, vengono generati 50 files ma non tutti excel? ovvero alcuni di essi non vengono riconosciuti come files excel.

    2 - ho modificato la macro come sotto:

    sub estrazione_fogli()

    dim n as long
    dim mynome as string
    dim mypath as string

    mypath = "c:estrazionefogli" 'da modificare
    with activeworkbook
    for n = 1 to .sheets.count
    mynome = .sheets(n).name
    .sheets(n).copy

    activeworkbook.saveas filename:=mynome
    activeworkbook.close
    next n
    end with
    msgbox "sono stati creati " & n - 1 & " files"

    end sub

    ovvero ho tolto al nome finale del file generato dal foglio di lavoro il path originale.

    la cosa bizzarra è che i file li salva in:

    c:usersemanueledocuments

    come posso fare per dire alla macro di salvare in una specifica cartella?



  • di Criap (utente non iscritto) data: 22/01/2010

    Contributo graditissimo e utilissimo per me..grazie teovba!!!

    un ultimo sforzo :)

    ci sarebbe modo di inserire qualche istruzione nel codice che hai passato in modo che quando va a salvare i singoli fogli esegua:

    la creazione di una nuova cartella con nome uguale al file excel di partenza e al suo interno vada a inserire i relativi fogli di lavoro?

    per il resto, ovvero la richiesta di conferma del salvataggio, è ottima così!

    grazie ancora!!!



  • di Baz (utente non iscritto) data: 22/01/2010

    Se dall'istruzione
    activeworkbook.saveas filename:=mypath & mynome
    togli la directory di destinazione "mypath"

    è ovvio che il sitema ti dsalvi il file in:
    c:usersemanueledocuments

    ______________

    per le modifiche alla macro di teovba lascio ovviamente a lui tale compito

    ciao



  • di Emh... (utente non iscritto) data: 22/01/2010

    Ciao baz!
    non per essere scortese...
    ma qual tipo di tentativo l'avevo già fatto...

    come puoi leggere dalla macro che ti ho postato, avevo tolto già "mypath &" dall'istruzione...

    non mi funzionava ugualmente...e tutt'ora non capisco perchè..

    comunque sei stato di grande aiuto per il mio problema!

    ti ringrazio ancora per la disponibilità e la cordialità accordatemi!

    ciao!



  • di Teovba (utente non iscritto) data: 23/01/2010

    Ciao,
    ho preferito rimodulare la mia macro non potendo lavorare online.. spero di aver capito: ora prende tutti i file in una determinata cartella ( ti chiede di selezionarla all'inizio) e poi procede creando per ogni singolo file una sua cartella e riempiendola con tutti i fogli..
    per quanto riguarda il fatto che alcuni file non erano salvati come xls posso chiederti che nome avevano?! nel senso che in presenza di caratteri particolari o spazi nei nomi dei fogli magari xls non salva correttamente..(e' una mia ipotesi..da verificare). bna notte,
     
    Function SeparaFogli(strPath, File, NuovaCartella)
    '@@utilities@@ i fogli contenuti in una cartella xls diventano singoli file xls (chiede dove salvarli)
    Dim ChDir, NomeFile, StrCartella, Vuoi As String
    'apre il file presente a questo indirizzo
    Workbooks.Open Filename:=strPath & "" & File
    NomeF = ActiveWorkbook.Name
     '  MsgBox (NomeF)
       
    
       
    For g = 1 To Sheets.Count
    
       Worksheets(g).Activate
        ActiveSheet.Select
        ActiveSheet.Copy
    NomeFile = NomeF & "_" & ActiveSheet.Name & ".xls"
    
    
    ' cartella in cui salvare i diversi fogli come file xls
        ActiveWorkbook.SaveAs Filename:=strPath & "" & NuovaCartella & "" & NomeFile _
            , FileFormat:=xlNormal, password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
            
    ActiveWorkbook.Close
        Windows(NomeF).Activate
        Next
        ActiveWorkbook.Close
    End Function
    Sub ElencaFile()
    ' Elenca tutti i file in una cartella
    Dim objFso, objFolder, objFiles, strFolder, strFile, ChDir, NomeFile, StrCartella, Vuoi
    
    ChDir = ActiveWorkbook.Path
    ' qui la macro chiede qual e' la cartella da selezionare
        Vuoi = MsgBox("Cartella in cui si trovano i file xls->" & ChDir & "?", vbYesNo)
     
        If Vuoi = vbNo Then
        On Error Resume Next
        Set FD = Application.FileDialog(msoFileDialogFolderPicker)
        With FD
           
            If .Show = False Then
            Exit Sub
            End If
            strPath = .SelectedItems(1)
            End With
        If strPath <> "" Then
        ChDir = strPath
        End If
        End If
         
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFso.GetFolder(ChDir)
    Set objFiles = objFolder.Files
    
    
    
    i = 0
    For Each strFile In objFiles
    ' mi ricavo il nome del file senza xls finale per creare le cartelle
    cd = Split(strFile.Name, ".")
    ' VERIFICO CHE SIA UN FILE XLS PRIMA DI PROCEDERE
        If cd(UBound(cd)) = "xls" Then
                NomeCart = cd(0)
            d = Crea_Cartella(ChDir, NomeCart)
            c = SeparaFogli(ChDir, strFile.Name, NomeCart)
                    i = i + 1
        End If
    Next
    MsgBox (" Processati " & i & " File xls")
    Set objFso = Nothing
    Set objFolder = Nothing
    Set objFiles = Nothing
    
    End Sub
    
    Function Crea_Cartella(Path, NomeCartella)
                Set fso = CreateObject("Scripting.FileSystemObject")
                Cartella = Path & "" & NomeCartella
                If Not fso.FolderExists(Cartella) Then
                fso.CreateFolder (Cartella)
                End If
    End Function



  • di Criap (utente non iscritto) data: 25/01/2010

    Grazie matteo!
    esaustivo e funzionante il codice che tu hai postato!

    veramente ben fatto!

    se posso chiedere un'altra cosa, è possibile una volta che si estraggono i fogli, estrarre solo fogli il cui nome inizia in un certo modo?

    esempio:

    ho un file excel di 50 fogli.
    10 fogli iniziano con blocco e poi dopo blocco tutta una serie di codici identificativi.
    10 fogli iniziano con edificio e poi altri identificativi.
    30 fogli iniziano con appartamento e ancora altri identificativi.

    e' possibile per esempio estrarre dall'excel solo i 30 fogli relativi agli appartamenti?

    oppure ugualmente estrarre solo i fogli contenenti certi tipi di codici all'interno del loro nome?

    grazie ancora!

    un ultima cosa...giusto per completezza e correttezza...quei file che si estraevano e che non erano excel, non venivano generati dal codice che tu matteo avevi postato.
    erano file di testo.
    come spiegazione a ciò, ho ritenuto che un possibile elemento di intralcio per il codice fosse che quei fogli in questione contenevano disegni, ma non ho approfondito l'aspetto in quanto il tuo codice risolveva l'arcano. :)

    buona giornata!!

    emanuele



  • di Enzo (utente non iscritto) data: 25/01/2010

    Scusate l'intromissione
    puoi utilizzare il comando "like"
    ipotizzando che in una cella tu abbia "blocco1
    if range ("a1").value like ("blocco*") then ...
    ossia se comincia per "blocco" allora esegui ...



  • di Emanuele (utente non iscritto) data: 25/01/2010

    ...il comando "like" vale anche se quel che devo cercare è il nome del foglio di lavoro?

    nel caso sia così, dove è che devo inserire tale opzione?



  • di Enzo (utente non iscritto) data: 25/01/2010

    Non voglio entrare nel merito della compilazione scritta da teo che funziona perfettamente
    per risolvere quello che hai chiesto l'istruzione qui sotto si traduce cosi':
    se il foglio dove sei comincia con blocco ...allora ...passa alle istruzioni successive
    ora tocca a te
    bye

     
    If ActiveSheet.Name Like ("blocco*") Then



  • di Emanuele (utente non iscritto) data: 25/01/2010

    Grazie enzo!

    appena capisco dove iserire il ciclo, ti faccio sapere!
    grazie per il suggerimento!
    sicuramente molto utile!

    bye bye

    emanuele



  • di Emanuele (utente non iscritto) data: 26/01/2010

    Oggi son riuscito a ritagliarmi un pò di tempo per studiarmi un pò il codice che mi avete gentilmente postato...

    ho trovato dove inserire il codice di enzo nel codice di matteo...e il tutto funziona egregiamente!

    altro quesito:

    c'è modo di salvare i vari fogli senza che in essi venga salvata la macro?

    grazie ancora!!!

    emanuele
     
    Function SeparaFogli(strPath, File, NuovaCartella)
    '@@utilities@@ i fogli contenuti in una cartella xls diventano singoli file xls (chiede dove salvarli)
    Dim ChDir, NomeFile, StrCartella, Vuoi As String
    'apre il file presente a questo indirizzo
    Workbooks.Open Filename:=strPath & "" & File
    NomeF = ActiveWorkbook.Name
     '  MsgBox (NomeF)
       
    
       
    For g = 1 To Sheets.Count
    
       Worksheets(g).Activate
    
    If ActiveSheet.Name Like ("BLOCCO*") Then 'Estraggo solo i fogli il cui nome inizia con BLOCCO
     
    
        ActiveSheet.Select
        ActiveSheet.Copy
    NomeFile = NomeF & "_" & ActiveSheet.Name & ".xls"
    
    
    ' cartella in cui salvare i diversi fogli come file xls
        ActiveWorkbook.SaveAs Filename:=strPath & "" & NuovaCartella & "" & NomeFile _
            , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
            
    ActiveWorkbook.Close
        Windows(NomeF).Activate
    
    End if
    
        Next
        ActiveWorkbook.Close
    End Function



  • di Teovba (utente non iscritto) data: 26/01/2010

    sono contento che il codice andasse bene e, per enzo, ogni commento e suggerimento e' sempre ben accetto ( e sul mio codice non c'e' nessun copyright :)). per salvare solo determinati fogli avrei anch'io utilizzato un if e "like" oppure left(activesheet.name,6)="blocco"..
    per non avere le macro in ogni foglio basta salvare la routine in "vbaproject(personal.xls)".



  • di Emanuele (utente non iscritto) data: 26/01/2010

    Perdonate la mia insistenza...e ignoranza...

    dove è che si può scegliere di salvare la macro?

    io in genere per provare la macro in questione, apro excel, apro il modulo vba, faccio visualizza codice e ci incollo il codice elaborato con un compilatore testuale (textpad).

    successivamente eseguo la macro.

    dove devo specificare di salvare la macro?




  • di Emanuele (utente non iscritto) data: 26/01/2010

    ...
    ho creato un componente aggiuntivo .xla con all'interno il codice che oggetto della nostra discussione...

    sembra che funzioni, ovvero aprendo i file generati dalla routine e andando a vedere nella sezione macro, non si trovano macro disponibili e quindi al momento deduco di aver trovato la soluzione.

    e' giusto?

    non so se inavvertitamente ho seguito il consiglio di matteo, ma in ogni caso ti ringrazio e vi ringrazio tutti per l'aiuto e il sostegno offertomi!

    davvero grazie ancora tanto!!



  • di Emanuele (utente non iscritto) data: 26/01/2010

    ...
    ho creato un componente aggiuntivo .xla con all'interno il codice che oggetto della nostra discussione...

    sembra che funzioni, ovvero aprendo i file generati dalla routine e andando a vedere nella sezione macro, non si trovano macro disponibili e quindi al momento deduco di aver trovato la soluzione.

    e' giusto?

    non so se inavvertitamente ho seguito il consiglio di matteo, ma in ogni caso ti ringrazio e vi ringrazio tutti per l'aiuto e il sostegno offertomi!

    davvero grazie ancora tanto!!



  • di Emanuele (utente non iscritto) data: 26/01/2010

    ...
    ho creato un componente aggiuntivo .xla con all'interno il codice che oggetto della nostra discussione...

    sembra che funzioni, ovvero aprendo i file generati dalla routine e andando a vedere nella sezione macro, non si trovano macro disponibili e quindi al momento deduco di aver trovato la soluzione.

    e' giusto?

    non so se inavvertitamente ho seguito il consiglio di matteo, ma in ogni caso ti ringrazio e vi ringrazio tutti per l'aiuto e il sostegno offertomi!

    davvero grazie ancora tanto!!



  • di Teovba (utente non iscritto) data: 26/01/2010

    Un trucco per far comparire "personal" e' aprire excel e registrare una macro con il registratore macro selezionando "registra macro in..cartella di lavoro personale".. fatto questo ( e registrata una qualsiasi macro ) quando aprirai con alt+f11 il compilatore di macro vedrai l'esistenza della cartella excel "vbaproject(personal.xlsb)..praticamente e' un foglio excel invisibile che si apre ogni volta che apri un altro foglio excel..tutte le macro che metti qui si potranno quindi usare in tutti i fogli excel senza dover ricopiare le medesime nei singoli files.. mi sa che e' piu' semplice da provare e da usare che da spiegare..ehehe. ciao e buon pranzo, matteo , matteosolda@gmail.com



  • di Teovba (utente non iscritto) data: 26/01/2010

    Un trucco per far comparire "personal" e' aprire excel e registrare una macro con il registratore macro selezionando "registra macro in..cartella di lavoro personale".. fatto questo ( e registrata una qualsiasi macro ) quando aprirai con alt+f11 il compilatore di macro vedrai l'esistenza della cartella excel "vbaproject(personal.xlsb)..praticamente e' un foglio excel invisibile che si apre ogni volta che apri un altro foglio excel..tutte le macro che metti qui si potranno quindi usare in tutti i fogli excel senza dover ricopiare le medesime nei singoli files.. mi sa che e' piu' semplice da provare e da usare che da spiegare..ehehe. ciao e buon pranzo, matteo , matteosolda@gmail.com



  • di Teovba (utente non iscritto) data: 26/01/2010

    Un trucco per far comparire "personal" e' aprire excel e registrare una macro con il registratore macro selezionando "registra macro in..cartella di lavoro personale".. fatto questo ( e registrata una qualsiasi macro ) quando aprirai con alt+f11 il compilatore di macro vedrai l'esistenza della cartella excel "vbaproject(personal.xlsb)..praticamente e' un foglio excel invisibile che si apre ogni volta che apri un altro foglio excel..tutte le macro che metti qui si potranno quindi usare in tutti i fogli excel senza dover ricopiare le medesime nei singoli files.. mi sa che e' piu' semplice da provare e da usare che da spiegare..ehehe. ciao e buon pranzo, matteo ,



  • di Emanuele (utente non iscritto) data: 26/01/2010

    Ho provato a fare come mi dicevi...

    solo che mi sembra che rimangano comunque tracce del codice nei file finali.

    quello che mi preme è che nei file generati dall'estrazione dei fogli, non ci siano tracce nè di macro, nè di codice in alcun modo.

    facendo come mi hai suggerito, mi sebra che anche se nascosto il codice rimanga nel modulo vba.

    tramite la creazione di un componente aggiuntivo .xla invece, mi sembra che tale traccia di codice non ci sia.
    ho provato infatti ad aprire i file su un altro computer e aprendo il modulo delle macro e il modulo vba separatamente, non ho riscontrato la presenza di codice.

    per cui, mi ritengo soddisfatto per ora, nel senso che sono arrivato alla conclusione del mio percorso per la risoluzione del mio problema iniziale.

    questo grazie a voi tutti!

    mi ha fatto piacere trovare un forum che stimolasse l'avvicinamento al vba anche per me che non ne mastico tanto!

    grazie ancora!!!

    emanuele



  • di Teovba (utente non iscritto) data: 26/01/2010

    Ciao, alla fine e' il risultato che conta..cmq il file "personal" rimane esclusivamente nel tuo computer ( quindi se apri il file in un altro pc non troverai traccia di vba). il file personal ti puo' essere utile quando avrai macro che vorrai poter eseguire su qualsiasi file excel..io ad esempio mi sono fatto un tool di macro per sistemarmi le colonne, trovare tutti i dati in comune, crearmi un indice dei fogli presenti nel file etc..