Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Michele,
Buongiorno, l'ho provata stamattina e funziona, è quello che mi serviva. Grazie mille. Ho alcune domande però, potresti spiegarmi il codice? Non mastico molto vba quindi vorrei capire per bene com'è costruito. E mica sai perché il mio era prima interattivo e poi no?
La procedura Crea_Caselli_di_Controllo è progettata per creare un determinato numero (definito dalla costante Numero_di_Checkbox ) di caselle di controllo in un intervallo verticale di celle. La prima cella di questo intervallo è definita dalla costante sPrima_CheckBox. Ogni cella successiva dell'intervallo è definita dall'istruzione
Set rCell = SH.Range(sPrima_CheckBox).Offset(i - 1)
In sostanza, nel primo loop del ciclo For i = 1 A Numero_di_Checkbox, i ha valore 1 e, quindi, l'istruzione sopra diventa:
Set rCell = SH.Range(sPrima_CheckBox).Offset(1 - 1)
ossia
Set rCell = SH.Range(sPrima_CheckBox).Offset(0)
oppure
Set rCell = SH.Range(sPrima_CheckBox)
questo valuta a
Set rCell = SH.Range("A4")
o qualsiasi cella specificata in precedenza per la costante sPrima_CheckBox.
La posizione di ogni casella di controllo successiva è stabilita dalla stessa istruzione. Quindi, nel secondo loop del ciclo, a variabile i assume il valore 2 e, quindi, l'espressione
SH.Range(sPrima_CheckBox).Offset(i - 1)
equivale a
SH.Range(sPrima_CheckBox).Offset(2 - 1)
o, più semplicemente
SH.Range(sPrima_CheckBox).Offset(1)
ossia:
SH.Range("A2")
Allo stesso modo, i successivi 8 loop del ciclo, definiscono le posizioni delle restanti 8 checkbox come A3, A4 ...A13.
Come ulteriore dimostrazione, se volessimo posizionare le 10 caselle di controllo in celle alternative, ovvero A4, A6, A8 ...A22, dovremmo solo modificare l'istruzione
SH.Range(sPrima_CheckBox).Offset(i - 1)
con
Set rCell = SH.Range(sPrima_CheckBox).Offset(2 * i - 2)
Lascio a te il compito di valutare l'espressione ad ogni loop del ciclo, ma il risultato di questa piccola modifica sarebbe qualcosa del genere:
[;k(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue" rel="ugc nofollow">Application.Caller che restituisce informazioni che identificano la casella di spunta su cui si clicca. Individuata la checkbox che è stata cliccata, possiamo sfruttare la sua proprietà TopLeftCell, che restituisce la cella in cui si trova l'angolo in alto a sinistra della check box, e utilizzare questa cella per definire la cella da colorare.
A dimostrazione di ciò, dopo aver posizionato un punto di interruzione nella procedura CheckBox_Clicked, cliccando sulla prima casella di spunta, le Espressioni di controllo finestra potrebbe restituire le seguenti informazioni:
Per contrasto, facendo clic sull'ultima casella di controllo, ottengo:
Spero che sia l'approccio che il codice siano in qualche modo più chiari ora.
Si noti che sarebbe stato possibile utilizzare i controlli ActiveX CheckBox e sfruttare un modulo di classe per creare un codice evento di clic per i controlli ma, a mio modesto avviso, ciò non è necessario data la versatilità della soluzione suggerita.
===
Regards,
Norman