Ciclo DoLoop



  • Ciclo Do..Loop
    di mirtylla (utente non iscritto) data: 05/11/2015 16:03:34

    Ciao a tutti!
    Ho un problema con questa macro. Il ciclo Do funziona bene fin quando la condizione "If" è verificata, ma in alcuni casi la condizione "If" non è verificata (ed è giusto che sia così). In questi casi vorrei che il ciclo scrivesse nelle celle "N4" e "O4" il testo "non verificato". Non riesco però ad inserire la funzione "Else" (ammesso che sia quella giusta da utilizzare) in modo corretto.
    Potete aiutarmi?
     
    Sub prova()
    ' PROVA Macro
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:Usersmacro"
        Do
            For a = 4 To 10
            For b = 7 To 8
            Range("N4").Value = Range("BM" & a).Value
            Range("O4").Value = Range("BQ" & b).Value
            
        If Range("V4").Value > Range("V8").Value Then Exit Do
        End If
        Next
        Next
        Loop
        
    End Sub
    



  • di mirtylla (utente non iscritto) data: 05/11/2015 16:08:05

    Posto la macro con "Else" che ho provato a fare.
    Grazie!
     
    Sub prova()
    ' PROVA Macro
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:Usersmacro"
        Do
            For a = 4 To 10
            For b = 7 To 8
        
            Range("N4").Value = Range("BM" & a).Value
            Range("O4").Value = Range("BQ" & b).Value
            
        If Range("V4").Value > Range("V8").Value Then Exit Do
        Else
            Range("N4").Value = ("non verificato").Text
    Range("N4").Value = ("non verificato").Text
        End If
        Next
        Next
        Loop
        
    End Sub



  • di cromagno data: 05/11/2015 17:11:24

    Ciao mirtylla,
    l'errore dovrebbe essere solo il modo in cui hai scritto la stringa "non verificato". Le parentesi tonde e ".Text" non servono.

    Resta comunque il fatto che non ho capito la logica di questo codice
    A meno che questo non sia solo uno spezzone di codice, i valori in V4 e V8 non vengono modificati, quindi quella condizione "If" andrebbe messa all'inizio ed una volta scritto "non verificato" uscire dalla sub.

    Comunque, ritornando all'errore del testo, il codice è questo:
     
    Sub prova()
    ' PROVA Macro
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:Usersmacro"
        Do
            For a = 4 To 10
            For b = 7 To 8
        
            Range("N4").Value = Range("BM" & a).Value
            Range("O4").Value = Range("BQ" & b).Value
            
            If Range("V4").Value > Range("V8").Value Then
                Exit Do
            Else
                Range("N4").Value = "non verificato"
                Range("O4").Value = "non verificato"
            End If
        Next
        Next
        Loop
        
    End Sub



  • di Marius44 data: 05/11/2015 17:12:08

    Ciao Mirtylla
    prova a cambiare questa riga

    If Range("V4").Value > Range("V8").Value Then Exit Do
    Else

    in quest'altra

    If Range("V4").Value > Range("V8").Value Then
    Exit Do
    Else

    Cioè metti Exit Do a capo

    Prova e fai sapere. Ciao,
    Mario



  • di mirtylla (utente non iscritto) data: 05/11/2015 18:07:29

    Ciao,
    innanzitutto vi ringrazio per avermi risposto. In realtà il codice mi cambia i valori delle due celle N4 e O4 con il ciclo "For".
    Provo a spiegarmi meglio...le due celle N4 e O4 contengono il diametro e la classe di bulloni in acciaio, il ciclo "For" mi cambia questi parametri fino a quando è soddisfatta la condizione "If", ossia fino a quando la resistenza del bullone (cella V4) è maggiore di quella della trave in acciaio (cella V8), in questo modo mi restituisce il minimo bullone da utilizzare e con "Then Exit Do" dico al ciclo di finire. In alcuni casi però (quando cambio la sezione dei profili che faccio con un'altra parte di macro) la condizione "If" è consapevolmente non soddisfatta, in questo caso il ciclo "Do" dovrebbe inserire nelle celle N4 e O4 la scritta "non verificato".
    Modificando la macro come mi avete suggerito, quando la condizione "If" non è verificata, inserisce il testo ma gira all'infinito...!Aiuto!



  • di cromagno data: 05/11/2015 18:09:46

    Ciao,
    era proprio quello che ti dicevo...
    manca un "Exit Sub" dopo che scrive "non verificato".



  • di cromagno data: 05/11/2015 18:14:00

    Comunque senza vedere anche come si comporta l'altra macro (allegare un file di esempio sarebbe la cosa migliore) non posso darti una soluzione certa.

    P.S.
    Ciao Mario



  • di cromagno data: 05/11/2015 18:21:08

    Provo a darti una soluzione "alla cieca".....

    Il codice sotto riportato potrebbe soddisfare le tue esigenze?
     
    Sub prova()
    ' PROVA Macro
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:Usersmacro"
        If Range("V4").Value <= Range("V8").Value Then
            For a = 4 To 10
            For b = 7 To 8
        
                Range("N4").Value = Range("R" & a).Value
                Range("O4").Value = Range("T" & b).Value
            Next
            Next
        Else
            Range("N4").Value = "non verificato"
            Range("O4").Value = "non verificato"
        End If
    End Sub



  • di mirtylla (utente non iscritto) data: 05/11/2015 18:22:41

    Ok, adesso ho capito cosa intendevi!
    Ti posto la macro con cui combino tra loro le sezioni di travi e colonne e salvo ogni file.
    A questa devo incorporare la macro con il ciclo Do.
    In pratica per ogni combinazione trave-colonna il ciclo "Do" mi deve far variare le due celle N4 e O4 e darmi il minimo bullone.

     
    Sub colonne_travi()
    '
    ' colonne_travi Macro
    '
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:PROVVISORIO_HE_M16_10"
        For n = 23 To 79
        For m = 23 To 79
              Range("B4").Value = Range("AV" & n).Value
              Range("F4").Value = Range("AV" & m).Value
          ActiveWorkbook.SaveAs Filename:= _
             fpath & Range("AV" & n).Value & Range("AV" & m).Value & ".xls", _
            FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
         
       Next
       Next
       
    End Sub
    



  • di cromagno data: 05/11/2015 18:25:50

    Mirtylla,
    senza vedere il file, questa altra macro non fa che complicare la comprensione....
    Adesso ci sono anche le celle "B4","F4","AVn" che non so cosa siano.

    Prova il codice che ti ho postato prima...
    Se non dovesse andare, aspetto un file di esempio.



  • di mirtylla (utente non iscritto) data: 05/11/2015 18:42:41

    Ho allegato le immagini del foglio excel, ho provato la macro ma non funziona con il <= nella condizione If, non mi restituisce quello che mi serve.



  • di cromagno data: 05/11/2015 18:53:42

    Con tutta la buona volontà che potrei avere, con le immagini non ci si può lavorare...

    Comunque non avrei avuto nemmeno tempo, sto scappando.
    Proverò a guardare domani (sempre che ci sia un file da guardare - puoi metterne uno senza dati sensibili ma che segue la stessa logica) a meno che qualcun altro non ti aiuti prima.

    Ciao Tore



  • di mirtylla (utente non iscritto) data: 06/11/2015 00:15:30

    Ho inserito il file excel.
    Grazie per l'aiuto!



  • di Albatros54 data: 06/11/2015 07:09:47

    Se ho Capito.
    Ciao
    Albatros54
     
    Sub prova()
    ' PROVA Macro
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:UsersElisabettaDocumentsTESI DOTTORATOmacro excel"
        Do
            For a = 4 To 10
                For b = 7 To 8
    
                    Range("N4").Value = Range("BM" & a).Value
                    Range("O4").Value = Range("BQ" & b).Value
    
                    If Range("V4").Value > Range("V8").Value Then
                        Range("N4").Value = "Non Verificato"
                        Range("O4").Value = "non Verificato"
    
                        Exit Do
                    End If
    
                Next
            Next
        Loop
    
    End Sub
    
    






  • di mirtylla (utente non iscritto) data: 06/11/2015 12:36:13

    Ciao Albatros,
    il ciclo "Do" mi deve far variare le celle N4 e O4 fino a quando la cella V4 è maggiore della cella V8 e poi uscire dal ciclo ("Then exit do").
    Nella macro che ho creato questo funziona benissimo, il problema è che quando la condizione V4>V8 non si verifica il ciclo mi va all'infinito, quindi devo inserire una ulteriore condizione "If" o "Else" che faccia in modo che quando la condizione V4>V8 non si verifica nelle celle N4 e O4 scriva "non verificato".
    Ti posto la macro di partenza che funziona.
    Grazie!
     
    Sub prova()
    ' PROVA Macro
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:Usersmacro excel"
        Do
            For a = 4 To 10
            For b = 7 To 8
        
            Range("N4").Value = Range("BM" & a).Value
            Range("O4").Value = Range("BQ" & b).Value
            
        If Range("V4").Value > Range("V8").Value Then Exit Do
        Next
        Next
        Loop
        
    End Sub
    



  • di Cucù data: 06/11/2015 12:58:15

    Un mio modesto parere:
    Il codice scritto è ovviamente concettualmente sbagliato...
    Serve proprio il ciclo do - loop ???
    Che senso ha scrivere "If Range("V4").Value > Range("V8").Value Then" in un doppio ciclo for se non viene modificato nessuno dei due range dal ciclo stesso???

    Cmq prova cosi (non ho potuto verificare eventuali castronerie ^_^)
    Cucù  
     
    Sub prova()
    ' PROVA Macro
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:Usersmacro excel"
        
         For a = 4 To 10
            For b = 7 To 8
            Range("N4").Value = Range("BM" & a).Value
            Range("O4").Value = Range("BQ" & b).Value
            If Range("V4").Value > Range("V8").Value Then 
            MsgBox "Finito, valore Verificato!"
            Exit sub
            End If
           Next b
        Next a
    
     MsgBox "Finito, valore non verificato"
     Range("N4").Value = "non verificato"
     Range("O4").Value = "non verificato"
    
        
    End Sub



  • di Albatros54 data: 06/11/2015 14:25:23

    Prova questa sub , se ho capito.
    Ciao
    Albatro54
     
    Sub prova()
    ' PROVA Macro
    ' Scelta rapida da tastiera: CTRL+z
    '
        Sheets("INSERIMENTO DATI").Select
        fpath = "C:UsersElisabettaDocumentsTESI DOTTORATOmacro excel"
    
        Do
            For a = 4 To 10
                For b = 7 To 8
    
                    Range("N4").Value = Range("BM" & a).Value
                    Range("O4").Value = Range("BQ" & b).Value
    
                    If Range("V4").Value > Range("V8").Value Then Exit Do
                Next
            Next
    
            Range("N4").Value = "Non Verificato"
            Range("O4").Value = "Non Verificato"
            Exit Do
        Loop
    
    End Sub
    
    






  • di Cucù data: 06/11/2015 14:49:57

    @Albatros
    Mi spieghi a cose serve il ciclo do-loop in questo caso?
    Cucù



  • di Albatros54 data: 06/11/2015 15:19:13

    Secondo il mio modesto parere, il ciclo do-loop, serve per uscire dal Loop quando la variabile di controllo assume valore TRUE, ancora prima che venga chiuso il ciclo For.
    Difatti , facendo delle prove con il file postato mirtylla , il ciclo do-loop esce ancora prima che la variabile a ,abbia raggiunto il valore 10.
    Credo che questa sia la logica del ciclo Do-Loop, in questo caso.
    Dato che mirtylla ci propone sempre il ciclo.
    Ciao
    albatros54





  • di Cucù data: 06/11/2015 15:29:04

    Ma scusa se insisto a cosa serve un loop in questo caso solo per poi uscire dal loop ^_^?
    Non sarebbe sufficiente uscire dal ciclo for quando come dici tu la variabile di controllo assume valore TRUE...
    Vedi Esempio il codice che ho postato...



  • di cromagno data: 06/11/2015 15:32:49

    Ciao a tutti,
    solo una mia opinione...
    anche per me il ciclo "Do...Loop" è superfluo.



  • di Albatros54 data: 06/11/2015 15:34:17

    @Cucu'
    Sono d'accordo con te, ma se mirtylla ci propone sempre il ciclo.
    Aspettiamo cosa decide mirtylla





  • di Cucù data: 06/11/2015 15:35:07

    @ cromagno
    Perche " If Range("V4").Value > Range("V8").Value Then"
    inserito nei cicli for serve a qualcosa??? ^_^



  • di cromagno data: 06/11/2015 15:43:07

    Ciao Cucù,
    infatti... come ho detto prima, non riesco a capire la logica de l codice e proprio per questo non riesco a trovare una soluzione



  • di mirtylla (utente non iscritto) data: 09/11/2015 11:04:18

    Buongiorno a tutti,
    scusate ma non ho avuto internet per un paio di giorni.
    Io purtroppo non ho conoscenze di VBA, quindi cercando tra le varie funzioni ho visto che il ciclo "Do" mi permetteva di uscire dal ciclo una volta verificata la condizione "If".
    @Albatros e Cucù
    Ho provato le vostre macro, funzionano entrambe, ma la macro di Albatros è perfetta per il mio scopo e per come devo continuare la macro, non avendo tra le altre cose il msg box a cui dare l'Ok.
    Vi ringrazio tantissimo per la disponibilità, sicuramente avrò ancora bisogno di voi perché la macro finale sarà bella lunga.
    Grazie ancora.
    Vi auguro una buona giornata.



  • di mirtylla (utente non iscritto) data: 09/11/2015 11:05:15