Creare nuovo file excel estraendo i dati da altri file excel

Anonimo
2014-12-04T23:55:26+00:00

Ciao,

premetto che non conosco praticamente nulla di VBA.

Nel corso degli anni ho creato innumerevoli file Excel strutturati nel medesimo modo.

Ogni file è composto da diversi fogli, tutti uguali nella struttura tranne i fogli Pippo e Pluto (che sono diversi nella struttura e non ho necessità di prendere in considerazione).

Ogni foglio è strutturato in modo identico all'altro.

Il nome di questi fogli è composto da strighe che (ahimè) contengono anche punti (.) e parentesi e segni +-

Ora vorrei estrarre tutti i dati da questi fogli e riepilogarli in un unico foglio.

Esempio di un file

cartellann.xls

foglio23.5                 voglio prendere il contenuto della cella E8,E9,E10............

foglio2Ø3.5ES44      voglio prendere il contenuto della cella E8,E9,E10...........

foglio23.5+23(3)      voglio prendere il contenuto della cella E8,E9,E10............

pippo                       non voglio considerare

pluto                        non voglio considerare

vorrei creare una nuova cartella suppergiù così.

cartellann.xls             foglio23.5                contenuto cella E8                contenuto cella E9              contenuto cella E10 ................

cartellann.xls            foglio2Ø3.5ES44      contenuto cella E8                contenuto cella E9              contenuto cella E10 ................

cartellann.xls            foglio23.5+23(3)      contenuto cella E8                contenuto cella E9              contenuto cella E10 ................

cartellannnnnn.xls    così via.....

Come posso fare?

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2014-12-16T11:35:30+00:00

Ciao Red Mud,

     Const sAddress = "F2,K2,C4,H4,C6,H6,E8,I7,I8,J8,L8," _

          & "E9,I9,E10,E11,E12,E13,I14,J15,E16,J17,J18," _

    & "B21,E21,H21,J21,O21,B22,E22,H22,J22,O22," _

& "B23,E23,H23,J23,O23,B24,E24,H24,J24,O24," _

& "B25,E25,H25,J25,O25,B26,E26,H26,J26,O26,B28,J28,I30," _

& "L30,L32,D36,F36,I36,D37,F37,I37,D38,F38,I38," _

& "P15,P16,P17,P18"                     '<<==== Modifica

Credo che il tuo problema sia dovuto alla lunghezza della stringa sAddress e il numero di caratteri linebreak (_).

Pertanto, prova invece:

      Const sAddress As String = "F2,K2,C4,H4,C6,H6,J8,L8,I7:I9," _

& "E8:E13,I14,J15,E16,J17:J18,B21:B26,E21:E26," _

& "H21:H26,J21:J26,O21:O26,B28,J28,I30,L30,L32," _

& "D36:D38,F36:F38,I36:I38,P15:P18"                                

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

