loop che non looppa



  • loop che non looppa!!
    di lucippo (utente non iscritto) data: 16/11/2012 18:44:55

    Ciao ragazzi!
    se c'e' una cosa che non riesco a capire sono i loop in VBA!
    nel seguente codice (che non funziona...) io vorrei che se il valore della cella in ("a2:a4") e' uguale a "Ok!" allora deve entrare nel loop "for each cell ..... do something ....next cell"
    Io voglio che si entri nel loop "for each cell ..... do something ....next cell" solo se la condizione "valore della cella in ("a2:a4") e' uguale a "Ok!"" e' VERO, altrimento se FALSO deve passare subito alla cella successiva!
    Non mi sembra difficile ma sara' perche' e' venerdi' e non vedo l'ora di andare a casa, non riesco a farlo funzionare!!!
     
    Sub Badloop()
    Dim cell As Range
    Dim area As Range
    Dim i As Long
    
    Set area = Range("a2:a4")
    
    Do
        For Each cell In area
            For i = 1 To 10
                cell.Offset(0, i).Interior.Color = 3
            Next i
        Next cell
    
    Loop While cell.Value = "OK!"
    
    End Sub
    



  • di Vecchio Frac data: 16/11/2012 19:58:40

    L'errore che fai è non tradurre con la sintassi corretta quel che vuoi ottenere, tutto qui.
    C'è anche l'imprecisione di dire "se il valore della cella in ("a2:a4") e' uguale a "Ok!"..."; A2:A4 è un range, non una cella, a meno che non intendi dire "si tratta di una cella unita". Quindi io capisco che ogni cella deve avere il valore "ok" altrimenti non è soddisfatta la condizione.
    Ciò premesso, il ciclo Do continua ad eseguire il codice al suo interno fintantochè (while) il valore della cella in esame rimane "Ok!". Con la significativa osservazione che al suo interno c'è un ciclo For Each che alla fine imposta il valore di "cella" all'ultima cella dell'area considerata (ossia A4). Quindi sarà solo e sempre questo il valore che determina o no l'uscita dal ciclo Do.
    Comunque uno dei due cicli è superfluo (o Do o For Each).
    Infine non è buona idea nominare variabili come oggetti esistenti, per una serie di motivi ("cell" in questo caso).

    Questo è un codice di esempio per capire come funziona Do .. Loop o ti serve per un'applicazione concreta? se è così ci sono alcune altre cose che si posso osservare. Ma attendo i tuoi commenti.






  • di lucippo (utente non iscritto) data: 16/11/2012 20:08:45

    io vorrei semplicemente che si entri nel loop "for each...next" solo se il valore della cella è = "ok!"



  • di lucippo (utente non iscritto) data: 16/11/2012 20:21:28

    ...è proprio venerdì...bastava mettere un if prima del for...più facile di così
     
    Sub Badloop()
    Dim cell As Range
    Dim area As Range
    Dim i As Long
    
    Set area = Range("a2:a4")
    
       
    For Each cell In area
        If cell.Value = "ok!" Then
            For i = 1 To 10
                cell.Offset(0, i).Interior.Color = 3
            Next i
        End If
    Next cell
    
    End Sub



  • di Vecchio Frac data: 16/11/2012 21:03:25

    Bravissimo, ci sei arrivato da solo.
    Ora ti provoco e ti invito a riscrivere queste righe di codice senza utilizzare un ciclo del tutto :)
    E a pensare ad una soluzione con una formattazione condizionale, evitando del tutto l'uso di codice :P