Checkbox crete dinamicamente



  • Checkbox crete dinamicamente
    di Valerio (utente non iscritto) data: 12/06/2013 15:19:08

    Salve,
    ho sviluppato il seguente codice per creare delle CheckBox dinamicamente in una UserForm.

    Ho un problema quando, andando a cliccare sul CommandButton, vorrei che mi comparisse una MsgBox per ciascuna CheckBox selezionata.

    Quando però clicco sul pulsante, mi compare il seguente errore.

    Compile error:
    Sub or Function non defined

    Dove sbaglio???
     
    Private Sub UserForm_Activate()
        Dim theCheckBox_ID(1 To 10) As MSForms.CheckBox
        Dim CheckBoxTop As Integer
        CheckBoxTop = 75
        Dim i As Integer
        For i = 1 To 10
            Set theCheckBox_ID(i) = Controls.Add("Forms.CheckBox.1")
            With theCheckBox_ID(i)
                .Name = "chk_" & i
                .Value = False
                .Caption = ""
                .Top = CheckBoxTop
                .Left = 12
            End With
            CheckBoxTop = CheckBoxTop + 30
        Next
        Me.Height = CheckBoxTop + 100
    End Sub
    
    Private Sub cmd_SAVE_Click()
        Dim j As Integer
        For j = 1 To 10
            If theCheckBox_ID(i).Value = True Then
                MsgBox (theCheckBox_ID(i).Name)
            End If
        Next
    End Sub



  • di Vecchio Frac data: 12/06/2013 21:26:50

    Il codice del commandbutton di salvataggio non sa che cosa sia "theCheckBox_ID(i)" e non può saperlo perchè si tratta di un vettore (da 1 a 10 elementi) che nasce e muore nella sub Userform_Initialize. Si tratta di un classico caso di visibilità delle variabili.
    Potresti spostare la dichiarazione di questa matrice sotto Option Explicit, in modo da renderla pubblica:
    Option Explicit
    Public theCheckBox_ID(1 To 10) As MSForms.CheckBox

    e quindi accessibile a tutte le sub del progetto.
    Ma ti faccio notare che tu stai assegnando un nome ad ogni singolo oggetto checkbox:
    .Name = "chk_" & i
    ed è a questo nome che ti puoi/devi riferire nella routine associata al command button "cmd_save".

    Riscrivi la routine associata al command button come segue, e tutto funzionerà ^_^
     
    Private Sub cmd_SAVE_Click()
        Dim j As Integer
        For j = 1 To 10
            If Controls("chk_" & j) = True Then
                MsgBox Controls("chk_" & j).Name
            End If
        Next
    End Sub