Risolto modulo di classe come condividerlo con più userforms?

Antonio_lmp

Utente abituale
19 Febbraio 2018
190
18
Lampedusa
2010-2016
5
Visual Basic:
Option Explicit

Public WithEvents lbl As MSForms.Label
Public frm As UserForm

Private Sub lbl_Click()

 UserForm1.ActiveControl.Value = CDate(lbl.Caption & frmCalendario.MeseAnno)
 Unload frmCalendario

End Sub


Private Sub lbl_MouseMove(ByVal Button As Integer, _
    ByVal Shift As Integer, _
    ByVal X As Single, _
    ByVal Y As Single)
    
    If lbl.Caption <> "" Then
        mTogliColore
        lbl.BackColor = RGB(255, 255, 0)
    End If
    
End Sub

Private Sub mTogliColore()
    Dim ctl As Control
    For Each ctl In frm.Controls("fraGiorni").Controls
        ctl.BackColor = &H8000000F
    Next
End Sub
Un saluto a tutti,
Allego un file che utilizzo come modulo di classe per un calendario per inserire la data in campi date e fin quì tutto OK se so uso con una sola userform.
Adesso ho la necessità di utilizzarlo con più userform e l'ho modificato come di seguito al punto Private Sub lbl_Click() ma non funziona. come posso fare per dire che se è aperta la userform1 deve eseguire:
UserForm1.ActiveControl.Value = CDate(lbl.Caption & frmCalendario.MeseAnno)
Unload frmCalendario
e di conseguenza con la userform2:
UserForm2.ActiveControl.Value = CDate(lbl.Caption & frmCalendario.MeseAnno)
Unload frmCalendario

Un grazie a tutti come sempre e grazie a priori.

Visual Basic:
Option Explicit

Public WithEvents lbl As MSForms.Label
Public frm As UserForm
Private Sub lbl_Click()

If CurrentProject.AllForms("Userform1").IsLoaded Then
UserForm1.ActiveControl.Value = CDate(lbl.Caption & frmCalendario.MeseAnno)
 Unload frmCalendario
 End If
 
 
If CurrentProject.AllForms("Userform2").IsLoaded Then
 UserForm2.ActiveControl.Value = CDate(lbl.Caption & frmCalendario.MeseAnno)
 Unload frmCalendario
 End If

End Sub


Private Sub lbl_MouseMove(ByVal Button As Integer, _
    ByVal Shift As Integer, _
    ByVal X As Single, _
    ByVal Y As Single)
    
    If lbl.Caption <> "" Then
        mTogliColore
        lbl.BackColor = RGB(255, 255, 0)
    End If
    
End Sub

Private Sub mTogliColore()
    Dim ctl As Control
    For Each ctl In frm.Controls("fraGiorni").Controls
        ctl.BackColor = &H8000000F
    Next
End Sub
 

Antonio_lmp

Utente abituale
19 Febbraio 2018
190
18
Lampedusa
2010-2016
5
Ciao a tutti scusate il ritardo
Visual Basic:
Option Explicit

Public WithEvents lbl As MSForms.Label
Public frm As UserForm
Private Sub lbl_Click()
    UserForm1.ActiveControl.Value = CDate(lbl.Caption & frmCalendario.MeseAnno)
    Unload frmCalendario
End Sub


Private Sub lbl_MouseMove(ByVal Button As Integer, _
    ByVal Shift As Integer, _
    ByVal X As Single, _
    ByVal Y As Single)
    
    If lbl.Caption <> "" Then
        mTogliColore
        lbl.BackColor = RGB(255, 255, 0)
    End If
    
End Sub

Private Sub mTogliColore()
    Dim ctl As Control
    For Each ctl In frm.Controls("fraGiorni").Controls
        ctl.BackColor = &H8000000F
    Next
End Sub
questo è un modulo di classe che utilizzo per un calendario la mia domanda è: al posto di Userform1 vorrei utilizzare Me in modo che con qualsiasi userform lo richiami possa funzionare ma non riesco.
Quale comando o ciclo posso utilizzare per far si che funzioni con diverse userform?
 

Antonio_lmp

