Condividi tramite

excel vba utilizzo Collection comando clic su una Label della collezione blocca Excek (Non Risponde )

Anonimo
2023-07-31T10:17:52+00:00

Buon Giorno

Sto adattando un esercizio realizzato da Mauro Gamberini (Calendario) alle mie necessita'

cerco di utilizzarlo come Orologio .

Nella UserForm sono presenti due Frame

frOre contiene 25 Label ( Ore da 00 a 24 )

frMinuti """""""" 12 Label ( minuti da 00 a 55 )

Al Comando Click su Label il numero della stessa (Caption) viene passato ad una cella su foglio di lavoro .

Funzionano tutte meno la Label28 con Caption 00 del Frame frMinuti generando al suo Click il Blocco del Programma

(Excel Non Risponde ) con avvio della procedura di chiusura da parte di Windows

Nonostante diversi tentativi Non riesco a risolvere il problema

questo lo screenshot della UserForm in Giallo la Label Incriminata

Questo il codice

Option Explicit

Private colLabel As Collection

Private colLabel1 As Collection

Dim myLbl As clsLabel

Dim myLbl1 As clsLabel

Private Sub cbEsci_Click()

OreMinuti.Hide

End Sub

Private Sub UserForm_Initialize()

    Dim ctl As MSForms.Control

    Dim ctl1 As MSForms.Control

10

    Set colLabel = New Collection

    For Each ctl In Me.frOre.Controls

        If TypeOf ctl Is MSForms.Label Then

            Set myLbl = New clsLabel

            Set myLbl.lbl = ctl

            Set myLbl.frm = Me

            colLabel.Add myLbl

        End If

        Next

20

     Set colLabel1 = New Collection

    For Each ctl1 In Me.frMinuti.Controls

        If TypeOf ctl1 Is MSForms.Label Then

            Set myLbl1 = New clsLabel

            Set myLbl1.lbl1 = ctl1

            Set myLbl1.frm = Me

            colLabel1.Add myLbl1

        End If

        Next

        End Sub

Private Sub UserForm_Terminate()

    Set colLabel = Nothing

    Set colLabel1 = Nothing

End Sub

Modulo di Classe

Option Explicit

Dim myLbl As clsLabel

Dim myLbl1 As clsLabel

'Dim myLbl2 As clsLabel

Private colLabel As Collection

Private colLabel1 As Collection

'Private colLabel2 As Collection

Public WithEvents lbl As MSForms.Label

Public WithEvents lbl1 As MSForms.Label

'Public WithEvents lbl2 As MSForms.Label

Public frm As UserForm

'Public frm1 As UserForm

Private Sub lbl_Click()

Dim Sh As Worksheet

Dim ctl As MSForms.Control

Dim ctl1 As MSForms.Control

10

Set colLabel = New Collection

    For Each ctl In OreMinuti.frOre.Controls

        If TypeOf ctl Is MSForms.Label Then

            Set myLbl = New clsLabel

            Set myLbl.lbl = ctl

            Set myLbl.frm = OreMinuti.frOre

            colLabel.Add myLbl

       End If

    Next

20

    With Sh

    ThisWorkbook.Worksheets("Foglio1").Range("A1").Value = lbl.Caption

    End With

    Set colLabel = Nothing

    Set ctl = Nothing

   End Sub

  Private Sub lbl1_Click()

   Dim Sh As Worksheet

   Dim ctl1 As MSForms.Control

    Set colLabel1 = New Collection

    For Each ctl1 In OreMinuti.frMinuti.Controls

        If TypeOf ctl1 Is MSForms.Label Then

            Set myLbl1 = New clsLabel

            Set myLbl1.lbl1 = ctl1

            Set myLbl1.frm = OreMinuti.frMinuti

            colLabel1.Add myLbl1

       End If

    Next

10

  With Sh

    ThisWorkbook.Worksheets("Foglio1").Range("A2").Value = lbl1.Caption

    End With

    Set colLabel1 = Nothing

    Set ctl1 = Nothing

End Sub

'Private Sub lbl2_Click()

   'Dim Sh As Worksheet

   'Dim ctl2 As MSForms.Control

    'Set colLabel2 = New Collection

    'For Each ctl2 In frmCalendario.fraGiorni.Controls

        'If TypeOf ctl2 Is MSForms.Label Then

            'Set myLbl2 = New clsLabel

            'Set myLbl2.lbl2 = ctl2

            'Set myLbl2.frm1 = frmCalendario.fraGiorni

            'colLabel2.Add myLbl2

       'End If

    'Next

'10

   'With Sh

        'ThisWorkbook.Worksheets("Foglio1").Range("A5").Value = lbl2.Caption

    'End With

    'Set colLabel2 = Nothing

    'Set ctl2 = Nothing

'End Sub

Qualsiasi aiuto e' Gradito Grazie Claudio P

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
  1. Anonimo
    2023-08-01T13:15:28+00:00

    Ciao Claudio,

    Avrei voluto aggiungere che, per un'introduzione eccellente e autorevole all'argomento dei moduli di classe in VBA, potresti leggere il seguente articolo, in inglese, di Chip Pearson:

                        [**Introduction To Classes**](http://www.cpearson.com/Excel/Classes.aspx "www.cpearson.com")
    

    ===

    Regards,

    Norman

    Immagine

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento

5 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2023-08-01T14:09:06+00:00

    ciao Norman

    In effetti non ho mai usato i moduli di classe e nemmeno i Frame .

    sto cercando di imparare e visto che in rete avevo tempo fa' scaricato il file di esempio di Mauro , mi sto esercitando su quello .

    Questo il link di dropbox dove trovi Controllo Calendario di Mauro

    https://www.dropbox.com/scl/fi/5up532n94cpbdizu1fj7e/ControlloCalendario.xlsm?rlkey=5mkywgt2iqkanyei305iw0tqv&dl=0

    Comunque mi sembra che siano ancora online tutti gli esercizi che aveva creato ( Wiki ?? )

    Grazie adesso provo le tue modifiche

          Grazie     Claudio P
    
    0 commenti Nessun commento
  2. Anonimo
    2023-08-01T13:09:11+00:00

    Ciao Claudio,

    ho caricato il file su dropbox

    https://www.dropbox.com/scl/fi/ki7nfel44t5plsqiu6838/Orologio.xlsm?rlkey=9d08236ov5u97ha5dtjajdeof&dl=0

    Sospetto che tu non abbia compreso appieno come viene creato un modulo di classe. Per utilizzare correttamente una classe deve essere trasformata in un oggetto. Nel caso del tuo file caricato, la classe di interesse viene istanziata nella procedura UserForm_Initialize della Userform OreMinuti. Tuttavia, nel tuo file, tenti anche (erroneamente) di istanziare la classe dall'interno del modulo di classe stesso.

    Quindi, per correggere il problema segnalato, e con riferimento al modulo di classe clsLabel, prova a sostituire il codice della procedura Sub lbl_Click, ossia:

    '========>>

    Private Sub lbl_Click()

    Dim Sh As Worksheet

    Dim ctl As MSForms.Control

    Dim ctl1 As MSForms.Control

    10

    Set colLabel = New Collection

    For Each ctl In OreMinuti.frOre.Controls 
    
        If TypeOf ctl Is MSForms.Label Then 
    
            Set myLbl = New clsLabel 
    
            Set myLbl.lbl = ctl 
    
            Set myLbl.frm = OreMinuti.frOre 
    
            colLabel.Add myLbl 
    
       End If 
    
    Next 
    

    20

    With Sh 
    
    ThisWorkbook.Worksheets("Foglio1").Range("A1").Value = lbl.Caption 
    
    End With 
    
    Set colLabel = Nothing 
    
    Set ctl = Nothing 
    

    End Sub

    '========>>

    con la seguente versione:

    '========>> 
    
    Private Sub lbl_Click() 
    
        Dim Sh As Worksheet 
    
        Const sFoglio As String = "Foglio1"                   '<<=== Modifica 
    
        Set Sh = ThisWorkbook.Sheets(sFoglio) 
    
        Sh.Range("A1").Value = lbl.Caption 
    
    End Sub 
    
    '<<======== 
    

    Con questa modifica la procedura lbl_Click del modulo di classe si limita correttamente a riportare nella cella A1 del foglio di lavoro la didascalia dell'oggetto label cliccato.

    Nota però che, come indicato, mi sono limitato a considerare il tuo problema immediato e, di conseguenza, il tuo progetto potrebbe richiedere ulteriori modifiche. A questo proposito, un rapido, ma non testato, sguardo alla procedura lbl1_Click suggerisce di considerare analoga modifica.

    Grazie per il tuo aiuto

    Prego! 😁

    appena risolto questo problema , affrontero' quello dei numeri con lo Zero iniziale ( 00 , 05 ) .

    Se dovessi aver bisogno di assistenza con questo, dovresti probabilmente prendere in considerazione l'apertura di un nuovo thread e, se appropriato, aggiungere un collegamento a questo thread.

    In conclusione, ti sarei grato se poteste caricare una copia del file originale di Fratello Mauro per mia personale edificazione.

    ===

    Regards,

    Norman

    Immagine

    0 commenti Nessun commento
  3. Anonimo
    2023-08-01T09:01:00+00:00

    Ciao Norman

    ho caricato il file su dropbox

    https://www.dropbox.com/scl/fi/ki7nfel44t5plsqiu6838/Orologio.xlsm?rlkey=9d08236ov5u97ha5dtjajdeof&dl=0

    Grazie per il tuo aiuto , appena risolto questo problema , affrontero' quello dei numeri con lo Zero iniziale ( 00 , 05 ) .

                                                             Grazie    Claudio P
    
    0 commenti Nessun commento
  4. Anonimo
    2023-07-31T10:41:41+00:00

    Ciao Claudio,

    Per evitare la necessità di ricreare il file di Fratello Mauro, ti chiederei gentilmente di caricare il tuo esempio problematico su Microsoft OneDrive o DropBox.

    ===

    Regards,

    Norman

    Immagine

    0 commenti Nessun commento