martedì 23 settembre 2014

Prima soluzione per il calcolo: troppo lenta.

Adesso ricreo ex novo la routine conta che pongo nel modulo RoutinesDiCalcolo.
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 Sub
L'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 Sub
Perfetto! 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 Sub
Voglio 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