Eccomi qui,
pensavi che mi fossi dimenticato, eh ? 
E invece no, è solo che mi ero incaponito a cercare di fare tutto con le formule ma alla fine mi son dovuto ricredere, con le sole formule non se ne esce, e così ti ho fatto un piccolo script in VBA.
Se ho capito bene le colonne OT e OM le prendi direttamente dai fogli dei mesi, la DR non è altro che la differenza delle due quindi il problema riguarda solo la valorizzazione della colonna OR. E’ così?
Se è così questo script dovrebbe risolvere:
codice:
Option Explicit
Private Sub CommandButton1_Click()
Dim Rng, Casella, Valore, Rimanente, Mese_OM, Mese_OT
Set Rng = Range("B4:AW7")
For Each Casella In Rng
If Cells(3, Casella.Column) = "OR" Then
Casella.Value = 0
End If
Next
For Each Casella In Rng
If Cells(3, Casella.Column) = "OM" And _
Casella.Value <> 0 And _
Casella.Value <> "" _
Then
Mese_OM = Left(Cells(2, Casella.Column - 2), InStr(Cells(2, Casella.Column - 2), " ") - 1)
Rimanente = Casella.Value
For Each Valore In Rows(Casella.Row).Cells
If Valore.Column >= Casella.Column Or _
Rimanente = 0 _
Then
Exit For
End If
If Not IsNull(Cells(3, Valore.Column)) And _
Cells(3, Valore.Column) = "OT" _
Then
Mese_OT = Left(Cells(2, Valore.Column), InStr(Cells(2, Valore.Column), " ") - 1)
If Int(Mese_OT) < Int(Mese_OM) Then
If Valore > Valore.Offset(0, 1) Then
If Rimanente > Valore - Valore.Offset(0, 1) Then
Rimanente = Rimanente - (Valore - Valore.Offset(0, 1))
Valore.Offset(0, 1) = Valore
Else
Valore.Offset(0, 1) = Valore.Offset(0, 1) + Rimanente
Rimanente = 0
End If
End If
End If
End If
Next
End If
Next
End Sub
Ti do alcune indicazioni su come utilizzarlo, nel caso non sapessi farlo (indicazioni riferite a excel 2007).
Mi raccomando, salva una copia del foglio prima di cominciare a modificarlo, non si sa mai.
Per prima cosa devi cambiare le intestazioni dei mesi del foglio di riepilogo (poi ti spiego perché) inserendo il numero del mese e almeno uno spazio prima del nome (per evitare che excel interpreti male ciò che stai scrivendo dai a quelle celle il formato TESTO), per esempio così:
codice:
GEN --> 1 – GEN
FEB --> 2 – FEB
...
DIC --> 12 – DIC
Poi devi salvare il foglio come Cartella di lavoro con attivazione di macro (xlsm), che è una delle opzioni che trovi nel menu “Salva con nome”.
Verifica poi di avere, nella barra in alto, la scheda Sviluppo (affianco a Visualizza), se non c’è attivala dalle opzioni di excel.
Nella scheda Sviluppo clicca sulla freccetta sotto all’icona “Inserisci”, poi clicca sul primo controllo Active-X, cioè il pulsante di comando, e infine clicca in un punto qualsiasi del foglio per inserirlo.
Fatto questo vedrai che c’è un’icona arancione attivata che indica che sei in modalità di progettazione e che quindi puoi intervenire sulle caratteristiche del pulsante senza eseguire il codice. Per ora lasciala attiva.
Col tasto destro, selezionando proprietà, puoi personalizzare il pulsante come preferisci e puoi anche ridimensionarlo e spostarlo dove ti pare. Devi fare attenzione solo al (Name) che di default è CommandButton1: se lo cambi devi cambiare anche il nome della SUB. La Caption, cioè la scritta che compare sul pulsante puoi invece cambiarla liberamente.
Clicca ora due volte sul pulsante e inserisci il codice che ti ho postato.
Questo script viene attivato dal click sul pulsante e si occupa di valorizzare le caselle OR in base ai valori che trova nelle caselle OT e OM, senza modificare gli altri valori del foglio. Le caselle OT, OM e DR devi continuare a valorizzarle con le formule come già fai adesso (sempre che abbia capito bene
).
Per prima cosa viene individuato il range su cui agire che nei miei test era B4:AW7. Al posto di quello devi indicare il range in cui sono contenuti i tuoi dati. Il primo valore dev’essere quello della prima cella OT, in alto a sinistra, il secondo quello dell’ultima cella DR, in basso a destra.
La prima azione dello script è di azzerare tutti i valori OR del foglio per avere una situazione pulita su cui ragionare. Di questo si occupa il primo ciclo For Each.
Come vedi la ricerca dell’intestazione “OR” viene fatta sulla riga 3 perché mi sono basato sull’immagine che hai postato.
Finito l’azzeramento iniziale parte un nuovo ciclo che esplora tutte le caselle del range, una ad una, cercando le OM che contengano un valore significativo.
Quando ne trova una esegue una serie di operazioni.
La prima è di impostare nella variabile Mese_OM il numero del mese prelevato dalla seconda riga (ecco perché te li ho fatti inserire). E’ una variabile che verrà utilizzata nel seguito e per ora non te ne parlo.
Poi memorizza il valore della cella OM in una variabile Rimanente da cui verranno sottratte via via le ore assegnate alle celle OR.
Poi comincia ad esplorare tutta la riga in cui si trova alla ricerca delle celle OT. La condizione di uscita da questo ciclo (Exit For) è che sia stata superata la casella OM o che non ci siano più ore rimanenti.
Quando trova una OT preleva il suo mese e lo confronta col Mese_OM in modo che le ore OM di un certo mese possano influire solo sulle OR dei mesi precedenti.
Ricapitolando, a questo punto è stata individuata una OM significativa, ci sono ancora ore OM rimanenti da attribuire ed è stata individuata una OT di un mese precedente. Resta solo da chiedersi se bisogni attribuirle delle ore o no.
Per farlo si confronta la OT con la casella spostata di un offset 1 verso destra (cioè la OR corrispondente): se la OT è maggiore della OR vuol dire che ci sono ancora ora da compensare in quel mese e allora si verifica se le ore rimanenti siano più o meno di quelle che quel mese può accogliere aggiornando di conseguenza la cella OR e il Rimanente.
E poi i cicli continuano con le prossime OR e OM fino alla fine dei dati.
Ora devi solo tornare al foglio excel, disattivare la modalità di progettazione e cliccare sul pulsante.
Fammi sapere come va.
Ciao