Anche in questo caso, a farlo con formule io rischierei di grippare il mio neorone di sinistra; quindi suggerisco un "funzione personalizzata".
Cominciamo a descrivere i vari periodi, come ho fatto qui sotto nell'area in verde:
Per ogni periodo viene descritta la cella di inizio, il numero di colonne, la cella di inizio dei costi unitari da utilizzare per il periodo (area in Verde, nell'immagine)
A questo punto possiamo codificare la "funzione personalizzata byPeriod" corrispondente al seguente listato:
- Codice: Seleziona tutto
Function byPeriod(ByRef Mapper As Range, ByRef myDRan As Range) As Variant
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=111411
Dim oArr() As Double, I As Long, J As Long, K As Long
Dim cCNum As Long, cCost As Single, mySt As Range, dataSh As String, paraSh As String
'
ReDim oArr(1 To Parent.Caller.Rows.Count, 1 To Parent.Caller.Columns.Count)
dataSh = myDRan.Parent.Name
paraSh = Mapper.Parent.Name
For I = 1 To myDRan.Rows.Count
cCNum = myDRan.Cells(I, 1)
If cCNum > 0 Then
For J = 1 To Mapper.Columns.Count
If cCNum > UBound(oArr) Then Exit For
If Mapper.Cells(1, J).Value = "" Then Exit For
cCost = Sheets(paraSh).Range(Mapper.Cells(3, J).Value).Value
Set mySt = Sheets(dataSh).Range(Mapper.Cells(1, J).Value)
For K = 1 To Mapper.Cells(2, J).Value
oArr(cCNum, J) = oArr(cCNum, J) + mySt.Cells(I, K).Value * cCost
Next K
Next J
End If
Next I
byPeriod = oArr
End Function
Il codice va inserito in un "Modulo standard" del progetto vba del tuo file; per qualche informazione aggiuntiva:
viewtopic.php?f=26&t=103893&p=647675#p647675A questo punto potremo usare una formula del tipo:
- Codice: Seleziona tutto
=byPeriod(AreaDeiParametri;AreaDellaTabellaDati)
AreaDeiParametri corrisponde all'area in Verde mentre AreaDellaTabellaDati parte dalla colonna che contiene il "codice attività" (quindi C, nel tuo file dimostrativo) e deve contenere tutte le righe di cui si vuole contabilizzare il contenuto.
Cio' detto, la formula che ho utilizzato nell'area C24:G27 e'
- Codice: Seleziona tutto
=byPeriod(C30:G32;C3:U17)
La formula va introdotta in "forma di matrice" nell'area in cui si vogliono i risultati, e il numero di colonne non deve essere inferiore alle colonne compilate dei parametri
Per introdurla in forma matriciale:
-selezionare l'area dei risultati, quindi C24:G27
-inserire la formula nella barra della formula
-confermare con Contr-Maiusc-Enter, non il solo Enter
Note finali:
-Non e' fondamentale che si indichino in AreaDellaTabellaDati tutte le colonne della tabella, ma e' meglio se lo si fa, perche' in questo caso una eventuale modifica in quelle celle ricalcola immediatamente i risultati.
-la formula va introdotta in "forma di matrice" nell'area in cui si vogliono i risultati, e il numero di colonne non deve essere inferiore alle colonne compilate dei parametri
-il codice di attivita' di colonna C deve essere in formato numerico; nella tabella riepilogativa ogni riga corrisponde a un codice attivita'; questo significa che se sono stati usati i codici attivita' da 1 a 8 allora la formula andrebbe introdotta su almeno 8 righe, e se qualche codice viene saltato la relativa riga contabilizzera' 0; questo significa anche che il contenuto di B24:B27 e' solamente una intestazione che non corrisponde automaticamente al contenuto della riga (cioe' la seconda riga dei risultati contabilizza le attivita' marcate con codice attivita' = 2, anche se l'intestazione fosse ad es. 15)
Prova e vediamo cosa salta fuori...
Ciao