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: 355
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: 355
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: 19586
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: 355
Iscritto il: 10/12/19 20:38

Re: Macro a contenuto variabile

Postdi Ricky0185 » 02/04/25 21:49

Buonasera, grazie ai suggerimenti di Anthony sull’uso di Testo in Colonne, con una macro riesco a trasformare files csv in excel ed in coda alla macro una serie di operazioni utili per il lavoro.
I files trasformati sono così organizzati ed evidenziano, se siamo in marzo, le differenze esistenti fra i primi tre mesi del 24 con i primi tre mesi del 25. Se siamo in aprile, fra i primi 4 mesi del 24 ed i primi 4 mesi del 25. Analogamente in giugno fra i primi 6 mesi del 24 e del 25. Quindi nelle celle dell’ultima colonna è posta la differenza 25 meno 24, che viene poi prelevate e riportate in altri fogli per svariate operazioni.
Sono riuscito anche ad inserire nella barra di avvio veloce il cosidetto add-in che attiva la macro con un semplice click una volta scaricato il csv e la completa in meno di due secondi.
Mi sono congratulato e brindato. Ma il diavolo fa le pentole ….. Ovviamente l’elaborazione della macro e tutte le prove sono state fatte in marzo e così la macro elabora i dati dei primi tre mesi del 24 e del 25, cioè del csv scaricato a fine marzo. Adesso siamo in Aprile ed il confronto deve essere fatto per i primi 4 mesi del 24 con quelli del 25. Sto quindi cercando di aggiornare automaticamente, in funzione del mese in cui ci si trova, le celle e le varie operazioni delle ultime tre colonne. Operazione da fare ogni fine mese, che consiste innanzitutto nell’aggiornare le operazioni matematiche della macro che per marzo era dei primi tre mesi del 24 e del 25
Immagine
Nascondendo le colonne intermedie
Immagine
Aggiornare le scritte sulle testate delle 3 colonne
Immagine
Ed infine la colorazione alternata delle righe
Immagine
Non accenno ai tentativi fatti per non chilometrare il post, ma spero che qualcuno mi indichi la soluzione.
Buona serata
R
Ricky0185
Utente Senior
 
Post: 355
Iscritto il: 10/12/19 20:38

Re: Macro a contenuto variabile

Postdi Anthony47 » 03/04/25 00:25

In riga 1 metti la data di inizio mese e non quella stringa; se vuoi vedere AAAA-MM (es 2024-02) allora formatta come Personalizzato + Tipo pari ad aaaa-mm (sulle colonne gia' inserite bastera' manualmente aggiungere -01 in fondo alla stringa presente per costringere Excel a ricalcolare come data; per le nuove colonne devi modificare la macro)

Inoltre, a inizio elaborazione del nuovo mese elimina le tre colonne finali (Totale1 /Totale2 /Differenza)

A questo punto dovresti poter usare questo codice:
Codice: Seleziona tutto
Cells(1, Columns.Count).End(xlToLeft).Select
'
'Mette le intestazioni:
    ActiveCell.Offset(0, 1).FormulaR1C1 = _
        "=""Totale GEN-""&UPPER(TEXT((RC[-1]),""MMM""))&CHAR(10)&YEAR(RC[-1])"
    ActiveCell.Offset(0, 2).FormulaR1C1 = _
        "=""Totale GEN-""&UPPER(TEXT((RC[-14]),""MMM""))&CHAR(10)&YEAR(RC[-14])"
    ActiveCell.Offset(0, 3).FormulaR1C1 = _
        "Differenza"
'
'Mette le formule:
    ActiveCell.Offset(1, 1).FormulaR1C1 = _
        "=SUM(OFFSET(RC[-1],0,1-MONTH(R[-1]C[-1])-12,1,MONTH(R[-1]C[-1])))"
    ActiveCell.Offset(1, 2).FormulaR1C1 = _
        "=SUM(OFFSET(RC[-2],0,1-MONTH(R[-1]C[-2]),1,MONTH(R[-1]C[-2])))"
    ActiveCell.Offset(1, 3).FormulaR1C1 = _
        "=RC[-1]-RC[-2]"
'
'Nasconde le colonne C:XXX (ma sei sicuro che sia utile?):       
    Range(Range("C1"), ActiveCell).EntireColumn.Hidden = True

Per la colorazione a righe alterne mi pare che vada bene il codice che hai gia'

Questo nell'ipotesi che io abbia capito quale e' il layout dei tuoi dati
Avatar utente
Anthony47
Moderatore
 
Post: 19586
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro a contenuto variabile

Postdi Ricky0185 » 03/04/25 06:55

