domenica 14 settembre 2014

Creare fogli di Excel con un evento gestito dall'esterno.

Dunque...

L'aggiunta di un foglio prevede la creazione di una classe "di appoggio".
Per ogni foglio esistente nella cartella si deve creare questa classe, e ogni volta che si aggiunge un foglio si deve aggiungere un'istanza in più di questa classe.
Questa è la classe, che io chiamo "gestore":
Public WithEvents foglio As Worksheet

Private Sub foglio_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Target.FormulaR1C1 = "CICCIA"
    Cancel = True
End Sub


La sua creazione è soggetta all'apertura della cartella di lavoro:

Codice della cartella di lavoro:
Public mioGestore() As gestore
Private Sub Workbook_Open()

ReDim mioGestore(Sheets.Count - 1)
For n = 1 To Sheets.Count
Set mioGestore(n - 1) = New gestore
Set mioGestore(n - 1).foglio = Sheets(n)
Next n
End Sub
La matrice di mioGestore è resa pubblica in modo che alla procedura di aggiunta di ogni foglio si possa ampliare con la creazione di una nuova istanza del gestore:
Proviamo a creare un nuovo foglio con creazione di questa nuova istanza, ponendo in Modulo 1 il codice per la funzione "aggiungiFoglio".

Modulo1:
Public mioGestore() As gestore
Sub aggiungiFoglio()
ReDim Preserve mioGestore(UBound(mioGestore) + 1)
MsgBox UBound(mioGestore)
Set mioGestore(UBound(mioGestore)) = New gestore
Set mioGestore(UBound(mioGestore)).foglio = ThisWorkbook.Sheets.Add
End Sub
Però, dato che la dichiarazione di una variabile pubblica nel codice della cartella di lavoro non "funziona", ho spostato qui (in rosso) la dichiarazione della matrice di mioGestore.
in modo che il codice della cartella di lavoro diventa:

Cartella di lavoro:
Private Sub Workbook_Open()
ReDim mioGestore(Sheets.Count - 1)
For n = 1 To Sheets.Count
Set mioGestore(n - 1) = New gestore
Set mioGestore(n - 1).foglio = Sheets(n)
Next n
End Sub
Funziona.
Anzi, tolgo quella MsgBox nel codice del Modulo 1, che avevo messo per verificare se la grandezza della matrice aumentasse.
Public mioGestore() As gestore
Sub aggiungiFoglio()
ReDim Preserve mioGestore(UBound(mioGestore) + 1)

Set mioGestore(UBound(mioGestore)) = New gestore
Set mioGestore(UBound(mioGestore)).foglio = ThisWorkbook.Sheets.Add
End Sub
Okay!!!

Nessun commento:

Posta un commento