› Sviluppare funzionalita su Microsoft Office con VBA › allarme fine progetto
-
AutoreArticoli
-
Buongiorno. Nella colonna Q del foglio pazienti vi sono delle date corrispondenti alla fine di progetto es Rossi (i cognomi sono nella colonna B) fine progetto 26/12/2022. Se fosse possibile all'apertura del file sarebbe utile che comparisse una msgbox che elenca gli utenti che finiscono colorando anche l'intera riga. ES aprendo il file il 26/12/2022 compare il messaggio msgbox "rossi finisce il 26/12/2022" contemporaneamente evidenziando colorando la riga ad esempio di verde; ovviamente l'evidenziazione deve sparire se apro il file il 27/12/2022. Vi ringrazio della cortese attenzione.
Puoi sfruttare a questo scopo l'evento Open del Workbook, eseguendo un controllino sulla data attuale in confronto al range di date della scadenza del progetto (sempre col metodo Find del Range dove trovansi le date di scadenza). Naturalmente stabilirei un criterio e mi farei mostrare solo gli utenti che finiscono, poniamo, a tre giorni da oggi, altrimenti avresti un msgbox lunghissimo che elenca tutte le scadenze di tutti. Colorare la riga è un corollario di questo calcolo della scadenza.
Prova a codificare qualcosa e vediamo cosa ne esce.
Private Sub Workbook_Open()
Dim giorni As String
Dim scadenza As String
Dim rng As Range
Dim cella As Range
Dim ur As Longur = Range("i" & Rows.Count).End(xlUp).Row
Set rng = Range("i7:i" & ur)
For Each cella In rng
scadenza = cella.Value
cella.Interior.ColorIndex = 3
cella.Offset(, 1).Value = "SCADUTO"
Next cellaSet rng = Nothing
End Sub
Praticamente mi colora di rosso da "i 7" e mi scrive scaduto ma non riesco a far di più. Ma non è proprio quello che vorrei.
Non hai mai codificato un confronto con la data di scadenza, però.
Qualcosa di simile a:
Private Sub Workbook_Open() Dim giorni As String Dim scadenza As String Dim rng As Range Dim cella As Range Dim ur As Long Dim diff as long ur = Range("i" & Rows.Count).End(xlUp).Row Set rng = Range("i7:i" & ur) For Each cella In rng scadenza = cella.Value diff = scadenza - Date() if diff > 0 and diff < 3 then cella.Interior.ColorIndex = 3 cella.Offset(, 1).Value = "SCADE FRA 3 GIORNI O MENO" elseif diff <= 0 then cella.Interior.ColorIndex = 3 cella.Offset(, 1).Value = "SCADUTO" end if Next cella Set rng = Nothing End Sub
a diff = scadenza - Date mi dà tipo non corrispondente. Ti ringrazio sempre della cortese attenzione. Ho sostituito con diff = DateDiff("d", Date, scadenza) e funziona. grazie!!!!! Nel mio file di prova funziona nel mio file di lavoro scadenza = cella.Value non si valorizza perché alcune celle sono vuote, non ho alcuna idea di come risolvere questo problema.
Private Sub Workbook_Open()
Dim giorni As String
Dim scadenza As String
Dim rng As Range
Dim cella As Range
Dim ur As Long
Dim diff As Longur = Range("q" & Rows.Count).End(xlUp).Row 'conteggia le celle piene
Set rng = Range("q2:q" & ur)
For Each cella In rngscadenza = cella.Value
If scadenza = "" Then GoTo a:' diff = scadenza - Date 'mi valorizza la data
'diff = DateDiff(gg, scadenza, Date)
diff = DateDiff("d", Date, scadenza)
If diff > 0 And diff < 3 Then
cella.Interior.ColorIndex = 3
cella.Offset(, 1).Value = "SCADE FRA 3 GIORNI O MENO"
ElseIf diff <= 0 Then
cella.Interior.ColorIndex = 3
cella.Offset(, 1).Value = "SCADUTO"
End If
a:
Next cella
Set rng = Nothing
End SubHo risolto cosi ... non è elegante ma funzionante
Sarebbe utile un msgbox che indichi il numero della riga e il cognome degli utenti che stanno per scadere. Grazie sempre dell'attenzione
a diff = scadenza - Date mi dà tipo non corrispondente
Eh già, la variabile "scadenza" è dichiarata come stringa ma deve essere una data. Alternativa alla tua soluzione è diff = CDate(scadenza) - Date.
Sono contento comunque che ci hai messo la testa e trovato una soluzione 🙂cella.Value non si valorizza perché alcune celle sono vuote
Puoi testare la condizione con Trim e se il risultato è vuoto, eviti la conversione (tu hai testato solo scadenza = "" ma se la cella contiene uno spazio vuoto ti dà errore comunque).
Ti prego evitiamo Goto 🙂
If scadenza = "" Then GoTo a:
Sarebbe utile un msgbox che indichi il numero della riga e il cognome degli utenti che stanno per scadere
La variabile cella identifica la riga in scadenza. Siccome si riferisce alla colonna Q, puoi spostarti di tot colonne avanti o indietro con Offset per recuperare il valore della medesima riga e della determinata colonna. Ad esempio:
ElseIf diff <= 0 Then cella.Interior.ColorIndex = 3 cella.Offset(, 1).Value = "SCADUTO"
mostra il valore della cella in cui la scadenza si è verificata; Offset sposta di una colonna a destra il riferimento e quindi (poiché cella punta al range Q) mostra il contenuto della riga in scadenza, colonna R.
Con cella.Row puoi ottenere il numero della riga "incriminata". Il cognome ni che colonna sta rispetto a Q? conta le colonne e metti questo numero in cella.Offset (0, ...) al posto dei tre puntini; un numero negativo se devi spostarti indietro e positivo se in avanti rispetto a Q. Attento allo zero che è importante e indica lo scostamento di riga (siccome non vuoi spostarti di riga, lo lasci a zero).
-
AutoreArticoli