Utente abituale
19 Febbraio 2018
190
18
Lampedusa
2010-2016
5
Allora non tenete conto del file precedente, allego il file corretto dove sul bottone che apre la Userform1al campo data documento cliccandoci sopra si apre un calendario che a sua volta cliccando sul giorno trasferisce la data sulla textbox.
Cliccando invece sul bottone che apre la Userform2 questa procedura non funziona proprio perchè il modulo di classe va a intercettare la Userform1, la mia domanda rivolta a chi conosce meglio i moduli di classe , se ci fosse un modo che vada ad intercettare la Userform attiva in maniera che con qualsiasi Userform il calendario mi funzioni correttamente.
 

Allegati

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
3.905
63
office pro 2010
49
Allora non tenete conto del file precedente, allego il file corretto dove sul bottone che apre la Userform1al campo data documento cliccandoci sopra si apre un calendario che a sua volta cliccando sul giorno trasferisce la data sulla textbox.
Cliccando invece sul bottone che apre la Userform2 questa procedura non funziona proprio perchè il modulo di classe va a intercettare la Userform1, la mia domanda rivolta a chi conosce meglio i moduli di classe , se ci fosse un modo che vada ad intercettare la Userform attiva in maniera che con qualsiasi Userform il calendario mi funzioni correttamente.

ora non ho tempo perchè devo docciarmi ed uscire... dopo guardo meglio ma il problema principlae è che i vari listati hanno istruzioni che si rivolgono direttamente agli altri oggetti presenti nel workbook.
Pur essendo vero che è possibile farlo perchè Excel e Vba NON sono un linguaggio di programmazione serio, per cui è possibile perfino far volare gli asini, ci sono delle regolette che vanno rispettate:

la classe, ad esempio; NON deve contenere questo tipo di istruzioi:


Visual Basic:
Private Sub lbl_Click()
    UserForm1.ActiveControl.Value = CDate(lbl.Caption & frmCalendario.MeseAnno)
Unload frmCalendario
End Sub
Anche se USerform1 lo vedi da li dove ti trovi, DEVI OBBLIGARTI, a suon di frustate a non compiere questo tipo di potenziali errori.

allo stesso modo e per gli stessi motivi, questa sub presente in userform1:
Visual Basic:
Private Sub TextBox6_Enter()
Call m
End Sub
E' concettualmente sbagliata.


Le istanze, tutte, devono sempre essere il più possibile comparti stagni.
quindi la tua classe personalizzata conterrà metodi e proprietà che andrai ad utilizzare nel momento del bisogno istanziandola ed adoperandola la dove ti serve.
il tuo calendario, allo stesso modo, dovrai trattarlo come un istanza, come un oggetto, al quele chiederai delle informazioni quando ti serviranno.

NON è il calendario che scrive la data la dove la vuoi vedere ma il calendario, come una funzione, ti restituisce una data che poi, scrivi la dove credi...

il concetto di base è che, nel calendario ci sarà una funzione, una proprietà, che assegnerai da qualche parte:

al più; questa routine:
Visual Basic:
Private Sub TextBox6_Enter()
Call m
End Sub
deve diventare qualcosa del tipo:

Visual Basic:
Private Sub TextBox6_Enter()
    TextBox6.Text = frmCalendario.DammiLaData
End Sub
percui, dentro a frmcalendario, esisterà una Properti che contiene le istruzioni per restituirti una data secondo quello che pigi nel form dedicato a fare funzione di calendario.

Marco Lauria @Marco Lauria
abbiamo capito che il tuo calendario è il più fico del mondo ma lo spirito del forum, a mio modesto avviso, è la condivisione di conoscenza e non i tuoi calendari.
Ergo.
almeno adoperalo per RISPONDERE al topic
 

Marco Lauria

Utente abituale
2 Gennaio 2017
488
28
55
Roma
www.artigianamaterassi.net
Excel 2016
32
dracoscrigno @dracoscrigno ,
non ho mai detto che il mio calendario è il più fico del mondo..... anzi è
uno delle tante versioni che ci sono in giro.....
Infatti l'ho adoperato per sistemare il file di Antonio che sembra ora funzioni....
 

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
3.905
63
office pro 2010
49
l'ho adoperato per sistemare il file di Antonio
Non hai sistemato un tubo. Hai sostituito il problema con un non problema.
Il che porta a non aver risolto il topic.
Lo so che può esser difficile comprendere questa lieve differenza ma tant'è.
Va bend al postante. Ergo. Va bene a tutti.
Fatto sta che se, al posto di un datapiker, ci fosse qualcos altro, il problema esisterebbe ancora.
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!