36 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-12-09T14:40:03+00:00

    Ciao Red Mud,

    In pratica parte la macro....compila le intestazioni di campo....ma non riempie i campi con i relativi dati.

    Non dà nessun errore.

    Il codice funzione per me senza alcun problema

    Potresti indicare il nome, il percorso completo di uno dei file; potresti anche indicare il nome di un foglio di interesse e il contenuto della cella F2 di quel file?

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-12-09T14:13:14+00:00

    Non riesco ad ottenere il risultato con l'ultima versione che hai postato.

    '=========>>

     Option Explicit

     '--------->>

     Public Sub Tester()

         Dim FSO As Object

         Dim oFile As Object

         Dim oFiles As Object

         Dim oFolder As Object

        Dim oSubFolder As Object

         Dim WB As Workbook

         Dim SH As Worksheet, destSH As Worksheet

         Dim Rng As Range, rCell As Range

         Dim arrExclude As Variant, arrHeaders As Variant

         Dim iRow As Long

         Dim j As Long, k As Long

         Dim myFile As String, myFolder As String

         Dim Res As Variant

         Const sAddress = "F2,K2,C4"

         Const sFolder As String = "C:\Users\ANDREA\Documents\Ombg"

         Const sHeaders As String = "File di Origine,Foglio di Origine,Cliente,Data,Descrizione"

         Set WB = ThisWorkbook

         Set destSH = WB.Sheets(1)

         iRow = 1

         arrExclude = VBA.Array("Calcolo peso", "Forme")

         arrHeaders = Split(sHeaders, ",")

         destSH.Range("A1:E1").Value = arrHeaders

         On Error GoTo XIT

         Application.ScreenUpdating = False

         Set FSO = CreateObject("Scripting.FileSystemObject")

         Set oFolder = FSO.GetFolder(sFolder)

         For Each oSubFolder In oFolder.SubFolders

             Set oFiles = oSubFolder.Files

             For Each oFile In oFiles

             Application.StatusBar = "Processing il file " & oFile.Path

                 Set WB = Workbooks.Open(oFile)

                 With WB

                     For Each SH In WB.Worksheets

                         With SH

                             j = 1

                             Res = Application.Match(.Name, arrExclude, 0)

                             If IsError(Res) Then

                                 iRow = iRow + 1

                                 With destSH

                                     .Cells(iRow, "A").Value = WB.FullName

                                     .Cells(iRow, "B").Value = SH.Name

                                     Set Rng = SH.Range(sAddress)

                                     For Each rCell In Rng.Cells

                                         j = j + 1

                                         .Cells(iRow, j + 1).Value = rCell.Value

                                     Next rCell

                                 End With

                             End If

                         End With

                     Next SH

                     .Close savechanges:=False

                 End With

             Next oFile

         Next oSubFolder

         destSH.UsedRange.EntireColumn.AutoFit

    XIT:

         With Application

             .ScreenUpdating = True

             .StatusBar = False

         End With

     End Sub

     '<<=========

    In pratica parte la macro....compila le intestazioni di campo....ma non riempie i campi con i relativi dati.

    Non dà nessun errore.

    Poco male comunque. Ho aggiornato la precedente versione che avevi suggerito modificando la riga del percorso come hai suggerito nell'ultima versione e quella funziona.

    Grazie ancora.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-12-09T00:10:36+00:00

    Ciao Red Mud

    Grazie. Eccezionale!

    Funziona.

    Non mi resta che implementare campi e celle da importare e completare il mio nuovo file.

    Bene!

    Mi risulta un po' laborioso inserire i path di ogni cartella contenente il mie file originali (più di 100 cartelle).

    Non esiste un metodo più rapido considerando che sono tutte contenute a loro volta nella cartella "prezzi"? (sono tutte sottocartelle della cartella prezzi).

    La necessità di elencare i vari percorsi era dovuta unicamente al fatto che non avevi rivelato il fatto che ci fosse una directory base! Essendo consapevole di questa directory, prova la seguente versione che dovrebbe ovviare a questo problema:

    '=========>>

    Option Explicit

    '--------->>

    Public Sub Tester()

        Dim FSO As Object

        Dim oFile As Object

        Dim oFiles As Object

        Dim oFolder As Object

        Dim oSubFolder As Object

        Dim WB As Workbook

        Dim SH As Worksheet, destSH As Worksheet

        Dim Rng As Range, rCell As Range

        Dim arrExclude As Variant, arrHeaders As Variant

        Dim iRow As Long

        Dim j As Long, k As Long

        Dim myFile As String, myFolder As String

        Dim Res As Variant

        Const sAddress = "F2,K2,C4"                                                               '<<==== Modifica

        Const sFolder As String = "**C:\Prezzi**"                                               '<<==== Modifica

        Const sHeaders As String = "File di Origine,Foglio di Origine,Cliente,Data,Descrizione"

        Set WB = ThisWorkbook

        Set destSH = WB.Sheets(1)

        iRow = 1

        arrExclude = VBA.Array("Calcolo peso", "Forme")

        arrHeaders = Split(sHeaders, ",")

        destSH.Range("A1:E1").Value = arrHeaders

        On Error GoTo XIT

        Application.ScreenUpdating = False

        Set FSO = CreateObject("Scripting.FileSystemObject")

        Set oFolder = FSO.GetFolder(sFolder)

        For Each oSubFolder In oFolder.SubFolders

            Set oFiles = oSubFolder.Files

            For Each oFile In oFiles

            Application.StatusBar = "Processing il file " & oFile.Path

                Set WB = Workbooks.Open(oFile)

                With WB

                    For Each SH In WB.Worksheets

                        With SH

                            j = 1

                            Res = Application.Match(.Name, arrExclude, 0)

                            If IsError(Res) Then

                                iRow = iRow + 1

                                With destSH

                                    .Cells(iRow, "A").Value = WB.FullName

                                    .Cells(iRow, "B").Value = SH.Name

                                    Set Rng = SH.Range(sAddress)

                                    For Each rCell In Rng.Cells

                                        j = j + 1

                                        .Cells(iRow, j + 1).Value = rCell.Value

                                    Next rCell

                                End With

                            End If

                        End With

                    Next SH

                    .Close savechanges:=False

                End With

            Next oFile

        Next oSubFolder

        destSH.UsedRange.EntireColumn.AutoFit

    XIT:

        With Application

            .ScreenUpdating = True

            .StatusBar = False

        End With

    End Sub

    '<<=========

    Nota che con questa versione aggiornata, è anche possibile seguire lo stato di avanzamento di ogni file sulla barra di stato nella parte inferiore dello schermo

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-12-08T21:30:48+00:00

    Grazie. Eccezionale!

    Funziona.

    Non mi resta che implementare campi e celle da importare e completare il mio nuovo file.

    Mi risulta un po' laborioso inserire i path di ogni cartella contenente il mie file originali (più di 100 cartelle).

    Non esiste un metodo più rapido considerando che sono tutte contenute a loro volta nella cartella "prezzi"? (sono tutte sottocartelle della cartella prezzi).

    Grazie ancora.

    La risposta è stata utile?

    0 commenti Nessun commento