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=0In 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=0Noterai 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