Iniziamo col far leggere dalla routine il contenuto della casella cliccata nella quale è stato scritto il nome, che figura nella variabile globale Bersaglio:
Sub conta() MsgBox Bersaglio.FormulaR1C1 End Sub...giusto per sincerarsi che lo legga, e non potrebbe essere altrimenti, ovviamente!
Adesso dobbiamo trovare questo nome nella ListaNomiMese. Ripassiamo la sintassi del metodo Find.
Sub conta() Range("ListaNomiMese").Find(Bersaglio.FormulaR1C1).Interior.Color = vbGreen End SubL'ho testato colorando di verde le celle del range ListaNomiMese in cui figura quel nome, e funziona egregiamente!
Adesso, invece di colorare, dobbiamo mettere un numero 1 nella corrispondente cella del range NumeriGiorni o NumeriMotti.
Per far questo bisogna distinguere se la cella Bersaglio fa parte del range TurnoGiorno o TurnoNotte.
Proviamo.
Possiamo raggiungere la colonna apposita mediante il metodo Offset dell'oggetto Range, anziché tirando in ballo il range NumeroGiorni e NumeroNotti, a patto che i rapporti spaziali fra i ranges ListaNomiMese e questi siano sempre uguali (e non c'è ragione di ritenere che non lo siano).
Testo ancora con i colori l'uso di Offset.
Sub conta() Range("ListaNomiMese").Find(Bersaglio.FormulaR1C1).Offset(0, 2).Interior.Color = vbGreen End Sub...e funziona.
Adesso facciamo la differenza fra il range di origine TurnoGiorno o TurnoNotte.
Sub conta() If Intersect(Bersaglio, Range("TurnoGiorno")) Is Nothing = False Then _ Range("ListaNomiMese").Find(Bersaglio.FormulaR1C1).Offset(0, 2).Interior.Color = vbGreen If Intersect(Bersaglio, Range("TurnoNotte")) Is Nothing = False Then _ Range("ListaNomiMese").Find(Bersaglio.FormulaR1C1).Offset(0, 3).Interior.Color = vbGreen End SubPerfetto! I colori sono al loro posto. Il codice con l'uso di Offset è senz'altro meno cervellotico di quello che sarebbe il codice che usa i nomi dei ranges.
Adesso al posto dei colori bisogna mettere i numeri.
Ho elaborato qualcosa che funziona, ma è lento, perché passa in rassegna tutte le celle del range, e questa lentezza è fastidiosa.
Sub conta() Dim cellaTrovata As Range, elemento As Range, foundCell As Range For Each elemento In Range("NumeriGiorni").Cells elemento.Formula = "" Next For Each elemento In Range("TurnoGiorno").Cells If IsEmpty(elemento) = False Then Set foundCell = Range("ListaNomiMese").Find(elemento.Formula).Offset(0, 2) nome = Val(foundCell.Formula) nome = nome + 1 foundCell.Formula = nome End If Next End SubVoglio qualcosa di più rapido che non passi in rassegna tutte le celle ma vada direttamente alla cella che serve. Per far questo, devo vedere cosa c'è scritto nella cella prima e dopo.
Credo di dover rivedere prima la routine scrivi...
Nessun commento:
Posta un commento