doppio ciclo for



  • doppio ciclo for
    di andra (utente non iscritto) data: 10/02/2015 13:44:00

    Buongiorno,
    colonna A cella a2
    For riga = 2 to 100 step 3
    colonna b cella b5
    For rigadue = 4 to 120 step 10
    condizione:
    If cells(riga,1) <> "" Then
    cells(rigadue,2) = "pippo"
    End if
    Come faccio ad incrementare le due variabili.



  • di Vecchio Frac data: 10/02/2015 13:49:36

    Quali sono le due variabili da incrementare?
    Andra, fai un piccolo sforzo e scrivi due righe in più per descrivere il tuo problema, l'esigenza, cosa non riesci a fare e dove ti blocchi.
    Rileggi il tuo post e dimmi se uno - che non sa niente di quello che vuoi fare (che probabilmente è molto più ampio del singolo problema che non hai descritto) - può capire qualcosa.




  • doppio ciclo for
    di andra (utente non iscritto) data: 10/02/2015 16:37:07

    In effetti vista cosi dice poco.
    In colonna A ci sono 210 nominativi suddivisi in blocchi da 7 con un salto di 9 celle e in ogni blocco i nominativi hanno un salto di tre celle.
    a2-gino
    a5-pasquale
    a8-maria
    a11-giuseppe
    a14-federico
    a17-luca
    a21-carlo
    ------------------
    a30-francesco
    a33-anna
    a36-saverio
    a39-eleonora
    a53-patrizia
    a56-piero
    a59-ines
    Con questo codice risolvo per il primo blocco come andare al secondo, al terzo e cosi via.

     
    Dim i As Integer
    For i = 2 To 21 Step 3
     If Cells(i, 4) = "gino" Then
     Cells(i, 6)= "presente"
      End If
     Next i



  • di Raffaele_53 (utente non iscritto) data: 10/02/2015 22:15:29

    Ok, solo se alleghi un file e dovute spiegazioni. Di certo (non blande)?


  • doppio ciclo for
    di andra (utente non iscritto) data: 11/02/2015 17:19:19

    Ok file allegato.
    Inserire x in corrispondenza di ogni nominativo.



  • di Raffaele_53 (utente non iscritto) data: 11/02/2015 19:20:30

    Se intendi dire che devi fare un ciclo for per il primo gruppo = cella A1:A22 (tutti i gruppi saranno uguali di righe)
     
    Option Explicit
    Option Compare Text ' casomai la X fosse sia maiuscola che minuscola
    Sub verifica()
    Dim Ur1 As Long, Y As Long, I As Long, Fine As Long
    Ur1 = Range("A" & Rows.Count).End(xlUp).Row
    Y = 2
    For I = Y To Ur1
    Ricomincia:
        Fine = Y + 18
        For Y = I To Fine Step 3
            If Cells(Y, 2) = "x" Then
                Cells(Y, 3) = "presente"
            End If
        Next Y
            Y = Y + 7
            I = Y
        If I < Ur1 Then GoTo Ricomincia
    Next I
     MsgBox "fatto"
    End Sub


  • doppio ciclo for
    di andra (utente non iscritto) data: 12/02/2015 08:43:18

    Raffaele_53 la tua macro è perfetta.
    Ti chiedo un ulteriore aiuto e ti allego il file d'esempio.



  • di Raffaele_53 (utente non iscritto) data: 12/02/2015 10:11:36

    >>>>se presente inserisci nelle celle pari il valore 8
    Due errori in una frase, intendevi dire colonne e siccome incominci dalla 4 colonna sarà Pari (ma penso che intendevi UNO che c'era in D1)
    ...se presente inserisci nelle colonne pari il valore 5
     
    Option Explicit
    Option Compare Text ' casomai la X fosse sia maiuscola che minuscola
    Sub verifica()
    Dim Ur1 As Long, Y As Long, I As Long, Fine As Long, X As Long
    Ur1 = Range("A" & Rows.Count).End(xlUp).Row
    Y = 2
    For I = Y To Ur1
    Ricomincia:
        Fine = Y + 18
        For Y = I To Fine Step 3
            If Cells(Y, 2) = "x" Then
                Cells(Y, 3) = "presente"
                For X = 4 To 18
                    If (X - 1) Mod 2 = 0 Then Cells(Y, X) = 8 Else Cells(Y, X) = 5
                Next X
            End If
        Next Y
            Y = Y + 7
            I = Y
        If I < Ur1 Then GoTo Ricomincia
    Next I
     MsgBox "fatto"
    End Sub


  • doppio ciclo for
    di andra (utente non iscritto) data: 12/02/2015 15:42:33

    Ciao, in effetti era inserisci 8 nelle colonne con numeri pari e 5 in quella con numeri dispari.
    Ti chiedo se è possibile inserire una variante.
    Al secondo gruppo vorrei invertire l'inserimento:
    colonne con numeri pari >>>>> 5
    colonne con numeri dispari >>>>8



  • di Raffaele_53 (utente non iscritto) data: 12/02/2015 18:05:27

    Scusami,
    Se tu dichiaraVi il tutto nel primo post (forse non capendo il post, non avrei risposto)
    Fare ad ogni post un'aggiunta mi viene ingarbugliato il tutto, nel primo post pensavo d'aver risolto, mà ad ogni aggiunta devo ripensare la soluzione.

    In questo istante invertire l'ordine dentro due cicli for, non mi viene. Ci penserò


  • doppio ciclo for
    di andra (utente non iscritto) data: 13/02/2015 08:20:21

    Scusami tu e non posso che ringraziarti.
    La mia richiesta originale era quella solo che ho adattato il tuo codice al altro mio lavoro e se non avessi risposto magari sarei ancora a trovare la soluzione.



  • di Raffaele_53 (utente non iscritto) data: 13/02/2015 15:24:23

    Se non è corretto l'ordine dispari/pari basta che inverti il 5-8 in questa stringa
    If (D_P + X) Mod 2 = 0 Then Cells(Y, X) = 8 Else Cells(Y, X) = 5
     
    Option Explicit
    Option Compare Text ' casomai la X fosse sia maiuscola che minuscola
    Sub verifica()
    Dim Ur1 As Long, Y As Long, I As Long, Fine As Long, X As Long, D_P As Long
    Ur1 = Range("A" & Rows.Count).End(xlUp).Row
    Y = 2
    For I = Y To Ur1
    Ricomincia:
        Fine = Y + 18
        For Y = I To Fine Step 3
            If Cells(Y, 2) = "x" Then
                Cells(Y, 3) = "presente"
                For X = 4 To 18
                    If (D_P + X) Mod 2 = 0 Then Cells(Y, X) = 8 Else Cells(Y, X) = 5
                Next X
            End If
        Next Y
            D_P = D_P + 1
            Y = Y + 7
            I = Y
        If I < Ur1 Then GoTo Ricomincia
    Next I
     MsgBox "fatto"
    End Sub


  • doppio ciclo for
    di andra (utente non iscritto) data: 13/02/2015 18:04:45

    Complimenti davvero grande.
    So di abusare della tua pazienza ma il tuo codice si può adattare al file che ti allego.



  • di Raffaele_53 (utente non iscritto) data: 14/02/2015 02:11:52

    Spero sia finito
     
    Option Explicit
    Option Compare Text ' casomai la X fosse sia maiuscola che minuscola
    Sub verifica()
    Dim Ur1 As Long, Y As Long, I As Long, Fine As Long, X As Long, C As Object
    Ur1 = Range("A" & Rows.Count).End(xlUp).Row
    Y = 2
    For I = Y To Ur1
    Ricomincia:
        Fine = Y + 18
        Set C = Range(Cells(Y - 1, 3), Cells(Y - 1, 10)).Find("dom", LookAt:=xlWhole)
        For Y = I To Fine Step 3
            If Cells(Y, 2) = "x" Then
                Cells(Y, 3) = "presente"
                Range(Cells(Y, 4), Cells(Y, 10)) = "L"
                Cells(Y, C.Column) = "F"
            End If
        Next Y
            Y = Y + 7
            I = Y
        If I < Ur1 Then GoTo Ricomincia
    Next I
     MsgBox "fatto"
     Set C = Nothing
    End Sub


  • doppio ciclo for
    di andra (utente non iscritto) data: 14/02/2015 08:44:31

    Mi da
    Errore di run-time '91': variabile oggetto o variabile del blocco With non impostata
    su questa riga
    Cells(Y, C.Column) = "F"



  • di Raffaele_53 (utente non iscritto) data: 14/02/2015 13:24:09

    Questo errore succede solo se hai cambiato parola, il find cerca la parola dom,DOM ma se per caso hai cambiato in D,DOM.,Domenica va in errore
    >>>Set C = Range(Cells(Y - 1, 3), Cells(Y - 1, 10)).Find(>>>>>"dom"<<<<<<, LookAt:=xlWhole)


  • doppio ciclo for
    di andra (utente non iscritto) data: 15/02/2015 10:15:29

    Quindi se debbo cercare Dom la riga
    Set C = Range(Cells(Y - 1, 3), Cells(Y - 1, 10)).Find("dom", LookAt:=xlWhole)
    sarebbe
    Set C = Range(Cells(Y - 1, 3), Cells(Y - 1, 10)).Find("Dom", LookAt:=xlWhole)

    Al tuo codice ho aggiunto una verifica
    If Range(Cells(Y, 4), Cells(Y, 10)) <> "" Then

    ma da debug
    errore di run time 13 tipo non corrispondente propria su questa riga

     
    Option Explicit
    Option Compare Text ' casomai la X fosse sia maiuscola che minuscola
    Sub verifica()
    Dim Ur1 As Long, Y As Long, I As Long, Fine As Long, X As Long, C As Object
    Ur1 = Range("A" & Rows.Count).End(xlUp).Row
    Y = 2
    For I = Y To Ur1
    Ricomincia:
        Fine = Y + 18
        Set C = Range(Cells(Y - 1, 3), Cells(Y - 1, 10)).Find("dom", LookAt:=xlWhole)
        For Y = I To Fine Step 3
            If Cells(Y, 2) = "x" Then
                Cells(Y, 3) = "presente"
                 If Range(Cells(Y, 4), Cells(Y, 10)) <> "" Then 
                     Range(Cells(Y, 4), Cells(Y, 10)) = "L"
                    Cells(Y, C.Column) = "F"
                  End If
            End If
        Next Y
        Y = Y + 7
            I = Y
        If I < Ur1 Then GoTo Ricomincia
    Next I
     MsgBox "fatto"
     Set C = Nothing
    End Sub
    



  • di Raffaele_53 (utente non iscritto) data: 15/02/2015 10:44:46

    Puoi scrivere sia dom che DOM, dato che in alto c'è -->Option Compare Text

    Tu non puoi scrivere (se tante celle sono vuote), una soluzione sarebbe un ciclo for.
    Ma a quel punto puoi trovare tutte le 7 celle vuote/piene opuure una via di mezzo.
    Questo controlla che tutte le 7 celle siano vuote, se fosse vero allora scrive quello che hai richiesto.
     
    Option Explicit
    Option Compare Text ' casomai la X fosse sia maiuscola che minuscola
    Sub verifica()
    Dim Ur1 As Long, Y As Long, I As Long, Fine As Long, X As Long, C As Object, N As Long
    Ur1 = Range("A" & Rows.Count).End(xlUp).Row
    Y = 2
    For I = Y To Ur1
    Ricomincia:
        Fine = Y + 18
        Set C = Range(Cells(Y - 1, 3), Cells(Y - 1, 10)).Find("dom", LookAt:=xlWhole)
        For Y = I To Fine Step 3
            If Cells(Y, 2) = "x" Then
                Cells(Y, 3) = "presente"
                For X = 4 To 10
                    If Cells(Y, X) = "" Then N = N + 1
                Next X
                If N = 7 Then
                    Range(Cells(Y, 4), Cells(Y, 10)) = "L"
                    Cells(Y, C.Column) = "F"
                End If
            N = 0
            End If
        Next Y
        Y = Y + 7
            I = Y
        If I < Ur1 Then GoTo Ricomincia
    Next I
     MsgBox "fatto"
     Set C = Nothing
    End Sub



  • di Vecchio Frac data: 15/02/2015 12:40:59

    cit. " il find cerca la parola dom,DOM ma se per caso hai cambiato in D,DOM.,Domenica va in errore "
    ---> Solo a ricordare che con Find si può forzare la ricerca senza badare alle maiuscole (che è il valore predefinito) e anche se la parola cercata è parzialmente scritta.

    Set C = Range(Cells(Y - 1, 3), Cells(Y - 1, 10)).Find("dom", MatchCase:=False, LookAt:=xlPart)




  • doppio ciclo for
    di andra (utente non iscritto) data: 15/02/2015 15:42:00

    C'è qualcosa che non torna.
    La Verifica va fatta sulla prima riga, tant'è che se si toglie un giorno le celle (y,x) vengono comunque riempite.



  • di Raffaele_53 (utente non iscritto) data: 15/02/2015 18:00:19

    Non saprei cosa stai dicendo.
    >>>La Verifica va fatta sulla prima riga
    Set C = Range(Cells(Y - 1, 3), Cells(Y - 1, 10)).Find("dom", LookAt:=xlWhole) )--->viene già fatta la verifica sulla riga precedente

    >>>Al tuo codice ho aggiunto una verifica ...Errore Debug
    >>>If Range(Cells(Y, 4), Cells(Y, 10)) <> "" Then

    Puoi spiegare in modo dettagliato, il motivo che volevi aggiungere questa riga


  • doppio ciclo for
    di andra (utente non iscritto) data: 15/02/2015 18:27:00

    Ti rimando il file.



  • di Raffaele_53 (utente non iscritto) data: 15/02/2015 19:32:55

    Sei di poche parole? A me funziona.
     
    Option Explicit
    Option Compare Text ' casomai la X fosse sia maiuscola che minuscola
    Sub verifica()
    Dim Ur1 As Long, Y As Long, I As Long, Fine As Long, X As Long, N As Long
    Ur1 = Range("A" & Rows.Count).End(xlUp).Row
    N = 1
    Y = 2
    For I = Y To Ur1
    Ricomincia:
        Fine = Y + 18
        For Y = I To Fine Step 3
            If Cells(Y, 2) = "X" Then
                Cells(Y, 3) = "presente"
                For X = 4 To 10
                    If Cells(N, X) = "" Then
                        Cells(Y, X) = ""
                    ElseIf Cells(N, X) = "Dom" Then
                        Cells(Y, X) = "F"
                    ElseIf Cells(N, X) <> "Dom" Then
                        Cells(Y, X) = "L"
                    End If
                Next X
            End If
        Next Y
        N = N + 28
        Y = Y + 7
        I = Y
        If I < Ur1 Then GoTo Ricomincia
    Next I
    MsgBox "fatto"
    End Sub


  • doppio ciclo for
    di andra (utente non iscritto) data: 15/02/2015 20:26:57

    Ciao, anche a me, grazie( anche a Vecchio Frac).


  • doppio ciclo for
    di andra (utente non iscritto) data: 16/02/2015 08:09:30



  • doppio ciclo for
    di andra (utente non iscritto) data: 16/02/2015 08:11:00



  • doppio ciclo for
    di andra (utente non iscritto) data: 16/02/2015 16:17:48

    ok


  • doppio ciclo for
    di andra (utente non iscritto) data: 16/02/2015 16:26:07

    Pur spuntando la casella non compare risolto