Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Macro creazione report

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 creazione report

Postdi project4 » 28/12/18 11:22

Buongiorno e auguri a tutti

Spiego il mio quesito: ho creato due file di report (nell'esempio sono chiamati: "XX - mese anno- Clienti AA" e "XX - mese anno - Clienti BB" dove xx è il numero del mese e "mese anno" è il nome del mese e anno di riferimento) contenenti diversi fogli per le varie aziende con cui si lavora, alla fine voglio creare un foglio "riepilogo" del mese dove andare ad inserire i valori generati da quella data azienda.

I file che voglio estrapolare sono in 5 celle a volte differenti da foglio a foglio, quindi per semplificare ho creato una colonna di appoggio in modo da averli sempre nella stessa identica cella su tutti i fogli di lavoro (AS1, AT1, AU,AV1,AW1).

Vorrei a questo punto fare 2 operazioni:

1) creare in maniera automatizzata il file di riepilogo mensile (nell'esempio ho fatto con formule ma diventa complicato gestire una mole importante di fogli)

2) creare un nuovo file dove andare ad incollare i vari riepiloghi mensili ed inserire contemporaneamente la differenza percentuale riferita al mese precedente.

Nel .rar allegato ho inserito i 5 file complilati con il risultato che voglio raggiungere prendendo ad esempio 2 mesi, naturalmente io devo tenere conto di un riepilogo valido per l'intero anno solare e in futuro poter replicare questo procedimento per gli anni a venire (basta avere i file dei vari anni in cartelle differenti?)

Grazie per l'aiuto.

http://www.filedropper.com/desktop_41
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Sponsor
 

Re: Macro creazione report

Postdi Anthony47 » 29/12/18 18:30

Sinceramente quella che stai usando e' l'organizzazione dati che non consiglierei nemmeno al mio piu' antipatico conoscente…
Dovresti farti semplicemente una registrazione analitica dei movimenti, tipo
-data, cliente, voci descrittive, importo

Poi da questo analitico ti crei tutti i report che vuoi utilizzando una o piu' tabella pivot (per mese, per cliente, per trimestre, per dare, per avere, ...) oppure compili con formule dei fogli come quelli presenti sui file XX-MESE-ANNO.

Pero' in effetti tu esordisci dicendo che hai "creato due file di report contenenti diversi fogli per le varie aziende con cui si lavora" e questo mi fa sperare che in origine ci siano dati organizzati decorosamente, da cui io partirei per i lavori di cui parli nel tuo messaggio.
Automatizzare invece partendo dai file intermedi che hai pubblicato mi sembra invece, senza giri di parole, voler acuire una situazione indecorosa.

Confermi che hai dati in partenza organizzati diversamente? Ne puoi pubblicare qualche stralcio significativo?

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17355
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro creazione report

Postdi project4 » 31/12/18 09:23

Innanzitutto grazie per le indicazioni.
Non sono del tutto convinto che la situazione sia così indecorosa ma forse questo a causa dei miei limiti sia nei gestionali che nell'uso di excel.
Detto ciò, no non ho una organizzazione dati precedente a quella proposta.

In questi 2 file mensili, divisi per tipologia di servizi in AA e BB (questo perchè vengono usati da persone diverse e rappresentano settori diversi nell'organizzazione aziendale) vado a registrare tutti i movimenti effettuati mensilmente.
All'interno di ogni singolo foglio, che rappresenta la scheda cliente, mi sono creato un riepilogo degli importi suddivisi per tipo (non avrebbe per me utilità confrontare solo il totale generato dal cliente).

A questi file ho aggiunto un foglio con un riepilogo mensile dove trovo solo gli importi generati dal cliente nel mese di riferimento (naturalmente nel file AA dai clienti AA nel file BB da quelli BB), e da cui volevo partire per andare a combinare queste tabelle (AA + BB) e potere alfine poi confrontarle mese su mese e mese su anno.

Mi dispiace non cogliere le modifiche che suggerisci perchè non capisco (e ripeto che è probabilmente un limite mio) dove poter andare a migliorare l'organizzazione di questi dati.

Il problema di lavorare con le formule, con le mie conoscenze, è l'implementazione di nuove fogli per nuovi clienti che faticherei a gestire in quanto io mi fermo al richiamo di dati fissi e non so come rendere il tutto più "elastico" e soprattutto far si che una volta finito l'anno (a fine 2018 mi troverò con 12 file dei clienti AA, 12 dei BB e il riepilogo di tutto) poter ripartire con un nuovo anno senza dover riscrivere tutte le formule che devono "puntare" a prelevare i dati dai nuovi file.

I 5 file che ho postato sono esattamente i file su cui lavoro io dove ho sostituito tutti i dati reali con nomi e numeri di fantasia e naturalmente creato 4 schede clienti invece del centinaio su cui lavoro nella realtà

Se riesci a farmi capire meglio cosa intendi per migliorare l'organizzazione proverei volrìentieri a valutare altre forme di gestione di tutto l'insieme prima di continuare a sviluppare quello già creato.

Grazie ancora e visto che oggi è il 31 Auguri di Buon Anno :)
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Macro creazione report

Postdi Anthony47 » 07/01/19 01:25

Un trattamento automatico dei dati presuppone che ci sia una netta separazione tra dati di partenza, che devono essere analitici ed elementari, e dati calcolati; possibilmente poi i dati calcolati andrebbero separati dai dati visualizzati, dove il fatto estetico potrebbe essere preponderante.
La tua situazione invece mette in cortocircuito i dati di partenza con i dati presentati, ed Excel sembra sia stato usato piu' per disegnare una scheda cartacea che non per elaborare dati

Come detto nel precedente messaggio, l'origine di tutto dovrebbe essere una registrazione sequenziale dei dati, con tutte le informazioni idonee al loro successivo processing.
Non sapendo come sono i tuoi dati, a titolo di esempio guarda il file DEMO_01 2018-AA.xlsm scaricabile qui:
https://www.dropbox.com/s/fm08tc3ha563e ... .xlsm?dl=0

In foglio1 ho riportato i dati prelevandoli dai vari fogli cliente che hai pubblicato tu.

Poi vai ad esempio sul foglio ANY_1; cambia il nome del cliente (paperino, pippo, pluto, topolino) e cambia il nome del mese (Gennaio-Marzo; non ci sono dati di altri mesi)
Il foglio verra' popolato con i dati di quel cliente e quel mese

Purtroppo ho notato che alcuni clienti hanno un layout dati diverso, quindi lo stesso schema non va bene per tutti e (derivandolo dal foglio PLUTO dei tuoi file) ho immaginato un secondo foglio, ANY_2, per gestire clienti col secondo layout dati; ma ovviamente l'ideale e' che il tracciato dati sia lo stesso per tutti.

Non ho idea di come nascono i costi di trasporto e di noleggio, diversi per ognuno dei clienti che hai pubblicato; quindi non so come si possa impostare un lavoro che vada bene per tutti.


Comunque, immaginando che anche volendo non cambieresti approccio "in settimana" (e ripetendo che mi dissocio dall'approccio che hai adottato), per ottenere quello che vuoi partendo dai file come li hai predisposti, potresti creare un file contenente due fogli, che io ho chiamato YRiep_AA e YRiep_BB, contenente questa macro:
Codice: Seleziona tutto
Sub yRiep()
Dim yYear As String, myF As String, subD As String, lInDir As String
Dim lastR As Long, lastC As Long, AAorBB As String, myNext As Long
Dim cMese As String, maxM As Long
'
subD = "MENSILI"
'
yYear = Left(ThisWorkbook.Name, 4)
lInDir = ThisWorkbook.Path & Application.PathSeparator & subD

Application.EnableEvents = False
'Azzera fogli Riepilogo:
ThisWorkbook.Sheets("YRiep_AA").Range("A:H").ClearContents
ThisWorkbook.Sheets("YRiep_BB").Range("A:H").ClearContents
'Esamina i file presenti
myF = Dir(lInDir & "\*.xls*")
Do While myF <> ""
    If myF <> ThisWorkbook.Name Then
    '
    'Controlla AA o BB:
        If InStr(1, myF, "AA", vbTextCompare) > 0 Then
            AAorBB = "YRiep_AA"
        ElseIf InStr(1, myF, "BB", vbTextCompare) > 0 Then
            AAorBB = "YRiep_BB"
        Else
            AAorBB = ""
        End If
        '
        'Controlla Mese:
        cMese = ""
        For i = 1 To 12
            If InStr(1, myF, Format(DateSerial(2018, i, 1), "mmmm"), vbTextCompare) > 0 Then
                cMese = Application.WorksheetFunction.Proper(Format(DateSerial(2018, i, 1), "mmmm"))
                If i > maxM Then maxM = i
                Exit For
            End If
        Next i
        '
        'Apre file?
        If AAorBB <> "" And cMese <> "" Then
            Application.ScreenUpdating = True
            DoEvents: DoEvents
            Application.ScreenUpdating = False
            Workbooks.Open (lInDir & "\" & myF), 0, True
                With Sheets("Riepilogo Mese")
                    If tf = 0 Then          'Mette intestazioni su fogli YRiep
                        ThisWorkbook.Sheets("YRiep_AA").Range("A1").Value = "Mese"
                        ThisWorkbook.Sheets("YRiep_BB").Range("A1").Value = "Mese"
                        ThisWorkbook.Sheets("YRiep_AA").Range("B1:G1").Value = .Range("A2:F2").Value
                        ThisWorkbook.Sheets("YRiep_BB").Range("B1:G1").Value = .Range("A2:F2").Value
                    End If
                    'Copia il blocco di riepilogo:
                    lastR = .Range("A2").End(xlDown).Row - 1
                    lastC = .Range("A2").End(xlToRight).Column
                    myNext = ThisWorkbook.Sheets(AAorBB).Cells(Rows.Count, 2).End(xlUp).Row + 1
                    .Range("A3").Resize(lastR - 2, lastC).Copy
                    ThisWorkbook.Sheets(AAorBB).Cells(myNext, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                        :=False, Transpose:=False
                    Application.CutCopyMode = False
                End With
                'Inserisce Mese in col A:
                ThisWorkbook.Sheets(AAorBB).Cells(myNext, 1).Resize(lastR - 2, 1).Value = cMese
            ActiveWorkbook.Close False
            tf = tf + 1         'Conta file trattati
        End If
    End If
    myF = Dir                   'Prossimo file
Loop
Application.EnableEvents = True
Application.ScreenUpdating = True
'
'Crea lista Clienti in K4 e sottostanti:
Sheets("YRiep_AA").Select
    Range("B1:B10000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "K4"), Unique:=True
    Range("B1").Select
'
'Crea Range per origine Grafico su YRiep_AA:
On Error Resume Next
    ActiveWorkbook.Names("AAGraph").Delete
On Error GoTo 0
grAdr = Range(Range("K5"), Range("K4").End(xlDown)).Resize(, maxM + 1).Address
ActiveWorkbook.Names.Add Name:="AAGraph", RefersTo:="=YRiep_AA!" & grAdr
'
'Ripete per YRiep_BB:
Sheets("YRiep_BB").Select
    Range("B1:B10000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "K4"), Unique:=True
    Range("B1").Select
On Error Resume Next
    ActiveWorkbook.Names("BBGraph").Delete
On Error GoTo 0
grAdr = Range(Range("K5"), Range("K4").End(xlDown)).Resize(, maxM + 1).Address
ActiveWorkbook.Names.Add Name:="BBGraph", RefersTo:="=YRiep_BB!" & grAdr
'
'Termine
MsgBox ("Completato..." & vbCrLf & "Totale file trovati: " & tf)
End Sub

Salva il file in una directory del tuo disco; nella stessa directory crea una subdirectory che chiami MENSILI, in cui inserisci i vari file Gennaio /Febbraio /Marzo /… sia AA che AB, che abbiano il contenuto documentato nei file che hai pubblicato; in particolare il foglio "Riepilogo Mese" come pubblicato.

Quando e' pronto, manda in esecuzione la Sub yRiep; la macro, in sequenza:
-cancella il contenuto A:H deu fogli YRiep_AA e YRiep_BB
-apre uno dopo l'altro i file presenti nella subdirectory MENSILI che contengano le stringhe AA oppure BB e contengano un nome di mese
-copia il Riepilogo e lo accoda sul foglio YRiep_AA oppure YRiep_BB, a seconda del nome file
-chiude il file mensile
Completata la lettura dei file mensili, la macro crea in K4 e sottostanti dei fogli YRiep_AA e YRiep_BB un elenco di clienti cosi' come vengono rilevati durante l'importazione

Il file dimostrativo contenente la macro e' scaricabile qui: https://www.dropbox.com/s/1myyma66cl7ql ... .xlsm?dl=0

Noterai che nei due fogli ho previsto di creare una tabella con l'elenco dei clienti e la distribuzione mensile di una delle voci presenti nel file YRiep_xx (Cliente, Noleggio, Trasporti, Avere, Dare, Totale); la "voce" va impostata in L1 dei due fogli YRiep_xx, e la tabella sottostante viene popolata con i dati del Cliente /mese.

Sul foglio YRiep_AA ho anche previsto un grafico che possa visivamente mostare l'andamento nei mesi di quel dato di ogni cliente.
Per gestire dinamicamente l'area dati del grafico, la macro crea due nomi di intervallo, AAGraph e BBGraph, che ricalcano la dimensione della tabella realmente popolata; e ho usato AAGraph come origine dei dati del grafico di foglio YRiep_AA

Sempre a titolo dimostrativo, ho creato su foglio PIVOT_AA due tabelle pivot basate sui dati di foglio YRiep_AA.
Le tabelle hanno la stessa struttura; la caratteristica e' che modificando il mese di filtro della prima tabella (cella B1), la seconda mostra i dati del mese successivo.
In questo modo potresti organizzare altri confronti.

Sono tutti esempi di cose che si possono fare, spero trovi utili spunti per la tua situazione.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17355
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro creazione report

Postdi project4 » 09/01/19 10:58

Ciao Anthony e buon 2019.

Guardando il demo inizio a capire quello che intendi.
Potrei prevedere una trascrizione analitica dei dati ma trovo un po' complicato adattarla al mio caso in quanto ad esempio alcuni movimenti generati io devo andarli a trascrivere sia nella scheda di Paperino sia in quella di Topolino, questo per la tipologia propria del lavoro di cui ci occupiamo. Inoltre alcuni clienti hanno più schede suddivise per tipologia di servizio (come se avessi topolino_pere, topolino_mele e topolino_patate) e un errore in fase di compilazione andrebbe ad incidere su più schede e non sarebbe di facile individuazione dovendo spulciare una mole imponente di dati. Aggiungo, ma forse non è un problema, che per alcuni clienti ho bisogno di dati che non servono per altri.

Le schede clienti hanno layout il più possibile standardizzato, ma nel tempo è venuta necessità di aggiungere nuovi campi per accogliere nuove quantità di dati che necessitavano su nuovi clienti, e ciò potrà capitare ancora.
Forse dovrei valutare di ricostruire un layout che mi consenta di avere uniformità nei campi che devono essere poi confrontati, ed elasticità in spazi dedicati alle caratteristiche del cliente. Questo è cmq il motivo per cui creavo un riepilogo mensile, tracciare in maniera più analitica i dati di maggior interesse di tutti i clienti.
I costi dei trasporti/smaltimenti sono differenti da cliente a cliente e variano mensilmente. Per questo motivo trovo più pratico avere un foglio per ogni cliente invece di avere un unico foglio che mi estrapola i dati all'inserimento del nome del cliente.

Detto questo in parallelo a ciò che ho adesso voglio provare a seguire la strada che consigli per verificare se il tutto risulti gestibile o, ancor meglio, più gestibile!

Appena ho un secondo provo a vedere l'effetto della macro che hai creato e sicuramente ti darò conto del risultato ottenuto.

Ancora grazie per l'aiuto.
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Macro creazione report

Postdi project4 » 14/01/19 15:41

Buongiorno Anthony, scusa la lentezza ma sto testando la macro compatibilmente con gli impegni lavorativi.

Per il momento devo dire che mi pare funzionare abbastanza bene ad eccezione della tabella pivot che con i file originali non viene intaccata da nessun nuovo dato (senza cmq ricevere nessun errore al lancio della macro) e il grafico che mi riporta troppi dati per poter essere indicativo (ca. 100 clienti generano un incrocio di righe confusionario)

Ti chiedo una delucidazione:
sto testando, su copie dei file originali, il funzionamento della macro (per il momento solo sui file di tipo AA), ho creato un Gennaio ed un Febbraio e simulato che a Febbraio abbia aggiunto un foglio con una scheda cliente in più.
Noto che sul riepilogo annuale nel foglio Yriep_AA, colonna K il nuovo cliente viene aggiunto come ultimo valore, senza quindi rispettarmi l'ordine alfabetico. è normale?

Cmq devo dire che l'impostazione che hai dato va ben oltre le mie aspettative, anzi mi obblighi ad impegnarmi maggiormente per capire e valorizzare la parte grafica (che se fatta bene darà subito di acchito l'idea dell'andamento aziendale senza neppure "studiare" i numeri) e sono curioso di capire anche cosa posso tirare fuori dalla tabella pivot non conoscendo affatto questo oggetto, purtroppo non capisco perchè non mi si riempa coi dati corretti ma è rimasta con gli esempi di topolino paperino e compagnia bella.
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Macro creazione report

Postdi Anthony47 » 15/01/19 14:34

La tabella pivot non si aggiorna automaticamente quando nuovi dati vengono aggiunti ai dati di origine; seleziona una cella della tabella di sinistra, tasto dx, scegli Aggiorna. La pivot di destra invece e' impostato che si ricalcoli quando viene ricalcolata quella di sx (vedi il codice della Private Sub Worksheet_PivotTableChangeSync nel modulo vba del foglio Pivot_AA

L'elenco dei clienti in colonna K e' fatta nell'ordine con cui essi compaiono nella tabella di sinistra; se li vuoi in oridine devi ordinare la tabella di col A:G. Lo puoi fare con una macro autoregistrata (cioe' che registri mentre selezioni le colonne A:G e poi ordini secondo colonna B e, come seconda chiave, la colonna A); poi richiami questa macro all'interno della mia Sub yRiep, appena prima di creare la lista di colonna K, come segue:
Codice: Seleziona tutto
'
Call MacroPerOrdinareTabella                    '<<< Inserire in questa posizione; usa il vero nome della macro
'Crea lista Clienti in K4 e sottostanti:

Per le istruzioni e i primi suggerimenti su come registrare una macro:
viewtopic.php?f=26&t=103893&p=622593#p622593

NB: sempre con la macro autoregistrata puoi fare in modo che la tabella pivot si aggiorni automaticamente quando attivi il suo foglio:
-registra una macro mentre esegui manualmente l'aggiornamento della pivot di sinistra
-poi Tasto dx sul tab col nome "Pivot_AA", scegli Visualizza codice; ti troverai nel foglio che gia'' contiene il codice che aggiorna la tabella pivot di destra, in coda aggiungigli questa altra macro:
Codice: Seleziona tutto
Private Sub Worksheet_Activate()
    Call AggiornaPivot1     'usa il vero nome della macro autoregistrata
End Sub


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17355
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro creazione report

Postdi project4 » 10/04/19 12:45

Ciao Anthony, sono andato avanti con lo schema senza modificare l'origine dati in quanto non ho trovato una forma che mi consentisse la "flessibilità" della registrazione su singola scheda. Probabilmente non è l'approccio migliore ma sto comunque ottenendo un discreto risultato.

Ti disturbo per un motivo: quando lancio la macro yRiep questa mi apre i vari file per estrapolare i dati dal foglio "riepilogo mese" e proprio in questo passaggio ho trovato un problema.
Il foglio "Riepilogo mese" si aggiorna solo ogni qualvolta lo seleziono, quindi se io vado a modificare dei dati su una o più schede e non rientro in quel foglio la macro yRiep non mi rivela nessuna modifica. Come posso ovviare al problema se non assicurandomi preventivamente di aprire tutti i file manualmente, andare su Riepilogo Mese e salvare il file prima di lanciare la macro?

Grazie
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Macro creazione report

Postdi Anthony47 » 10/04/19 14:00

Per capire quello di cui parli mi rileggero' la vecchia discussione; ma con calma...
Avatar utente
Anthony47
Moderatore
 
Post: 17355
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro creazione report

Postdi project4 » 10/04/19 15:47

Provo a semplificarti la vita:

all'interno del mio progetto ho un foglio di riepilogo che tramite il seguente codice
Codice: Seleziona tutto
Private Sub Worksheet_Activate()
   
    Dim sh As Worksheet
    Dim lRiga As Long
   
    lRiga = 4
   
    With Me
        ActiveSheet.Unprotect
        Range("A4:G100").Cells.ClearContents
        For Each sh In ThisWorkbook.Worksheets
            If sh.Name <> .Name Then
            If sh.Name <> "Legenda" Then
               .Range("A" & lRiga).Value = sh.Range("A1").Value
               .Range("B" & lRiga).Value = sh.Range("AS1").Value
               .Range("C" & lRiga).Value = sh.Range("AS2").Value
               .Range("D" & lRiga).Value = sh.Range("AS3").Value
               .Range("E" & lRiga).Value = sh.Range("AS4").Value
               .Range("F" & lRiga).Value = sh.Range("AS6").Value
                lRiga = lRiga + 1
                End If
                End If
        Next
    End With

    Set sh = Nothing
    ActiveSheet.Protect

End Sub

estrapola una serie di dati da tutti gli altri fogli e crea appunto un riepilogo mensile.
Ho quindi alla fine dell'anno 12 file con 12 riepiloghi.

La macro che mi hai creato (yRiep) va a combinare i dati dei 12 riepiloghi per creare un confronto annuale suddiviso mensilmente.

La macro yRiep apre i file e copia i dati del foglio "Riepilogo Mese" ma questi dati si aggiornano solo se io manualmente seleziono il foglio altrimenti se ho eseguito modifiche sui altri fogli ma non sono tornato ad attivare "Riepilogo Mese" mi estrapola dati non aggiornati.

Spero ti sia tutto più chiaro, grazie comunque
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Macro creazione report

Postdi project4 » 10/04/19 16:09

Stavo scordando: questa è la macro yRiep con alcune modifiche, rispetto a quella che creasti tu, per adattarla alle esigenze:
Codice: Seleziona tutto
Sub yRiep()
Dim yYear As String, myF As String, subD As String, lInDir As String
Dim lastR As Long, lastC As Long, AAorBB As String, myNext As Long
Dim cMese As String, maxM As Long

subD = "MENSILI"

yYear = Left(ThisWorkbook.Name, 4)
lInDir = ThisWorkbook.Path & Application.PathSeparator & subD

Application.EnableEvents = False
'Azzera fogli Riepilogo:
ThisWorkbook.Sheets("YRiep_AA").Range("A2:J20000").ClearContents
ThisWorkbook.Sheets("YRiep_BB").Range("A2:G20000").ClearContents
'Esamina i file presenti
myF = Dir(lInDir & "\*.xls*")
Do While myF <> ""

    If myF <> ThisWorkbook.Name Then
    '
    'Controlla AA o BB:
        If InStr(1, myF, "Impianto", vbTextCompare) > 0 Then
            AAorBB = "YRiep_AA"
        ElseIf InStr(1, myF, "Trasporti", vbTextCompare) > 0 Then
            AAorBB = "YRiep_BB"
        Else
            AAorBB = ""
        End If
        '
        'Controlla Mese:
        cMese = ""
        For i = 1 To 12
            If InStr(1, myF, Format(DateSerial(2018, i, 1), "mmmm"), vbTextCompare) > 0 Then
                cMese = Application.WorksheetFunction.Proper(Format(DateSerial(2018, i, 1), "mmmm"))
                If i > maxM Then maxM = i
                Exit For
            End If
        Next i
        '
        'Apre file?
        If AAorBB <> "" And cMese <> "" Then
            Application.ScreenUpdating = True
            DoEvents: DoEvents
            Application.ScreenUpdating = False
            Workbooks.Open (lInDir & "\" & myF), 0, True
                With Sheets("Riepilogo Mese")
                    If tf = 0 Then          'Mette intestazioni su fogli YRiep
                        ThisWorkbook.Sheets("YRiep_AA").Range("A1").Value = "Mese"
                        ThisWorkbook.Sheets("YRiep_BB").Range("A1").Value = "Mese"
                        'ThisWorkbook.Sheets("YRiep_AA").Range("B1:I1").Value = .Range("A3:H3").Value
                        'ThisWorkbook.Sheets("YRiep_BB").Range("B1:G1").Value = .Range("A3:F3").Value
                    End If
                    'Copia il blocco di riepilogo:
                    lastR = .Range("A2").End(xlDown).Row - 1
                    lastC = .Range("A2").End(xlToRight).Column
                    myNext = ThisWorkbook.Sheets(AAorBB).Cells(Rows.Count, 2).End(xlUp).Row + 1
                    .Range("A4").Resize(lastR - 2, lastC).Copy '.Range("A3").Resize(lastR - 2, lastC).Copy
                    ThisWorkbook.Sheets(AAorBB).Cells(myNext, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                        :=False, Transpose:=False
                    Application.CutCopyMode = False
                End With
                'Inserisce Mese in col A:
                ThisWorkbook.Sheets(AAorBB).Cells(myNext, 1).Resize(lastR - 2, 1).Value = cMese
            ActiveWorkbook.Close False
            tf = tf + 1         'Conta file trattati
        End If
    End If
    myF = Dir                   'Prossimo file
Loop
Application.EnableEvents = True
Application.ScreenUpdating = True
'
'Crea lista Clienti in K4 e sottostanti:
Sheets("YRiep_AA").Select
    Range("B1:B1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
    "K7"), Unique:=True
    Range("B1").Select
'
'Crea Range per origine Grafico su YRiep_AA:
On Error Resume Next
    ActiveWorkbook.Names("AAGraph").Delete
On Error GoTo 0
grAdr = Range(Range("K5"), Range("K4").End(xlDown)).Resize(, maxM + 1).Address
ActiveWorkbook.Names.Add Name:="AAGraph", RefersTo:="=YRiep_AA!" & grAdr
'
'Ripete per YRiep_BB:
Sheets("YRiep_BB").Select
    Range("B1:B10000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "K7"), Unique:=True '"K4"), Unique:=True
    Range("B1").Select
On Error Resume Next
    ActiveWorkbook.Names("BBGraph").Delete
On Error GoTo 0
grAdr = Range(Range("K5"), Range("K4").End(xlDown)).Resize(, maxM + 1).Address
ActiveWorkbook.Names.Add Name:="BBGraph", RefersTo:="=YRiep_BB!" & grAdr
'
Sheets("YRiep_AA").Select
ThisWorkbook.Sheets("YRiep_AA").Range("J1:J20000").ClearContents
'Termine
MsgBox ("Completato..." & vbCrLf & "Totale file trovati: " & tf)
End Sub
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Macro creazione report

Postdi Anthony47 » 11/04/19 10:18

Allora vediamo se ce la caviamo con questa aggiunta da inserire nella Sub yRiep:
Codice: Seleziona tutto
            Workbooks.Open (lInDir & "\" & myF), 0, True                  'GIA' PRESENTE
            '>> INIZIO aggiunte                                           'AGGIUNGERE
                On Error Resume Next
                Application.DisplayAlerts = False
                Sheets(1).Select
                Sheets(2).Select
                Sheets("Riepilogo Mese").Select
                On Error GoTo 0
                Application.DisplayAlerts = True
                '<< FINE
                With Sheets("Riepilogo Mese")                             'GIA' PRESENTE
                'etc etc

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17355
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro creazione report

Postdi zsadist » 11/04/19 12:18

una domanda idiota..

non è che il comando
Application.EnableEvents = False
inibisce l'automatismo degli aggiornamenti?

scusate, ho letto ora, sono distante dal pc per poter fare prove..
Adattati! L'incapacità di cambiare direzione porta alla sconfitta
zsadist
Utente Junior
 
Post: 95
Iscritto il: 04/04/19 13:48

Re: Macro creazione report

Postdi Anthony47 » 11/04/19 14:16

zsadist ha scritto:una domanda idiota..
Se tutte le domande idiote fossero così probabilmente il Paese andrebbe meglio...

Si, l'istruzione Application.EnableEvents = False che si trova verso l'inizio della Sub yRiep inibisce l'automazione che era prevista dalle istruzioni aggiunte.
Quella riga va quindi cancellata!

Ciao!
Avatar utente
Anthony47
Moderatore
 
Post: 17355
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro creazione report

Postdi zsadist » 11/04/19 14:18

Ok, grazie
Buona giornata :)
Adattati! L'incapacità di cambiare direzione porta alla sconfitta
zsadist
Utente Junior
 
Post: 95
Iscritto il: 04/04/19 13:48

Re: Macro creazione report

Postdi project4 » 12/04/19 07:24

Un grazie come sempre ad Anthony per la disponibilità e a zsadist per l'aiuto e l'intuizione, però devo dirvi che purtroppo non ha funzionato nè aggiungere i comandi indicati nè eliminare (o sostituire false con true ho fatto entrambe le prove) la riga incriminata.

Allego i file di esempio per effettuare prove. Naturalmente il progetto prevede la creazione di 2 report (impianto e trasporti) ma per semplificare ho messo 3 file dei trasporti, quindi sul file di riepilogo annuale viene compilato solo il foglio yRiep_BB.

http://www.filedropper.com/provaaggiornamento
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Macro creazione report

Postdi zsadist » 12/04/19 08:15

come accade spesso, non sono riuscito ad interpretare il problema
ho provato i tuoi file.. ma non ho capito cosa non funziona :(
Adattati! L'incapacità di cambiare direzione porta alla sconfitta
zsadist
Utente Junior
 
Post: 95
Iscritto il: 04/04/19 13:48

Re: Macro creazione report

Postdi zsadist » 12/04/19 10:25

ahhhhhh
forse ho capito cosa intendi :)

comunque..

ho provato a inificiare il comando Application.EnableEvents = False

'Application.EnableEvents = False

e sembra che funzioni così come lo hai postato

però, in caso, puoi mettere nei fogli mensili, in "Questa cartella di lavoro" la forzatura a selezionare il "riepilogo Mensile"

no so..
Ultima modifica di zsadist su 12/04/19 10:32, modificato 1 volte in totale.
Adattati! L'incapacità di cambiare direzione porta alla sconfitta
zsadist
Utente Junior
 
Post: 95
Iscritto il: 04/04/19 13:48

Re: Macro creazione report

Postdi Anthony47 » 12/04/19 10:26

L'istruzione da eliminare e' Application.EnableEvents = False, che si trova qualsi all'inizio della macro (mentre tu probabilmente hai lavorato su Application.ScreenUpdating)

Ragionandoci, non mi piace il fatto che la macro aggiorna il contenuto dei file consultati, salvo che poi non li salva; d'altra parte non mi piacerebbe che un file "utente" (quello che contiene la Sub yRiep e che fa poi i confronti mensili) modifichi i file a cui attinge...
Insomma secondo me dovremmo risolvere il problema alla radice, evitando che i file mensili siano salvati col foglio "Riepilogo Mese" non aggiornato.
Questo si puo' ottenere inserendo nei file Mensili una Workbook_BeforeSave che costringa all'aggiornamento di "Riepilogo Mese"; il codice dovrebbe essere:
Codice: Seleziona tutto
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim cSh As String
On Error Resume Next
cSh = ActiveSheet.Name
    Application.DisplayAlerts = False
    Sheets(1).Select
    Sheets(2).Select
    Sheets("Riepilogo Mese").Select
    Application.DisplayAlerts = True
Sheets(cSh).Activate
On Error GoTo 0
End Sub

Va messa nel modulo Questa_cartella_di_lavoro /ThisWorkbook, e come puoi vedere fa la stessa cosa che ora abbiamo inserito nella Sub yRiep. Se i file sono pochi allora lo puoi fare manualmente; se invece fossero tanti ("tanti") allora si potrebbe pensare a una macro che modifichi il vba dei file mensili.

Teoricamente a quel punto le modifiche che stiamo facendo alla yRiep sarebbero inutili, ma non dannose, quindi le possiamo mettere sia nei file mensili (all'interno della Sub Workbook_BeforeSave che abbiamo visto) che nella Sub yRiep (come stiamo facendo).

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17355
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro creazione report

Postdi project4 » 12/04/19 10:49

Lascia stare che almeno tu hai avuto una bella intuizione, io sono bello ignorante sul VBA!

Cmq fai una prova: cambia i valori di un file mensile (esempio Febbraio) nel foglio PIPPO in modo da avere importi differenti nei campi "Trasporti" "Noleggi" "Smaltimenti".
Poi vai al foglio "Riepilogo Mese" vedrai che i valori si aggiornano.

Ora torna a cambiare i valori nel foglio PIPPO e non aprire il foglio "Riepilogo Mese"

Apri il file "Riepilogo annuale Easy" e fai girare la macro yRiep. Vedrai che i valori che elabora la macro sono quelli precedenti alle ultime modifiche fatte sul foglio "PIPPO". Se apri il nuovamente il file mensile Febbraio e selezioni il Foglio "Riepilogo Mese" fai aggiornare i valori, salvi e chiudi e poi torni a far girare la macro yRiep vedrai che elabora i valori corretti.

Grazie per l'interessamento, spero di essere stato sufficentemente chiaro, se servono altre info sono qui a disposizione.

EDIT: Scusate ho scritto dopo le vostre indicazioni... Ora provo gli ultimi consigli di Anthony poi vi aggiorno
Ultima modifica di project4 su 12/04/19 10:55, modificato 2 volte in totale.
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Macro creazione report":


Chi c’è in linea

Visitano il forum: Nessuno e 32 ospiti