rispettare ciclo di Macro

Anonimo
2014-05-28T18:37:49+00:00

Ciao a tutti,

probabilmente la domanda sarà banale ma in funzione alla mia conoscenza non esperta ho bisogno di aiuto.

ho creato 3 Macro che devono funzionare singolarmente ma anche insieme.

mi spiego meglio:

La Macro n.1 effettua dei controlli su un primo range di celle, rilasciando degli msgbox di errore ogni qualvolta un campo obbligatorio non è rispettato.

questa Macro deve lavorare singolarmente ma deve essere coinvolta anche con la macro successiva.

La Macro n.2 effettua dei controlli su un secondo Range di celle, rilasciando, anche in questo caso, degli msgbox di errore quando il campo obbligatorio non è rispettato.

tali macro, per poter garantire un controllo adeguato utilizzano formula if  if cella A1 <> "pippo" and cella A2 = "" then msgbox("errore1")

La Macro n. 3 invece inserisce una nuova riga con campi impostati.

quello che vorrei è che le prime due macro, oltre a funzionare singolarmente, vengano coinvolte in sequenza alla pressione del tasto Inserisciriga presente sul foglio come indicato di seguito:

Parte la Macro 1 se non viene rispettata fino alla fine non deve eseguire nessun'altra azione

se viene rispettata la Macro 1 parte la Macro 2.

anch'essa deve essere rispettata per far partire la Macro 3

la macro 3 deve partire solo ed esclusivamente se le prime 2 sono rispettate.

attualmente la macro 3 mi parte lo stesso.

qualcuno può darmi una mano?

Ringrazio vivamente per l'aiuto.

Massimo.

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

10 risposte

Ordina per: Più utili
  1. Anonimo
    2014-05-29T15:19:17+00:00

    ciao a tutti,

    grazie per le risposte.

    in riferimento alla richiesta di Norman e Mauro vi posto i codici:

    <cut>

    Norman, tutto tuo... ;-)

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-05-29T10:25:08+00:00

    ciao a tutti,

    grazie per le risposte.

    in riferimento alla richiesta di Norman e Mauro vi posto i codici:

    le prime due macro create sono quelle di controllo:

    Sub ControlAnagrafica_1() Questa è la Macro 1

    Sheets("MODULO AFC").Select

    If Range("B7") = "" Then

    MsgBox ("Campo 'RAGIONE SOCIALE' Non Compilato")

    [B7].Select

    ElseIf Range("B8") = "" Then

    MsgBox ("Campo 'CODICE CLIENTE' Non Compilato")

    [B8].Select

    ElseIf Range("B10") = "" Then

    MsgBox ("Campo 'PARTITA IVA' Non Compilato")

    [B10].Select

    ElseIf Range("B11") = "" Then

    MsgBox ("Campo 'TIPOLOGIA CLIENTE' Non Compilato")

    [B11].Select

    ElseIf Range("B12") = "" Then

    MsgBox ("Campo 'CAUSALE' Non Compilato")

    [B12].Select

    ElseIf Range("C7") = "" Then

    MsgBox ("Campo 'NOTE' Non Compilato")

    [C7].Select

    Else

    Exit Sub

    End If

    End Sub

    ____________________________________________________________________________

    Sub Controllocampi_1() Questa è la Macro 2

    Sheets("MODULO AFC").Select

    If Range("E17") = "" Then

    MsgBox ("Campo FATTURA N. Non Compilato ")

    Range("E17").Select

    ElseIf Range("E18") = "" Then

    MsgBox ("Campo EMESSA IL Non Compilato ")

    Range("E18").Select

    ElseIf Range("E19") = "" Then

    MsgBox ("Campo CICLO FATTURA Non Compilato ")

    Range("E19").Select

    ElseIf Range("D23") = "Tutta La Fattura" And Range("E23") <> "" Then

    RigaBlocco_1

    ElseIf Range("H65536").End(xlUp).Offset(0, -7) = "" And Range("H65536").End(xlUp).Offset(0, -4) <> "Tutta La Fattura" And Range("H65536").End(xlUp).Offset(0, -4) <> "Effettivo" Then

    MsgBox ("Campo 'CATEGORIA SERVIZIO' Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -7).Select

    ElseIf Range("H65536").End(xlUp).Offset(0, -6) = "" And Range("H65536").End(xlUp).Offset(0, -4) <> "Tutta La Fattura" And Range("H65536").End(xlUp).Offset(0, -4) <> "Effettivo" Then

    MsgBox ("Campo 'INDIRIZZO SEDE' Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -6).Select

    ElseIf Range("H65536").End(xlUp).Offset(0, -5) = "" And Range("H65536").End(xlUp).Offset(0, -4) <> "Tutta La Fattura" And Range("H65536").End(xlUp).Offset(0, -4) <> "Effettivo" Then

    MsgBox ("Campo 'SERVIZIO IN FATTURA' Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -5).Select

    ElseIf Range("H65536").End(xlUp).Offset(0, -4) = "" And Range("A1") = "MODULO ACCREDITI" Then

    MsgBox ("Campo TIPO ACCREDITO Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -4).Select

    ElseIf Range("H65536").End(xlUp).Offset(0, -4) = "" And Range("A1") = "MODULO ADDEBITI" Then

    MsgBox ("Campo TIPO ADDEBITO Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -4).Select

    ElseIf Range("H65536").End(xlUp).Offset(0, -3) = "" Then

    MsgBox ("Campo 'IMPONIBILE' Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -3).Select

    ElseIf Range("A1") = "MODULO ACCREDITI" And Range("H65536").End(xlUp).Offset(0, -7) = "Importo Canone" And Range("H65536").End(xlUp).Offset(0, -4) = "Parziale" And Range("H65536").End(xlUp).Offset(0, -2) = "" Then

    MsgBox ("Campo PERIODO DA ACCREDITARE - DAL - Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -2).Select

    ElseIf Range("A1") = "MODULO ACCREDITI" And Range("H65536").End(xlUp).Offset(0, -7) = "Importo Canone" And Range("H65536").End(xlUp).Offset(0, -4) = "Parziale" And Range("H65536").End(xlUp).Offset(0, -1) = "" Then

    MsgBox ("Campo PERIODO DA ACCREDITARE - AL -  Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -1).Select

    ElseIf Range("A1") = "MODULO ACCREDITI" And Range("H65536").End(xlUp).Offset(0, -7) = "Rateo Canone" And Range("H65536").End(xlUp).Offset(0, -4) = "Parziale" And Range("H65536").End(xlUp).Offset(0, -2) = "" Then

    MsgBox ("Campo PERIODO DA ACCREDITARE - DAL - Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -2).Select

    ElseIf Range("A1") = "MODULO ACCREDITI" And Range("H65536").End(xlUp).Offset(0, -7) = "Rateo Canone" And Range("H65536").End(xlUp).Offset(0, -4) = "Parziale" And Range("H65536").End(xlUp).Offset(0, -1) = "" Then

    MsgBox ("Campo PERIODO DA ACCREDITARE - AL -  Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -1).Select

    ElseIf Range("A1") = "MODULO ADDEBITI" And Range("H65536").End(xlUp).Offset(0, -7) = "Importo Canone" And Range("H65536").End(xlUp).Offset(0, -4) = "Parziale" And Range("H65536").End(xlUp).Offset(0, -2) = "" Then

    MsgBox ("Campo PERIODO DA ADDEBITARE - DAL - Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -2).Select

    ElseIf Range("A1") = "MODULO ADDEBITI" And Range("H65536").End(xlUp).Offset(0, -7) = "Importo Canone" And Range("H65536").End(xlUp).Offset(0, -4) = "Parziale" And Range("H65536").End(xlUp).Offset(0, -1) = "" Then

    MsgBox ("Campo PERIODO DA ADDEBITARE - AL -  Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -1).Select

    ElseIf Range("A1") = "MODULO ADDEBITI" And Range("H65536").End(xlUp).Offset(0, -7) = "Rateo Canone" And Range("H65536").End(xlUp).Offset(0, -4) = "Parziale" And Range("H65536").End(xlUp).Offset(0, -2) = "" Then

    MsgBox ("Campo PERIODO DA ADDEBITARE - DAL - Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -2).Select

    ElseIf Range("A1") = "MODULO ADDEBITI" And Range("H65536").End(xlUp).Offset(0, -7) = "Rateo Canone" And Range("H65536").End(xlUp).Offset(0, -4) = "Parziale" And Range("H65536").End(xlUp).Offset(0, -1) = "" Then

    MsgBox ("Campo PERIODO DA ADDEBITARE - AL -  Non Compilato ")

    Range("H65536").End(xlUp).Offset(0, -1).Select

    Else

    Exit Sub

    End If

    End Sub

    ______________________________________________________________________________________________________

    Sub InsertAnagrafica_1() Questa Macro funziona perfettamente, è associata al tasto ANAGRAFICA e si completa solo al termine della Macro 1

    Application.ScreenUpdating = False

    Sheets("MODULO AFC").Select

    ControlAnagrafica_1

    Sheets("MODULO AFC").Select

        Range("a1:B2").Copy

    Sheets("RIEPILOGO").Select

    'Sheets("RIEPILOGO").Unprotect ""

        Range("a1:B2").Select

        ActiveSheet.Paste

    Sheets("MODULO AFC").Select

        Range("B7:D12").Copy

    Sheets("RIEPILOGO").Select

        Range("B7:D12").Select

        ActiveSheet.Paste

        Application.CutCopyMode = False

        Sheets("MODULO AFC").Select

        [a18].Select

        ActiveWindow.ScrollColumn = 1

    End Sub

    _____________________________________________________________________________________

    Sub InsertRiga_1() Questa è la macro associata al tasto INSERISCI RIGA

    Application.ScreenUpdating = False

    Sheets("MODULO AFC").Select

    ControlAnagrafica_1 Macro 1 - se tutte le condizioni sono rispettate

    Controllocampi_1 Macro 2 - se tutte le condizioni sono rispettate

    Range("H65536").Select

    Selection.End(xlUp).Select

    Selection.Offset(0, -7).Select

    ActiveCell(2).Resize(1).EntireRow.Insert

    ActiveCell(1).EntireRow.Copy ActiveCell(2).Resize(1).EntireRow

    On Error Resume Next

    ActiveCell(2).Resize(1).EntireRow. _

    SpecialCells(xlConstants).ClearContents

    Selection.Offset(0, 0).Select

    Application.CutCopyMode = False

    Selection.Offset(1, 0).Select

    Range("H65536").Select

    Selection.End(xlUp).Select

    Selection.Offset(0, -7).Select

    End Sub

    I commenti in grassetto li ho inseriti per, spero, spiegarmi meglio.

    Vi ringrazio per l'aiuto.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-05-29T07:10:29+00:00

    ...

    qualcuno può darmi una mano?

    Ringrazio vivamente per l'aiuto.

    Massimo.

    In alternativa all'esempio di Norman, ma sostanzialmente simile.

    Una macro generale che richiama ciascuna macro e verifica la corretta terminazione prima dell'esecuzione di quella successiva. Nel codice di esempio ho inserito il controllo anche nella Macro2 (nel caso la macro possa essere eseguita autonomamente).

    E' possibile anche inserire un parametro nella macro che costituirà il return code di quella macro (dipende da quello che fanno e se sono indipendenti tra di loro). La definizione e il richiamo cambierebbero così:

    Sub Macro1(RetCode as Long)

    Call Macro1(RetCode)

    Ecco il codice di esempio.---

    Option Explicit

    '--- utilizzo il tipo long così posso restituire diversi codici di errore

    '--- supponiamo che 0 indichi esecuzione terminata senza errori,

    '--- mentre un valore diverso un qualsiasi errore che posso

    '--- esplicitare con un messaggio e/o tentare di correggere

    Dim RetCodeMacro1 As Long

    Dim RetCodeMacro2 As Long

    Dim RetCodeMacro3 As Long

    Sub MacroGenerale()

      RetCodeMacro1 = 0

      RetCodeMacro2 = 0

      RetCodeMacro3 = 0

      '--- eseguo la macro1

      Call Macro1

      '--- controllo esito macro1

      If RetCodeMacro1 = 0 Then

        '--- terminata senza errori, posso continuare

        Call Macro2

        '--- controllo esito macro2

        If RetCodeMacro2 = 0 Then

          '--- terminata senza errori, posso continuare

          Call Macro3

          If RetCodeMacro3 = 0 Then

            '--- terminata senza errori

          Else

            '--- la macro3 ha restituito l'errore RetCodeMacro3

          End If

        Else

          '--- la macro2 ha restituito l'errore RetCodeMacro2

        End If

       Else

        '--- la macro1 ha restituito l'errore RetCodeMacro1

      End If

    End Sub

    Sub Macro1()

      '--- ipotizza di terminare senza errori

      RetCodeMacro1 = 0

      '--- elaborazioni macro

      '...

      '...

      '--- la macro termina senza errori, lascio il return code a 0 ed esco

      '--- oppure, si è verificato un errore nell'esecuzione

      '--- imposto il return code con valore diverso da 0 (a seconda dell'errore se mi interessa)

      RetCodeMacro1 = 9

    End Sub

    Sub Macro2()

      '--- se la macro può essere eseguita indipendentemente prima

      '--- controllo che la macro precedente sia terminata correttamente, altrimenti esco

      If RetCodeMacro1 <> 0 Then Exit Sub

      '--- ipotizza di terminare senza errori

      RetCodeMacro1 = 0

      '--- elaborazioni macro

      '...

      '...

      '--- la macro termina senza errori, lascio il return code a 0 ed esco

      '--- oppure, si è verificato un errore nell'esecuzione

      '--- imposto il return code con valore diverso da 0 (a seconda dell'errore se mi interessa)

      RetCodeMacro1 = 9

    End Sub

    Sub Macro3()

      '--- analoga a Macro2

    End Sub


    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-05-29T07:04:39+00:00

    Parte la Macro 1 se non viene rispettata fino alla fine non deve eseguire nessun'altra azione

    se viene rispettata la Macro 1 parte la Macro 2.

    anch'essa deve essere rispettata per far partire la Macro 3

    la macro 3 deve partire solo ed esclusivamente se le prime 2 sono rispettate.

    attualmente la macro 3 mi parte lo stesso.

    Come scrive Norman, sarebbe interessante vedere il tuo codice. inoltre, a me non è chiaro se le macro possono o meno essere eseguite *singolarmente*. Se devono essere eseguite SOLO in sequenza, semplificando (molto);

    Dim sh As Worksheet

    Public Sub m_1()

        Set sh = ThisWorkbook.Worksheets("Foglio1")

        With sh

            MsgBox "Sono m_1"

            If .Range("A1").Value <> "" Then

                Call m_2

            End If

        End With

        Set sh = Nothing

    End Sub

    Private Sub m_2()

        With sh

            MsgBox "Sono m_2"

            If .Range("A2").Value <> "" Then

                Call m_3

            End If

        End With

    End Sub

    Private Sub m_3()

        With sh

            MsgBox "Sono m_3"

        End With

    End Sub

    Dove se non ho nulla in A1 del Foglio1, viene eseguita solo la macro m_1. Se ho qualcosa in A1 e nulla in A2, vengono eseguite solo le macro m_1 e m_2. Se ho un valore anche in A2, vengono eseguite tutte e tre le macro. Banale sostituire il semplice  ciclo If degli esempi con il tuo codice.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2014-05-29T00:59:29+00:00

    Ciao Massimo,

    Sarebbe stato utile se avessi postato il codice delle tre macro. Tuttavia, supponendo che si trova tre CommandButton sul foglio di lavoro, penso che il codice riportato di seguito illustri schematicamente un metodo per realizzare i tuoi requisiti.

    Nel modulo di codice del foglio di interesse, incolla:

    '=======>>

    Option Explicit

    Private blStop As Boolean

    Private blButton1 As Boolean

    Private blButton2 As Boolean

    Private blButton3 As Boolean

    '---------->>

    Private Sub CommandButton1_Click()

        blButton1 = blButton2 = False _

                         And blButton3 = False

        If Me.Range("A1").Value <> "pippo" _

                 And Me.Range("A2") = "" Then

            MsgBox ("errore1")

            GoTo XIT

        Else

            If Not blButton2 Then

                Call CommandButton2_Click

            End If

        End If

        blButton1 = False

        Exit Sub

    XIT:

        blButton1 = False

        blStop = True

    End Sub

    '---------->>

    Private Sub CommandButton2_Click()

        blButton2 = True = blButton1 = False And blButton3 = False

        If Not blButton1 And Not blButton3 Then

            blStop = False

            Call CommandButton1_Click

            If blStop Then

                GoTo XIT

            End If

        End If

        If Me.Range("B1").Value <> "Pluto" _

                    And Me.Range("B2") = vbNullString Then

            Call MsgBox(Prompt:="errore2")

            blStop = True

        Else

            If Not blButton3 Then

                Call CommandButton3_Click

            End If

        End If

    XIT:

        blButton2 = False

        If blButton2 Then

            blStop = False

        End If

    End Sub

    '---------->>

    Private Sub CommandButton3_Click()

        If Not blButton1 And Not blButton2 Then

            blButton3 = True

            Call CommandButton1_Click

        End If

        If Not blStop Then

            Call MsgBox(Prompt:="Eureka! Sei arrivato al pulsante 3!")

            'Tuo codice per inserire una riga; ad esempio:

            Me.Range("A10").EntireRow.Insert Shift:=xlShiftDown

            blStop = False

        End If

    XIT:

        blButton3 = False

        blStop = False

    End Sub

    '<<=======

    Prova questo codice di esempio per verificare che soddisfi i principi enunciati nella tua richiesta e poi, se i risultati sono positivi, adatta il codice per comprendere le tue macro esistenti. Se dovessi aver bisogno di assistenza per adeguare il codice, chiedi pure!

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento