Condividi tramite

Bloccare esecuzione macro.

Anonimo
2020-08-24T23:57:27+00:00

Ciao,

ho due intervalli di celle D7 : D29 e G7 : G29 formati da celle unite a due a due.

Vorrei che un pulsante possa eseguire la sua macro solo se, per ogni riga, cominciando dalla riga 7 a scendere, ci siano i dati solo nella cella della colonna D.

Faccio un esempio:

se scrivo un dato nella cella D7 la macro funziona correttamente, mentre se scrivo un dato nella cella G7 la macro si deve bloccare;

continuando, se scrivo un dato nella cella D9 la macro funziona correttamente, mentre se scrivo un dato nella cella G9 la macro si deve bloccare;

continuando, se scrivo un dato nella cella D11 la macro funziona correttamente, mentre se scrivo un dato nella cella G11 la macro si deve bloccare e così via fino alla cella D29 e G29.

Spero di aver reso la domanda comprensibile.

Vladimiro

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

Anonimo
2020-08-25T15:11:31+00:00

Ciao Vladimiro,

non c'è nulla di nascosto.

Prendiamo il tuo esempio, scorporato di tutto:

Public Sub RESET_Click()

    Dim Rng As Range

    Const sIntervallo As String = "D7:D29"

    Set Rng = Intersect(ActiveSheet.Range(sIntervallo), ActiveCell)

    If Rng Is Nothing Then

       MsgBox "Bloccato" ' Beep

        Exit Sub

    End If

    MsgBox "Non bloccato"

End Sub

Così dovrebbe funzionare, invece, come puoi vedere, non va.

Vedo che ho frainteso la tua richiesta in quanto pensavo che il pulsante sarebbe stato premuto mentre il cursore si trovava nella colonna D.

In ogni caso, prova la seguente versione:

'========>>

Option Explicit

'-------->>

Public Sub RESET_Click()

    Dim Rng As Range, rCell As Range

    Dim bFlag As Boolean

    Const sIntervallo As String = "D7:D29"

    Set Rng = ActiveSheet.Range(sIntervallo)    

    For Each rCell In Rng.Cells

        With rCell

            If Not IsEmpty(.Value) Then

                If IsEmpty(.Offset(0, 3).Value) Then

                    bFlag = True

                    Exit For

                End If

            End If

        End With

    Next rCell

    If bFlag Then

        Range("Y56") = Range("Y56") + Range("Q56") - Range("J2")

        Range("G7:G29,D7:D29").Value = ""

    End If

End Sub

'<<========

Ho aggiornato il mio file di prova Vladimiro20200825.xlsm

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2020-08-25T13:50:00+00:00

    Ciao Vladimiro,

    siccome mi trovo fuori casa non posso incollarti la macro.

    Comunque è una macro semplicissima, nel senso che copia i dati in una cella e li incolla in un'altra cella azzerando altre due celle.

    Per cui, basta un exit sub prima del suddetto codice se non ci sono le condizioni.

    Pulsante_Click()

    If "non ci sono le condizioni"

    Exit Sub

    End If

    Range("A1") = Range("A1") + Range("B1")

    Range("C1") = ""

    End Sub

    Prova qualcosa del genere:

    '========>>

    Option Explicit

    '-------->>

    Public Sub Tester()

        Dim Rng As Range

        Const sIntervallo As String = "D7:D29"

        Set Rng = Intersect(ActiveSheet.Range(sIntervallo), ActiveCell)

        If Rng Is Nothing Then

            Exit Sub

        End If

        '\ Tuo codice

    End Sub

    '<<========

    ===

    Regards,

    Norman

    Ciao Norman,

    questa è l'intera macro compreso il tuo suggerimento:

    Sub RESET_Click()

        Dim Rng As Range

        Const sIntervallo As String = "D7:D29"

        Set Rng = Intersect(ActiveSheet.Range(sIntervallo), ActiveCell)

        If Rng Is Nothing Then

            Beep

            Exit Sub

        End If

        Range("Y56") = Range("Y56") + Range("Q56") - Range("J2")

        Range("G7:G29,D7:D29") = ""

    End Sub

    Però mi blocca completamente il pulsante reset, sia se scrivo un dato nella cella D7 sia se scrivo un dato nella cella G7.

    In definitiva, quello che deve fare è bloccare il pulsante solo se inserisco un dato nella cella G7.

    Faccio un altro esempio:

    D7= 3      G7= 1,2 -> pulsante bloccato

    D9= 2      G9= 1,3  ->pulsante bloccato

    D11=4     G11=""   ->pulsante libero

    Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2020-08-25T11:16:21+00:00

    Ciao Vladimiro,

    siccome mi trovo fuori casa non posso incollarti la macro.

    Comunque è una macro semplicissima, nel senso che copia i dati in una cella e li incolla in un'altra cella azzerando altre due celle.

    Per cui, basta un exit sub prima del suddetto codice se non ci sono le condizioni.

    Pulsante_Click()

    If "non ci sono le condizioni"

    Exit Sub

    End If

    Range("A1") = Range("A1") + Range("B1")

    Range("C1") = ""

    End Sub

    Prova qualcosa del genere:

    '========>>

    Option Explicit

    '-------->>

    Public Sub Tester()

        Dim Rng As Range

        Const sIntervallo As String = "D7:D29"

        Set Rng = Intersect(ActiveSheet.Range(sIntervallo), ActiveCell)

        If Rng Is Nothing Then

            Exit Sub

        End If

        '\ Tuo codice

    End Sub

    '<<========

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2020-08-25T08:27:10+00:00

    Ciao Vladimiro,

    ho due intervalli di celle D7 : D29 e G7 : G29 formati da celle unite a due a due.

    Vorrei che un pulsante possa eseguire la sua macro solo se, per ogni riga, cominciando dalla riga 7 a scendere, ci siano i dati solo nella cella della colonna D.

    Faccio un esempio:

    se scrivo un dato nella cella D7 la macro funziona correttamente, mentre se scrivo un dato nella cella G7 la macro si deve bloccare;

    continuando, se scrivo un dato nella cella D9 la macro funziona correttamente, mentre se scrivo un dato nella cella G9 la macro si deve bloccare;

    continuando, se scrivo un dato nella cella D11 la macro funziona correttamente, mentre se scrivo un dato nella cella G11 la macro si deve bloccare e così via fino alla cella D29 e G29.

    Ti chiederei gentilmente di postare la tua macro.

    ===

    Regards,

    Norman

    Ciao Norman,

    siccome mi trovo fuori casa non posso incollarti la macro.

    Comunque è una macro semplicissima, nel senso che copia i dati in una cella e li incolla in un'altra cella azzerando altre due celle.

    Per cui, basta un exit sub prima del suddetto codice se non ci sono le condizioni.

    Esempio:

    Pulsante_Click()

    If "non ci sono le condizioni"

    Exit Sub

    End If

    Range("A1") = Range("A1") + Range("B1")

    Range("C1") = ""

    End Sub

    Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2020-08-25T01:14:58+00:00

    Ciao Vladimiro,

    ho due intervalli di celle D7 : D29 e G7 : G29 formati da celle unite a due a due.

    Vorrei che un pulsante possa eseguire la sua macro solo se, per ogni riga, cominciando dalla riga 7 a scendere, ci siano i dati solo nella cella della colonna D.

    Faccio un esempio:

    se scrivo un dato nella cella D7 la macro funziona correttamente, mentre se scrivo un dato nella cella G7 la macro si deve bloccare;

    continuando, se scrivo un dato nella cella D9 la macro funziona correttamente, mentre se scrivo un dato nella cella G9 la macro si deve bloccare;

    continuando, se scrivo un dato nella cella D11 la macro funziona correttamente, mentre se scrivo un dato nella cella G11 la macro si deve bloccare e così via fino alla cella D29 e G29.

    Ti chiederei gentilmente di postare la tua macro.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento