Problemi Macro Excel VBA

Anonimo
2022-01-19T09:53:38+00:00

Buongiorno, avevo un problema con Excel, in particolare VBA e le macro, di cui premetto essere veramente alle prime armi.

In pratica avevo creato una macro con la quale quando inserivo una CheckBox ActiveX e quando la spuntavo, mi faceva diventare verde la casella A1, ovvero:

Sub CheckBox_Click()

 If CheckBox1.Value = True Then 

    Range("A1").Interior.ColorIndex = 4 

End If 

If CheckBox1.Value = False Then 

    Range("A1").Interior.ColorIndex = x1None 

End If 

End Sub

Il problema che ho è che quando l'ho creata era come se fosse sempre attiva, quindi ogni volta che attivavo/disattivavo la box, la cella diventava verde/trasparente. Stamattina invece dopo che un mio collega ha utilizzato il file, la macro è come se fosse in stand-by, e devo andare a richiamarla ogni volta, quindi non è più "interattiva", ma se abilito la casella, la cella resta trasparente, attivo la macro e me la colora. Da cosa è dovuta questa cosa? Come faccio a renderla sempre attiva e quindi interattiva, cioè ad ogni click mi varia lo sfondo della cella senza doverla richiamare ogni volta?

E un altro tentativo che ho fatto senza successo è quello di creare un ciclo in modo che questa cosa del click valga per ogni checkbox che inserisco, senza dover andare a scrivere codice. In pratica volevo rendere l'1 della parola checkbox e quello della A della cella dei contatori, quindi con un ciclo incrementarli ogni volta. Qualcuno saprebbe aiutarmi? Grazie mille in anticipo

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

4 risposte

