La mia proposta e' di lavorare sull'evento MultiPage1_Change, che scatta quando si seleziona una nuova Pagina; in questa circostanza si controlla che le pagine "precedenti" siano compilate, altrimenti si impedisce il passaggio di pagina.
Ed e' stato piu' incasinato di quanto pensavo, perche' un Multipage e' in realta' solo un ...fenomeno ottico: i "controlli" appartengono tutti alla Userform, ma vengono visualizzati a gruppi separati.
Per quello che dico devi inserire nel modulo vba della userform:
- Codice: Seleziona tutto
Private Sub MultiPage1_Change()
'
NonOk = FillPage
If NonOk < Me.MultiPage1.Value Then
Beep
MsgBox ("Completare la compilazione di " & Me.MultiPage1(NonOk).Caption)
Application.OnTime Now + TimeSerial(0, 0, 0), "MPSet"
End If
End Sub
Function FillPage() As Long
Dim I As Long, myJ As Long, mPage()
'
ReDim mPage(0 To 2) '<<< 0 to NumPagine-1
'
arr0 = Array("TextBox1", "TextBox2") '<<< Elenco TextBox in Page1
arr1 = Array("TextBox3", "TextBox4") '<<< Elenco TextBox in Page2
arr2 = Array("TextBox5", "TextBox6") '<<< Elenco TextBox in Page3
'<<< Qui eventuali altri ARRxyz
'
'Compilo mPage con ARRx:
mPage(0) = arr0
mPage(1) = arr1
mPage(2) = arr2
'<<< Qui eventuali altri caricamenti di mPage(xyz) con ARRxyz
'
'Controllo compilazione TxtBox
For I = 0 To UBound(mPage)
For myJ = LBound(mPage(I)) To UBound(mPage(I))
If Me.Controls(mPage(I)(myJ)).Value = "" Then
FillPage = I
Exit Function
End If
Next myJ
Next I
FillPage = I
End Function
Le istruzioni marcate <<< vanno compilate come da commento; in particolare nei vari ARRx devi inserire il nome dei controlli che devono risultare compilati prima di autorizzare il passaggio alla Pagina successiva. I valori che trovi nella macro sono basati su un multipage con 3 pagine, contenenti ognuna 2 txtbox.
Invece in un Modulo standard del vba, inizialmente vuoto, devi inserire:
- Codice: Seleziona tutto
Public NonOk As Long 'RIGOROSAMENTE in testa al modulo
Sub MPSet()
UserForm1.MultiPage1.Value = NonOk
End Sub
L'uso di questa Sub MPSet, che viene schedulata dalla Sub MultiPage1_Change, si e' resa necessaria perche' con la mia versione di Excel il set delle Pagine fatto all'interno dei moduli vba della userform producevano un risultato assurdo: la pagine "sembrava" selezionata, ma i controlli esposti erano quelli della pagina precedente.
E' opportune che anche le Sub CommandButtonX_Click contengano la verifica che i controlli siano tutti compilati prima di salvare i dati e passare al controllo successivo; ad esempio, per CommandButton1_Click:
- Codice: Seleziona tutto
Private Sub CommandButton1_Click()
'
NonOk = FillPage
If NonOk <= Me.MultiPage1.Value Then
Beep
MsgBox ("Completare la compilazione di " & Me.MultiPage1(NonOk).Caption)
Application.OnTime Now + TimeSerial(0, 0, 0), "MPSet"
Else
'Codice per trasferire contenuto TxtBox a foglio:
With ActiveSheet
Range("A2").Value = TextBox1.Text
Range("A3").Value = TextBox2.Text
Range("A4").Value = TextBox3.Text
Range("A5").Value = TextBox4.Text
End With
Me.MultiPage1.Value = 1 'Passa da Page(0) a Page(1), la seconda
End If
End Sub
So che qualcosa non sara' comprensibile in prima battuta...