Buongiorno, a parte che entro stasera provo le modifiche suggerite, desidero integrare il mio precedente post. Scarico dal sito il file csv che metto in una dir. A questo punto, senza colpo ferire clicco sull'add-in ed in 2 secondi appare a schermo già pronto con le tre colonne Totale, Totale e Differenza, cioè in testa alla macro c'è il Testo in Colonne ed a seguire altre istruzioni fra cui quelle richiamate nel mio post precedente. Va però evidenziato che se solo effettuo il Testo in Colonne il foglio che ne esce contiene già tutti i dati così come li vedi alla fine, ma SENZA le ultime tre colonne, cioè i TOTALI e la DIFFERENZA. La macro ha il solo compito, dopo Testo in Colonne, di aggiungere le tre colonne con relative operazioni matematiche. Quidi è subito dopo aver completato Testo in Colonne che bisognerebbe modificare/aggiungere/aggiornare la macro riguardo il mese in essere, che può essere Marzo (confronto dei primi 3 mesi tra il 2025 ed il 2024) così come Giugno (confronto dei primi 6 mesi tra il 2025 ed il 2024). Solo le ultime tre colonne dovrebbero essere modificate, poiche nel file a schermo, dopo Testo in Colonne, se Marzo compaiono 15 colonne di numeri (12 del 2024 e 3 del 2025) e se Giugno 18 (12 del 2024 e 6 del 2025).
Ciao e grazie.
R
Ricky0185
Utente Senior
 
Post: 355
Iscritto il: 10/12/19 20:38

Re: Macro a contenuto variabile

Postdi Anthony47 » 03/04/25 10:23

Credo che con l'ultimo messaggio stia dicendo, con riferimento alla mia istruzione di eliminare le tre colonne finali (Totale1 /Totale2 /Differenza), che quelle colonne non esistono a fine importazione.
Se e' così allora "Bene"; l'importante e' che il codice che t'ho dato sia in grado di selezionare l'intestazione dell'ultimo mese importato (vedi NOTA** piu' avanti).

Ancora: ti avevo chiesto di mettere in riga1 delle vere date invece delle stringhe attuali. Pensandoci bene, per evitare che debba andare a modificare codice di cui al momento mi sembri soddisfatto, possiamo anche convivere con quelle intestazioni così come sono oggi; dobbiamo solo aggiungere al nuovo codice qualche riga affinche' faccia le dovute conversioni.

Pertanto, se il tuo codice corrente si completa quando l'ultima colonna e' quella dell'ultimo mese importato allora questo codice non richiede ulteriori modifiche al tuo codice di importazione:
Codice: Seleziona tutto
Sub MacroTotali()

Dim CM As Long, CY As Long, mySplit, MMM As String
'
Cells(1, Columns.Count).End(xlToLeft).Select
mySplit = Split(ActiveCell.Value & "-0-0", "-", , vbTextCompare)
CM = CLng("0" & mySplit(1))
CY = CLng("0" & mySplit(0))
MMM = UCase(Format(DateSerial(CY, CM, 1), "mmm"))
'
'
'Mette le intestazioni:
On Error Resume Next
ActiveCell.Offset(0, 1).Value = _
    "Totale GEN-" & MMM & Chr(10) & Split(ActiveCell.Offset(0, -14).Value & "-0-0", "-", , vbTextCompare)(0)
ActiveCell.Offset(0, 2).Value = _
    "Totale GEN-" & MMM & Chr(10) & mySplit(0)
ActiveCell.Offset(0, 3).Value = "Differenza"
On Error GoTo 0
'
'Mette le formule:
ActiveCell.Offset(1, 1).FormulaR1C1 = _
    "=SUM(OFFSET(RC[-1],0,1-" & CM & "-12,1," & CM & "))"
 ActiveCell.Offset(1, 2).FormulaR1C1 = _
    "=SUM(OFFSET(RC[-2],0,1-" & CM & ",1," & CM & "))"
ActiveCell.Offset(1, 3).FormulaR1C1 = _
    "=RC[-1]-RC[-2]"
'
'Nasconde le colonne C:XXX (ma sei sicuro che sia utile?):
Range(Range("C1"), ActiveCell).EntireColumn.Hidden = True

End Sub

Attenzione: sia questo che il mio precedente codice assumono che in colonna ci siano tutti i mesi dell'anno in sequenza; inoltre assumono che ci siano abbastanza colonne pregresse a cui attingere i dati dell'anno precedente, altrimenti la macro potrebbe skippare l'inserimento di qualche intestazione e contemporaneamente inserire formule che restituiscono errore #RIF!

NOTA** Ma questo significa che tu ogni mese importi daccapo tutti i csv e non ti limiti a importare il nuovo mese e basta??!
Avatar utente
Anthony47
Moderatore
 
Post: 19586
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro a contenuto variabile

Postdi Ricky0185 » 03/04/25 20:22

Buonasera, a seguire la sequenza dei mutamenti del file dal suo download.
Appena scaricato ed applicato Testo in Colonna
Immagine
Dopo aver inserito e lanciata la tua macro, ecco il messaggio
Immagine
Fatto il debug, ecco riga gialla
Immagine
Inibita riga gialla, le due che la precedono e quella che la segue e lanciata nuovamente la macro ecco il risultato
Immagine
Al di la del primo errore che presumo riguardi la trasformazione e formattazione delle date (fatta manualmente da me prima del rilancio della macro), pensavo che il compito del resto della macro fosse quello di sommare i valori delle colonne corrispondenti del 2024 e del 2023 per poi farne la differenza. Ma purtroppo non riesco ad interpretare la formula che viene messa nelle colonne R ed S per eventualmente correggerla.
Senza fretta vedi cosa è successo.Sto lavorando con il 21 ed una volta corretto il bug, proverò ad aggiungere delle colonne-mese e vedere funzionare la macro cambiando periodo.
Le prove da me fatte sono essenzialmente simili alle tue: Ultima colonna occupata-Eliminane contenuto-Inseririre le testate delle 3 colonne e relative formule. Ma qui mi sono impantanato sul come individuare il periodo: il 1° gennaio del 2024 e facile, ma la seconda data che potrebbe essere aprile piuttosto che ottobre ed in ogni caso sempre riferita al mese corrente (in cui si fa il download) mi risulta al momento ostica. Comunque ce sto provanno.
Buona serata
R
Ricky0185
Utente Senior
 
Post: 355
Iscritto il: 10/12/19 20:38

Re: Macro a contenuto variabile

Postdi Anthony47 » 03/04/25 23:12

Hai cambiato il layout dei dati facendo spuntare una colonna Totale che impedisce alla istruzione
Cells(1, Columns.Count).End(xlToLeft).Select
di selezionare la cella con l’ultima data...
Ma a questo punto le tre colonne aggiuntive vanno in R-S-T o in S-T-U?
Se vanno in R-S-T, allora basta sostituire l’istruzione suddetta con
Codice: Seleziona tutto
Cells(1, Columns.Count).End(xlToLeft).Offset(0,-1).Select

Se devono andare in S-T-U allora vanno rivisti molti “offset” sia nelle righe vba che nelle formule con SCARTO
Avatar utente
Anthony47
Moderatore
 
Post: 19586
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro a contenuto variabile

Postdi Ricky0185 » 04/04/25 06:34

Vanno in R-S-T. Vedi ultima immagine. L'ultima colonna che appare dopo Testo in Colonna l'ho eliminata prima di operare. Non è altro che la somma di tutte le celle precedenti in formato testo.
Ricky0185
Utente Senior
 
Post: 355
Iscritto il: 10/12/19 20:38

Re: Macro a contenuto variabile

Postdi Ricky0185 » 04/04/25 08:07

Adesso si che ci siamo. Formidabile.
Mo provo a simulare con l'aggiunta di altri mesi del 2025, entro oggi. Ho trascurato il lavoro per provare subito la tua modifica. Sensazionale.
Ricky0185
Utente Senior
 
Post: 355
Iscritto il: 10/12/19 20:38

Re: Macro a contenuto variabile

Postdi Ricky0185 » 05/04/25 11:09

Buongiorno, ogni tanto (1%) aperto il csv quando lancio la macro complessiva (Testo in Colonna+Macro Totali+Formattazioni varie+Mie istruzioni) compare subito l'errore della terza immagine di 4 post fa CY=Clng("0" & mySplit (0)). Cosa combina quell'istruzione insieme alla precedente?
Comunque poco male, chiudo tutto e riapro il file, rilancio la macro (col tastino sulla barra di avvio veloce) e tutto è OK.
Ricky0185
Utente Senior
 
Post: 355
Iscritto il: 10/12/19 20:38

Re: Macro a contenuto variabile

Postdi Anthony47 » 05/04/25 12:26

Quella riga calcola il "Current Year":
Codice: Seleziona tutto
Cells(1, Columns.Count).End(xlToLeft).Select                        'Si posiziona dove dovrebbe esserci una cosa tipo 2025-04
mySplit = Split(ActiveCell.Value & "-0-0", "-", , vbTextCompare)    'Separa 2025 da 04
CM = CLng("0" & mySplit(1))                                         'Prende la stringa 04 e la converte nel numero 04=Current Month
CY = CLng("0" & mySplit(0))                                         'Prende la strina 2025 e la converte nel numero 2025=Curr Year

Se CY=EtcEtc va in errore allora controlla quale celle (sbagliata) e' selezionata e cerca di capire perchè la riga 1 fa quella selezione
Avatar utente
Anthony47
Moderatore
 
Post: 19586
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro a contenuto variabile

Postdi Ricky0185 » 05/04/25 13:16

Grazie
Ricky0185
Utente Senior
 
Post: 355
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 66 ospiti