Condividi:        

Macro a contenuto variabile

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Macro a contenuto variabile

Postdi Ricky0185 » 30/03/25 16:18

Buonasera, ho questa macro Principale
Codice: Seleziona tutto
Sub Elabora_files_di_cartella()
    Dim fDialog As FileDialog
    Dim i As Integer
    Dim uR As Long
    Dim uR1 As Long
    Dim WK As Workbook
    Dim WK1 As Workbook
    Dim sh As Worksheet
    Dim sh1 As Worksheet
    Dim fs As Object
    Dim Fold As Object
    Dim Nomefile As Object
    Dim cartella As Variant
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
    MsgBox "Scegli la cartella con i files!", vbInformation, "SCELTA CARTELLA"
    With fDialog
        .Show
        On Error GoTo esci
        cartella = .SelectedItems(1)
    End With
    Set WK = ThisWorkbook
    Set sh = WK.Worksheets(1)
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set Fold = fs.getfolder(cartella)
    Set cartella = Fold.Files
    For Each Nomefile In cartella
        Set WK1 = Workbooks.Open(Nomefile)
        Set sh1 = WK1.Worksheets(1)
       sh1.Activate
       Call Estrazione_Dati
        'WK1.Close SaveChanges:=False
        'WK1.Close SaveChanges:=True
    Next
    WK.Save
    MsgBox "Fatto!", vbInformation, "SCELTA CARTELLA"
    Set fs = Nothing
    Set cartella = Nothing
    Set Fold = Nothing
esci:
    Set fDialog = Nothing
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub


Sub Estrazione_Dati()
With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Documents and Settings\Admin\Desktop\csvfolder\Pinco Pallino.csv" _
        , Destination:=Range("A1"))
        .Name = "Pinco Pallino"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
Etc. etc.
che mi permette di scegliere una cartella ed, una volta scelta, elabora tutti i file csv in essa contenuti secondo una Seconda macro richiamata con un Call. La Seconda compie, ad uno ad uno, l’estrazione dei dati di tutti i csv ed è ottenuta registrando tutte le operazioni di Estrazione Dati di un file csv, nell’esempio Pinco Pallino.csv, E quindi ovviamente alla fine dell’operazione mi ritrovo tutti i file trattati e salvati con nome diverso (quello menzionato nella cartella), ma con lo stesso contenuto del file Pinco Pallino.csv. Come faccio a far ciclare anche il nome file nella macro Estrazione_Dati? I file da trattare sono moltissimi e per 25 file trattati manualmente impiego circa 57 minuti, con questa macro 6 secondi. Ma con il problema suesposto.
Chiedo pertanto se sia possibile questa integrazione.
Cordiali saluti
R
Ricky0185
Utente Senior
 
Post: 348
Iscritto il: 10/12/19 20:38

Sponsor
 

Re: Macro a contenuto variabile

Postdi Ricky0185 » 30/03/25 17:26

Dimentico sempre: XP+Excel2003 poichè col 21 o 365 ci sono problemi di inaccessibilità alle celle dopo l'estrazione dati.
Ricky0185
Utente Senior
 
Post: 348
Iscritto il: 10/12/19 20:38

Re: Macro a contenuto variabile

Postdi Anthony47 » 31/03/25 00:27

Consiglio: se ti prendi la briga di fare delle Set, falle utili; del tipo (ad esempio)
Set CsvFile = Workbooks.Open(Nomefile)
Set CurrentCsv = CsvFile.Worksheet(1)

Se pero’ le fai ma non le usi, allora non farle proprio

Il tuo codice dice che tu non Importi i dati dai file Csv ma stabilisci una “Connessione” al file Csv; penso che questo sia il motivo per cui non riesci poi a cambiare il tipo di dati da stringa a numero.
Pero’ non vedo come gestisci i dati e che cosa salvi quindi non posso essere certo di questa affermazione.
Avendo invece tu aperto il file Csv (cosa inutile se poi procedi con una Connessione, quindi dannosa perche’ ti fa solo perdere tempo) avresti potuto fare “Testo-in-Colonna” e poi fare su questo set di dati le trasformazioni che ora fai all’interno della Estrazione_Dati

Volendo rimanere col tuo approccio, devi manipolare la stringa della connessione con il nome del file che vuoi indirizzare. Ad esempio

1. Modifichi la Sub Estrazione_dati per renderla parametrica
Codice: Seleziona tutto
Sub Estrazione_dati(ByVal TargetFile As String)
With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & TargetFile _
        , Destination:=Range("A1"))
       
'etc etc

2. Nella macro principale, richiami la Sub Estrazione_dati passandogli il nome file:
Codice: Seleziona tutto
       Call Estrazione_dati(Nomefile)

Se decidi di rimanere sulla Connessione e accetti di non perdere tempo ad aprire il file, visto che la Estrazione_dati lavora sull’ActiveSheet allora dovrai creare un ambiente che offre un ActiveSheet pronto per essere “lavorato”; quindi invece di Set WK1 = Workbooks.Open(Nomefile) inserirai una
Codice: Seleziona tutto
Set WK1 = Workbooks.Add
Immagino che questo Workbook sia poi chiuso all'interno della Sub Estrazione_dati

Se invece della Connessione vuoi procedere aprendo il csv e poi con Testo-in-Colonna allora devi portare all’interno del loop For Each Nomefile In cartella /Next Nomefile le istruzioni di trasformazione dati ora all’interno della Sub Estrazione_dati
Avatar utente
Anthony47
Moderatore
 
Post: 19578
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro a contenuto variabile

Postdi Ricky0185 » 31/03/25 05:59

Stasera faccio le prove. Grazie.
R
Ricky0185
Utente Senior
 
Post: 348
Iscritto il: 10/12/19 20:38


Torna a Applicazioni Office Windows


Topic correlati a "Macro a contenuto variabile":


Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti