Catena di IF VBA



  • Catena di IF VBA
    di Jellyfish data: 30/10/2012 09:47:06

    Ciao a tutti,

    C'è un modo migliore per scrive questa catena di IF???

    Grazie


     
     'Sheets("Foglio1").Select
        'If [A1] <> "" Then
            Sheets("Foglio2").Select
            If [a1] <> "" Then
                Sheets("Foglio3").Select
                If [a1] <> "" Then
                    Sheets("Foglio4").Select
                    If [a1] <> "" Then
                        'Sheets("Foglio5").Select
                            'If [A1] <> "" Then
                                Sheets("Foglio6").Select
                                If [a1] <> "" Then
                                    Sheets("Foglio7").Select
                                    If [a1] <> "" Then
                                        Sheets("Foglio8").Select
                                        If [a1] <> "" Then
                                            Sheets("Foglio9").Select
                                            If [a1] <> "" Then
                                            
                                                'Call Aggiorna_uno -- da sviluppare
                                                Call Aggiorna_due
                                                Call Aggiorna_tre
                                                Call Aggiorna_quattro
                                                Call Aggiorna_cinque
                                                'Call Aggiorna_sei -- da sviluppare
                                                Call Aggiorna_sette
                                                Call Aggiorna_otto
                                                Call Aggiorna_nove
                                                Call Aggiorna_dieci
    
                                                Exit Sub
                                            End If
                                        End If
                                    End If
                                End If
                            'End If
                        End If
                    End If
                End If
            'End If
    
    Dim nResult As Long
    nResult = MsgBox( _
    Prompt:="Uno o più Fogli risultano vuoti o non caricati correttamente. Voi procedere?", _
    Buttons:=vbYesNo)
    
    If nResult = vbNo Then
    
        Exit Sub
    
    Else
    
          
        'Call Aggiorna_uno -- da sviluppare
        Call Aggiorna_due
        Call Aggiorna_tre
        Call Aggiorna_quattro
        Call Aggiorna_cinque
        'Call Aggiorna_sei -- da sviluppare
        Call Aggiorna_sette
        Call Aggiorna_otto
        Call Aggiorna_nove
        Call Aggiorna_dieci
        
        
                
    End If



  • di HarryBosch data: 30/10/2012 10:10:54

    Ciao Jelly
    siccome controlli sempre la cella A1 di ogni foglio, conviene fare un ciclo che li passi tutti;
    - nel ciclo inserisco la domanda: se trovo un valore vuoto, chiedo se voglio comunque caricare i dati altrimenti esco dalla sub;
    - se confermo esco solo dal ciclo (exit for) im modo da richiamare le altre macro.
    - se finisco il ciclo e non sono state trovate celle vuote allora la variabile resta "False" e richiamo le altre macro.


    Nota: se i fogli da ciclare non sono tutti, ma esattamente da 1 a 9, puoi sempre modificare il ciclo, tipo:
    For i = 1 To 3
    If Sheets("Foglio" & i).[a1] = "" Then

    oppure usare sempre il For Each escludendo dalla ricerca i fogli che abbiano un certo nome..
     
    Sub controllo()
        Dim nResult As Long
        Dim foglio As Worksheet
    
        For Each foglio In Worksheets
            If foglio.[a1] = "" Then
                nResult = MsgBox( _
                          Prompt:="Uno o più Fogli risultano vuoti o non caricati correttamente. Voi procedere?", _
                          Buttons:=vbYesNo)
                If nResult = vbNo Then
                    Exit Sub
                Else
                    Exit For
                End If
            End If
        Next
    
        'Call Aggiorna_uno -- da sviluppare
        Call Aggiorna_due
        Call Aggiorna_tre
        Call Aggiorna_quattro
        Call Aggiorna_cinque
        'Call Aggiorna_sei -- da sviluppare
        Call Aggiorna_sette
        Call Aggiorna_otto
        Call Aggiorna_nove
        Call Aggiorna_dieci
    End Sub
    



  • di HarryBosch data: 30/10/2012 10:13:49

    Scusa.. lascia perdere il la frase
    "allora la variabile resta "False" e richiamo le altre macro"
    non centra nulla... finito il ciclo, se non sono state trovate celle vuote, viene semplicemente eseguito tutto quello dopo il ciclo



  • di Jellyfish data: 30/10/2012 10:15:58

    Grazie Harry!

    I nomi dei fogli hanno tutti nomi specifici e diversi... senza una regola :( e non devo fare il controllo su tutti i fogli ma solo su quelli... quindi secondo me ù2For Each foglio In Worksheets" non va bene...





  • di HarryBosch data: 30/10/2012 10:21:42

    Uhm, vediamo un pò:
    - Quanti sono i fogli da escludere?
    - I nomi dei fogli che devi ciclare hanno un suffisso o una parte in comune?



  • di Vecchio Frac data: 30/10/2012 10:33:13

    Naturalmente puoi escludere tutti quegli If con un'unica istruzione If che verifichi le condizioni legate in Or tra loro.
    Rispondi a HarryBosch per completare il quadro del problema ^_^

     
    If foglio1.[A1] <> "" Or foglio2.[A1] <>  "" Or foglio3.[A1] <> "" ....... Then 
        Msgbox "Un foglio risulta vuoto"
        Exit Sub
    End If






  • di Jellyfish data: 30/10/2012 10:46:27

    I fogli da escludere sono 9 e hanno i nomi più disparati :(

     



  • di Vecchio Frac data: 30/10/2012 10:46:33

    Una variante con Switch :)
    Naturalmente bisogna completare l'Array di fogli (variabile "r").
     
    Sub test()
    Dim r As Variant, v As Variant, z As Variant
        r = Array(Foglio1.[a1], Foglio2.[a1], Foglio3.[a1])
        
        For Each v In r
            z = Switch(v <> "", True)
            If IsNull(z) Then Exit For
        Next
    
        MsgBox IIf(IsNull(z), "Almeno un foglio non risulta compilato.", "Tutto ok!")
    End Sub






  • di HarryBosch data: 30/10/2012 11:00:00

    Allora mi sa che conviene la soluzione di proposto da VecchioFrac, sostituendo il ciclo con gli IF...OR, oppure per mezzo di quest'ultima variante con lo Switch mooolto carina.



  • di Jellyfish data: 30/10/2012 11:26:35

    Appena riesco lo provo e vi faccio sapere come va!

    Grazie mille!



  • di Vecchio Frac data: 30/10/2012 14:20:11

    cit. " I fogli da escludere sono 9 e hanno i nomi più disparati "
    ---> E' per questo che ho scritto foglio1.[A1] e *non* Sheets("Foglio1").[A1], internamente i nomi sono sempre del tipo foglioxxx (sheetxxx in edizioni non italiane), a meno di non cambiare il CodeName :)





  • di Jellyfish data: 16/11/2012 12:59:37

    Ciao a tutti eccomi ancora a combattere con questo quesito...

    Ho modificato tutto il file in modo che i fogli ora abbiano una regola.

    Quelli coinvolti INIZIANO sempre con la parola DATI (ci sono altri fogli che contengono la parola DATI ma non iniziano con DATI) però per due di questi (Arianna e Giorgia) non vale la verifica.

    Vi allego il nuovo mega IF, mi aiutereste a razionalizzarlo per favore con una regola sul numero dei fogli e magari evitando di riscrivere sempre la richiesta di messaggio.

    PS: Il messaggio a scelta esce se "vero" l'ho scritto sotto per mia comodità ....
     
     'Sheets("Dati Giorgia").Select
     'If [A1] = "" Then
         Sheets("Dati Francesca").Select
         If [A1] = "" Then
             Sheets("Dati Luisa").Select
             If [A1] = "" Then
                 Sheets("Dati Sara").Select
                 If [A1] = "" Then
                     Sheets("Dati Claudia").Select
                     If [A1] = "" Then
                         'Sheets("Dati Arianna").Select
                         'If [A1] = "" Then
                             Sheets("Dati Valeria").Select
                             If [A1] = "" Then
                                 Sheets("Dati Anna").Select
                                 If [A1] = "" Then
                                     Sheets("Dati Lorena").Select
                                     If [A1] = "" Then
                                         Sheets("Dati Internal Maria").Select
                                         If [A1] = "" Then
                                             
                                             MsgBox ("Tutti i Fogli Dati risultano vuoti o non caricati correttamente. Caricare i dati per continuare.")
                                             Exit Sub
                                         Else
                                         End If
                                        
                                           Dim nResult2 As Long
                                           nResult2 = MsgBox( _
                                           Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
                                           Buttons:=vbYesNo)
                                           If nResult2 = vbNo Then
                                           Call Visualizza_Home
                                           Exit Sub
                                           End If
                                        Else
                                        End If
                                    
                                       Dim nResult3 As Long
                                       nResult3 = MsgBox( _
                                       Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
                                       Buttons:=vbYesNo)
                                       If nResult3 = vbNo Then
                                       Call Visualizza_Home
                                       Exit Sub
                                       End If
                                    Else
                                    End If
                        
                                   Dim nResult4 As Long
                                   nResult4 = MsgBox( _
                                   Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
                                   Buttons:=vbYesNo)
                                   If nResult4 = vbNo Then
                                   Call Visualizza_Home
                                   Exit Sub
                                   End If
                                Else
                                End If
                            
    '                           Dim nResult5 As Long
    '                           nResult5 = MsgBox( _
    '                           Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
    '                           Buttons:=vbYesNo)
    '                           If nResult5 = vbNo Then
    '                           Call Visualizza_Home
    '                           Exit Sub
    '                           End If
    '                        Else
    '                        End If
                        
                        
                           Dim nResult6 As Long
                           nResult6 = MsgBox( _
                           Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
                           Buttons:=vbYesNo)
                           If nResult6 = vbNo Then
                           Call Visualizza_Home
                           Exit Sub
                           End If
                        Else
                        End If
                    
                        Dim nResult7 As Long
                        nResult7 = MsgBox( _
                        Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
                        Buttons:=vbYesNo)
                        If nResult7 = vbNo Then
                        Call Visualizza_Home
                        Exit Sub
                        End If
                    Else
                    End If
                    
                   Dim nResult8 As Long
                   nResult8 = MsgBox( _
                   Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
                   Buttons:=vbYesNo)
                   If nResult8 = vbNo Then
                   Call Visualizza_Home
                   Exit Sub
                   End If
                Else
                End If
            
            MsgBox ("eccolo")
               Dim nResult9 As Long
               nResult9 = MsgBox( _
               Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
               Buttons:=vbYesNo)
               If nResult9 = vbNo Then
               Call Visualizza_Home
               Exit Sub
               End If
            Else
            End If
    
        '   Dim nResult10 As Long
        '   nResult10 = MsgBox( _
        '   Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
        '   Buttons:=vbYesNo)
        '   If nResult10 = vbNo Then
        '   Call Visualizza_Home
        '   Exit Sub
        '   End If
        'Else
        'End I



  • di Vecchio Frac data: 16/11/2012 14:13:03

    Scusa JellyFish, ma HarryBosch aveva già risolto mi sembra, fin dalla sua prima risposta a questo thread.
    Riprendi quello con le opportune aggiustatine:
    Se il nome del foglio inizia con "Dati" e se la cella A1 del medesimo foglio è vuota, allora almeno un foglio non è compilato (e compare il messaggio, e si esce dalla sub). Altrimenti... eccetera :)
     
    ...
    For Each foglio In Worksheets
            If Left(foglio.Name, 4) = "Dati" And foglio.[A1] = "" Then...
    ...






  • di Jellyfish data: 16/11/2012 15:25:17

    Hai ragione Frac ma ho provato. Sotto il risultato e non funziona mi esce il messaggio ogni volta, con il mega if usciva solo una volta, una vota che trovava un foglio pieno chideva di procedere o meno se si diceva no usciva dalla sub altrimenti andava avanti...

    Non capisco l'errore... credo sia nel next... lo fa per ognuno
     
     
    For Each Foglio In Worksheets
            
    If Left(Foglio.Name, 4) = "Dati" And Foglio.[A1] = "" Then
                                           
        MsgBox ("Tutti i Fogli Dati risultano vuoti o non caricati correttamente. Caricare i dati per continuare.")
        Exit Sub
    
    Else
    
        Dim nResult As Long
        nResult = MsgBox( _
        Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
        Buttons:=vbYesNo)
            If nResult = vbNo Then
                Call Visualizza_Home
                Exit Sub
            End If
    
    End If
    
    Next



  • di Jellyfish data: 16/11/2012 15:29:36

    Stop sto exit for... eccco cosa devo usare!!! Provo ancora!



  • di Jellyfish data: 16/11/2012 15:50:40

    Nulla c'è qualcosa che non va :(
    Il messaggioche sono tutti vuoti non esce mai e l'altro si ripropone ad ogni foglio dove sbaglio???
     
    For Each Foglio In Worksheets
            
    If Left(Foglio.Name, 4) = "Dati" And Foglio.[A1] = "" Then
                                           
        MsgBox ("Tutti i Fogli Dati risultano vuoti o non caricati correttamente. Caricare i dati per continuare.")
        Exit Sub
    
    Else
        
        Dim nResult As Long
        nResult = MsgBox( _
        Prompt:="Uno o più Fogli Dati risultano vuoti o non caricati correttamente. Voi procedere?", _
        Buttons:=vbYesNo)
            If nResult = vbNo Then
                Call Visualizza_Home
                Exit Sub
                Else
                Exit For
            End If
    End If
    
    Next



  • di HarryBosch data: 16/11/2012 16:18:16

    Vedì così; se noti, il codice rispecchia esattamente il primo che ti ho postato.
    Se vuoi escludere i due nomi che hai detto (Giorgia e Arianna), e se anch'essi iniziano con "Dati", allora devi aggiungere un ulteriore controllo...

     
        For Each f In Worksheets
        If Left(f.Name, 4) = "Dati" And f.[a1] = "" Then
                nResult = MsgBox( _
                          Prompt:="Uno o più Fogli risultano vuoti o non caricati correttamente. Voi procedere?", _
                          Buttons:=vbYesNo)
                If nResult = vbNo Then
                    'se non confermi lanci questa macro
                    Call Visualizza_Home
                    Exit Sub
                Else
                    Exit For
                End If
            End If
        Next
        'call -->quello che vuoi fare se confermi o se i criteri sono ok
    



  • di Jellyfish data: 16/11/2012 17:32:42

    Ciao Harry, hai ragione solo che ho aggiunto anche il messaggio

    MsgBox ("Tutti i Fogli Dati risultano vuoti o non caricati correttamente. Caricare i dati per continuare.")

    e con il tuo codice non c'è :( e mi sguffe come inserire il nuovo controllo ape escludere gli altri due fogli...

    :(



  • di Vecchio Frac data: 16/11/2012 18:15:08

    cit. " e mi sguffe come inserire il nuovo controllo ape escludere gli altri due fogli "
    ---> dobbiamo adottare Jelly, sarebbe la mascotte del forum ^_^

    Scherzi a parte, sono troppo stanco per capire o non ti sei spiegata? :)





  • di Jellyfish data: 16/11/2012 18:35:24

    Dunque...

    vorrei un messaggio:

    1. quando TUTTI i fogli sono vuoti
    2. quando solo alcuni sono vuoiti (1 o più)

    Con il codice di Harry ho solo il messaggio 2. Il mio lungo lungo che ho postato oggi aveva anche il messaggio 1.

    Poi non ho capito come cavolo faccio ad escludere i foglio "Dati Giorgia" e "Dati Arianna" che, sempre nel mio codice sono con gli apicetti così non viene effettuato il controllo ma sono già pronti quando li avrò sviluppati...

    Spero sia più chiaro... :(

    Cit. "dobbiamo adottare Jelly, sarebbe la mascotte del forum ^_^" ---> MI PIACE!!!




  • di Jellyfish data: 16/11/2012 18:44:34

    ok ok sono stanca anche io... è venerdì riprovo

    Dunque...

    vorrei 2 messaggi:

    1. quando TUTTI i fogli sono vuoti
    2. quando solo alcuni fogli sono vuoti(1 o più)

    Con il codice di Harry ho solo il messaggio 2. Il mio codice lungo lungo che ho postato oggi aveva anche il messaggio 1.

    Poi non ho capito come cavolo faccio ad escludere i foglio "Dati Giorgia" e "Dati Arianna" che, sempre nel mio codice lungo lungo, sono stati esclusi con gli apicetti così non viene effettuato il controllo ma sono già pronti quando li avrò sviluppati...

    Spero sia più chiaro... :(

    Cit. "dobbiamo adottare Jelly, sarebbe la mascotte del forum ^_^" ---> MI PIACE!!!



  • di HarryBosch data: 16/11/2012 20:33:53

    Che bello! Jelly la mascotte del Forum, simpatica come idea!
    Ora mi sembra di aver capito cosa vuoi fare.. è venerdì anche per noi ^_^

    Prova... e per chiarimenti siamo qua
     
        Dim nResult As Long
        Dim f As Worksheet
        Dim tot As Integer, no As Integer
    
        For Each f In Worksheets
            If Left(f.Name, 4) = "Dati" _
               And f.Name <> "Dati Giorgia" And f.Name <> "Dati Arianna" Then
                tot = tot + 1
                If f.[A1] = "" Then
                    no = no + 1
                End If
            End If
        Next
    
        If no = tot Then
            MsgBox "Tutti i Fogli risultano vuoti o non caricati correttamente." & vbCrLf & _
                   "Caricare i dati per continuare"
            Exit Sub
    
        ElseIf no < tot And no > 0 Then
            'la variabile "no" contiene il numero dei fogli non corretti
            nResult = MsgBox(Prompt:=no & " Fogli risultano vuoti o non caricati correttamente. " & vbCrLf & _
                                     "Voi procedere?", Buttons:=vbYesNo)
            If nResult = vbNo Then
                'se non confermi lanci questa macro
                'Call Visualizza_Home
                Exit Sub
            End If
    
        End If
    
        MsgBox "Eseguo!"
        'call -->quello che vuoi fare se confermi o se i criteri sono ok
    



  • di Jellyfish data: 17/11/2012 00:38:31

    Ovviamente funziona benissimo

    Tot è il numero dei fogli

    n il numero di quelli che hanno celle vuote

    c'è una cosa che non capisco

    tot = tot + 1
    n=n+1

    perché?!?!?!?




  • di Vecchio Frac data: 17/11/2012 09:17:02

    Perchè la tua richiesta era di differenziare gli avvisi:
    cit. " vorrei 2 messaggi:
    1. quando TUTTI i fogli sono vuoti
    2. quando solo alcuni fogli sono vuoti(1 o più) "

    tot viene incrementato ad ogni passaggio di foglio
    n viene incrementato solo se [A1] di ogni foglio è vuoto
    alla fine in questo modo hai la discriminante che ti serve, comparando le due variabili.





  • di Jellyfish data: 17/11/2012 12:57:22

    incrementato... ora ho capito! :) grazie mille Frac!!!