Ordina per: Più utili
  1. Anonimo
    2022-01-21T10:22:10+00:00

    Ciao Michele,

    Buongiorno, l'ho provata stamattina e funziona, è quello che mi serviva. Grazie mille. Ho alcune domande però, potresti spiegarmi il codice? Non mastico molto vba quindi vorrei capire per bene com'è costruito. E mica sai perché il mio era prima interattivo e poi no?

    La procedura Crea_Caselli_di_Controllo è progettata per creare un determinato numero (definito dalla costante Numero_di_Checkbox ) di caselle di controllo in un intervallo verticale di celle. La prima cella di questo intervallo è definita dalla costante sPrima_CheckBox. Ogni cella successiva dell'intervallo è definita dall'istruzione

        Set rCell = SH.Range(sPrima_CheckBox).Offset(i - 1)
    

    In sostanza, nel primo loop del ciclo For i = 1 A Numero_di_Checkbox, i ha valore 1 e, quindi, l'istruzione sopra diventa:

        Set rCell = SH.Range(sPrima_CheckBox).Offset(1 - 1)
    

    ossia

        Set rCell = SH.Range(sPrima_CheckBox).Offset(0)
    

    oppure

        Set rCell = SH.Range(sPrima_CheckBox)
    

    questo valuta a

        Set rCell = SH.Range("A4")
    

    o qualsiasi cella specificata in precedenza per la costante sPrima_CheckBox.

    La posizione di ogni casella di controllo successiva è stabilita dalla stessa istruzione. Quindi, nel secondo loop del ciclo, a variabile i assume il valore 2 e, quindi, l'espressione

        SH.Range(sPrima_CheckBox).Offset(i - 1)
    

    equivale a

        SH.Range(sPrima_CheckBox).Offset(2 - 1)
    

    o, più semplicemente

        SH.Range(sPrima_CheckBox).Offset(1)
    

    ossia:

        SH.Range("A2")
    

    Allo stesso modo, i successivi 8 loop del ciclo, definiscono le posizioni delle restanti 8 checkbox come A3, A4 ...A13.

    Come ulteriore dimostrazione, se volessimo posizionare le 10 caselle di controllo in celle alternative, ovvero A4, A6, A8 ...A22, dovremmo solo modificare l'istruzione

        SH.Range(sPrima_CheckBox).Offset(i - 1)
    

    con

        Set rCell = SH.Range(sPrima_CheckBox).Offset(2 * i - 2)
    

    Lascio a te il compito di valutare l'espressione ad ogni loop del ciclo, ma il risultato di questa piccola modifica sarebbe qualcosa del genere:

                 [![Immagine](https://learn-attachment.microsoft.com/api/attachments/0143ed87-ff02-4f6b-9514-c03a4a87847f?platform=QnA"https://docs.microsoft.com/it-it/office/vba/api/excel.application.caller?f1url=%3FappId%3DDev11IDEF1%26l%3Dit-IT%26k%3Dk%28vbaxl10.chm133085%29;k%28TargetFrameworkMoniker-Office.Version%3Dv16%29%26rd%3Dtrue" title="https://docs.microsoft.com/it-it/office/vba/api/excel.application.caller?f1url=%3FappId%3DDev11IDEF1%26l%3Dit-IT%26k%3Dk(vbaxl10.chm133085);k(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue" rel="ugc nofollow">Application.Caller che restituisce informazioni che identificano la casella di spunta su cui si clicca. Individuata la checkbox che è stata cliccata, possiamo sfruttare la sua proprietà TopLeftCell, che restituisce la cella in cui si trova l'angolo in alto a sinistra della check box, e utilizzare questa cella per definire la cella da colorare.

    A dimostrazione di ciò, dopo aver posizionato un punto di interruzione nella procedura CheckBox_Clicked, cliccando sulla prima casella di spunta, le Espressioni di controllo finestra potrebbe restituire le seguenti informazioni:

    Immagine

    Per contrasto, facendo clic sull'ultima casella di controllo, ottengo:

    Immagine

    Spero che sia l'approccio che il codice siano in qualche modo più chiari ora.

    Si noti che sarebbe stato possibile utilizzare i controlli ActiveX CheckBox e sfruttare un modulo di classe per creare un codice evento di clic per i controlli ma, a mio modesto avviso, ciò non è necessario data la versatilità della soluzione suggerita.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2022-01-21T08:00:32+00:00

    Buongiorno, l'ho provata stamattina e funziona, è quello che mi serviva. Grazie mille. Ho alcune domande però, potresti spiegarmi il codice? Non mastico molto vba quindi vorrei capire per bene com'è costruito. E mica sai perché il mio era prima interattivo e poi no?

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2022-01-21T07:50:37+00:00

    Ciao Michele,

    Hai provato il mio suggerimento e ha risolto il tuo problema?

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2022-01-19T14:31:52+00:00

    Ciao Michele,

    Buongiorno, avevo un problema con Excel, in particolare VBA e le macro, di cui premetto essere veramente alle prime armi.

    In pratica avevo creato una macro con la quale quando inserivo una CheckBox ActiveX e quando la spuntavo, mi faceva diventare verde la casella A1, ovvero:

    Sub CheckBox_Click()

    If CheckBox1.Value = True Then

    Range("A1").Interior.ColorIndex = 4

    End If

    If CheckBox1.Value = False Then

    Range("A1").Interior.ColorIndex = x1None

    End If

    End Sub

    Il problema che ho è che quando l'ho creata era come se fosse sempre attiva, quindi ogni volta che attivavo/disattivavo la box, la cella diventava verde/trasparente. Stamattina invece dopo che un mio collega ha utilizzato il file, la macro è come se fosse in stand-by, e devo andare a richiamarla ogni volta, quindi non è più "interattiva", ma se abilito la casella, la cella resta trasparente, attivo la macro e me la colora. Da cosa è dovuta questa cosa? Come faccio a renderla sempre attiva e quindi interattiva, cioè ad ogni click mi varia lo sfondo della cella senza doverla richiamare ogni volta?

    E un altro tentativo che ho fatto senza successo è quello di creare un ciclo in modo che questa cosa del click valga per ogni checkbox che inserisco, senza dover andare a scrivere codice. In pratica volevo rendere l'1 della parola checkbox e quello della A della cella dei contatori, quindi con un ciclo incrementarli ogni volta. Qualcuno saprebbe aiutarmi? Grazie mille in anticipo

    Ti consiglierei di eliminare tutti i controlli ActiveX Checkbox e, invece, eseguire la seguente procedura Crea_Caselli_di_Controllo

    Questa procedura creerà il numero di caselle di controllo (non controlli ActiveX) specificato dalla costante Numero_di_Checkbox, a partire dalla cella specificata dalla costante sPrima_CheckBox.

    Con le caselle di controllo create, quando viene spuntata una casella di controllo, lo sfondo della cella corrispondente nella colonna A diventerà verde; quando una casella è deselezionata lo sfondo verrà rimosso.

    Si noti che la seconda procedura, CheckBox_Clicked, non dovrebbe essere eseguita. Questa procedura risponde invece al click delle caselle di controllo inserite dalla prima procedura.

    '========>>

    Option Explicit

    '-------->>

    Public Sub Crea_Caselli_di_Controllo()

    Dim SH As Worksheet 
    
    Dim rCell As Range 
    
    Dim CBox As CheckBox 
    
    Dim dLeft As Double, dTop As Double 
    
    Dim i As Long 
    
    Const BOX\_SIZE As Long = **16** 
    
    Const sFoglio As String = **"Foglio1"                             '<<=== Modifica** 
    
    Const sPrima\_CheckBox As String = **"B4"                     '<<=== Modifica** 
    
    Const Numero\_di\_Checkbox As Long = **10                   '<<=== Modifica** 
    
    Set SH = ThisWorkbook.Worksheets(sFoglio)      
    
    '\\ Crea caselle di controllo 
    
    For i = 1 To Numero\_di\_Checkbox 
    
        Set rCell = SH.Range(sPrima\_CheckBox).Offset(i - 1) 
    
        With rCell 
    
            dLeft = .Width / 2 - BOX\_SIZE / 2 + .Left 
    
            dTop = .Height / 2 - BOX\_SIZE / 2 + .Top + 3 
    
        End With 
    
        Set CBox = SH.CheckBoxes.Add(dLeft, dTop, BOX\_SIZE, BOX\_SIZE) 
    
        With CBox 
    
            .Caption = "" 
    
            .OnAction = "CheckBox\_Clicked" 
    
        End With 
    
    Next i 
    

    End Sub

    '-------->>

    Public Sub CheckBox_Clicked()

    Dim Rng As Range 
    
    Dim CBox As CheckBox 
    
    Set CBox = Evaluate(Application.Caller) 
    
    Set Rng = CBox.TopLeftCell.EntireRow.Cells(1) 
    
    If CBox.Value = 1 Then 
    
        Rng.Interior.ColorIndex = 4 
    
    Else 
    
        Rng.Interior.ColorIndex = xlNone 
    
    End If 
    

    End Sub

    '<<========

    Potresti scaricare il mio file di prova Michele20220119.xlsm

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento