IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème boucle à condition [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème boucle à condition
    Bonjour à tous!

    Je viens vers vous car je bloque sur un problème de syntaxe (il me semble) et malgré mes recherches je n'arrive pas à résoudre ce problème.

    L'idée est de faire un rapprochement entre 2 feuilles excel.

    Prenons une feuille A et une feuille B. L'idée est de prendre la première ligne de la feuille A, chercher la ligne dans la feuille B (en comparant colonne à colonne à l'aide d'une boucle) et colorier la ligne en vert si tout correspond. Puis passer à la ligne suivante.

    Dans ce schéma je vois 3 boucles :
    - la première pour passer d'une ligne à une autre dans la feuille A,
    - la deuxième pour passer d'une ligne à une autre dans la feuille B lorsque l'on cherche la ligne qui correspond,
    - la dernière pour comparer les colonnes d'une ligne

    Les conditions sont naturellement des conditions d'égalité de valeur.

    Voici où j'en suis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    Dim nbreA As Variant
    Dim nbreB As Variant
     
    nbreA = Sheets("A").Range("A" & Application.Rows.Count).End(xlUp).Row (nombre de lignes dans A)
    nbreB = Sheets("B").Range("A" & Application.Rows.Count).End(xlUp).Row (nombre de lignes dans B)
     
    For i = nbreA To 2 Step -1
        For j = nbreB To 2 Step -1
            If Sheets("A").Cells(i, 1) = Sheets("B").Cells(j, 1) Or (Sheets("A").Cells(i, 1) = "29*" And Sheets("B").Cells(j, 2) = "Nom") Then
                For k = 2 To 4
                    If Sheets("A").Cells(i, k) <> Sheets("B").Cells(j, k) Then
                        Exit For
                    End If
                    Next k
                If k = 4 Then
                    Sheets("A").Rows(i).Interior.Color = RGB(0, 255, 0) And Sheets("B").Rows(j).Interior.Color = RGB(0, 255, 0)
                    Next i
                Else
                    Next j
                End If
     
                If j = 2 Then 
                    Sheets("A").Rows(i).Interior.Color = RGB(255, 0, 0)
                    Next i
                End If
           End if
    Normalement mes conditions sont bien formulées.

    En revanche à chaque fois que j'essaie d'instaurer un "Next x" il me met "Erreur de compilation : Next sans For"...
    C'est probablement une erreur de débutant qui concerne la syntaxe et la base même de l'utilisation des boucles mais je bloque tout de même dessus =/.

    Si vous pouviez m'éclaircir sur ce point, vous me seriez d'une grande aide!

    Merci d'avance!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Le nombre de "For" et de "Next" doit être le même. Tu ne peux pas avoir un seul "For i..." et deux "Next i".
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par Daniel.C Voir le message
    Bonjour,

    Le nombre de "For" et de "Next" doit être le même. Tu ne peux pas avoir un seul "For i..." et deux "Next i".
    Bonsoir,

    j'ajouterais tu dois aussi avoir le même nombre de For que de Next entre un If est un endif (ou else) .. et donc tu ne peu pas trouver un Next tout seul entre if..endif..

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Re!

    Alors je n'ai plus d'erreur mais mon programme ne fonctionne pas... Il me colorie tout en rouge. Après avoir vu pas à pas ce qu'il faisait et bien je remarque qu'il bloque à la comparaison des cellules.

    Tout d'abord il ne détecte pas la deuxième condition dans le premier if. Ce sont des cellules qui contiennent du texte et le texte est normalement identique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    For i = nbreA To 2 Step -1
        For j = nbreB To 2 Step -1
            If Sheets("A").Cells(i, 1).Value = Sheets("B").Cells(j, 1).Value Or (Sheets("A").Range("B" & i) Like "29*" And UCase(Sheets("B").Range("B" & j).Value) Like UCase(Adm) & "*") Then
                For k = 2 To 4
                    If UCase(Sheets("A").Cells(i, k)) <> UCase(Sheets("B").Cells(j, k)) Then
                        Exit For
                    End If
                Next k
                If k = 4 Then
                    Sheets("A").Rows(i).Interior.Color = RGB(0, 255, 0) And Sheets("B").Rows(j).Interior.Color = RGB(0, 255, 0)
                End If
            End If
        Next j
        If j = 2 Then
        Sheets("A").Rows(i).Interior.Color = RGB(255, 0, 0)
        End If
    Next i
    Je n'arrive pas à voir où est le problème! Ca doit encore être une erreur de débutant mais je passe beaucoup trop de temps à chercher sans trouver la solution. J'ai d'abord essayé de tout mettre en majuscule pour ne pas avoir de problème à ce niveau mais ça ne fonctionne toujours pas =/

    J'ai corrigé la première partie (erreur de colonne) mais la deuxième partie dans la boucle avec le K le problème y est toujours...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Si tu disais tout ?
    Est-ce que le nombre de colonnes est fixe ?
    Est-ce que les lignes sont triées ? Si oui, sur quelles colonnes ?
    Est-ce qu'il y a beaucoup de lignes ?
    Qu'est-ce que représente ce "29" que tu testes ?
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Alors,
    Il s'agit d'un rapprochement entre 2 feuilles dans lesquelles on retrouve des opérations d'achat et de vente d'actions ou autre instrument financier. Il y a donc 4 colonnes à vérifier : N° de compte, nom de l'action, Quantité, et type de compte

    Le nombre de colonne est fixe.

    Les lignes sont triées par quantité.

    Il n'y a pas beaucoup de lignes (max 50).

    Les colonnes sont présentées comme cela :

    N° Compte - Type de compte - Libellé de la valeur - Quantité

    Pour éviter les problèmes de similarité de caractère j'ai fait une étape supplémentaire où je remplace le nom de la valeur par son code.

    Mais ça me fait le même problème...

    Par rapport au "29*", qui fonctionne bien d'ailleurs :
    Dans l'une des deux feuilles, les numéros de compte diffèrent selon les types. Il y a 2 types de compte. Donc lorsque le compte est "normal" les numéros de compte sont similaires, lorsque le compte est "spécial" dans la feuille en question le numéro de compte est différent et commence par 29. Du coup pour faire le rapprochement entre les 2 feuilles, je regarde d'abord si :
    Cas 1 : le N° de compte est similaire dans les deux feuilles
    Cas 2 : le N° de compte de la feuille 1 commence par 29 et le type de compte dans la feuille 2 correspond à spécial

    Si je suis dans l'un des deux cas, je regarde la suite de la ligne. Si j'arrive au bout de la vérification k=4, je colorie la ligne en vert.

    J'espère que c'est clair. Votre aide me serait très précieuse!

  7. #7
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Je n'ai pas bien compris cette histoire de 29. Sinon, essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub ComparerFeuilles()
        Dim C As Range, PlageA As Range, PlageB As Range, X As Range
        Dim I As Integer, Ctr As Integer
        With Sheets("FeuilA")
            Set PlageA = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
        End With
        With Sheets("FeuilB")
            Set PlageB = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
        End With
        For Each C In PlageA
            For Each X In PlageB
                Ctr = 0
                For I = 0 To 3
                    If X.Offset(, I) = C.Offset(, I) Then Ctr = Ctr + 1
                Next I
                If Ctr = 4 Then
                    C.Resize(, 4).Interior.ColorIndex = 4
                    X.Resize(, 4).Interior.ColorIndex = 4
                End If
            Next X
        Next C
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Après une modification (Ctr=3), ca fonctionne à merveille!

    Merci!

    Au delà du fait que ta formulation est plus épurée et élégante, saurais-tu pour quelle raison ça ne fonctionnait pas?

    J'avais oublié le I=0... Ca ne fonctionne toujours pas avec Ctr=4...
    Le problème vient bien de la colonne avec le code de la valeur

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    C'est bon! Un petit UCase a fait l'affaire! Merci bien!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème boucle WHILE/WEnd avec plusieurs conditions
    Par Romanaxx dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/12/2013, 15h00
  2. Problème boucle avec plusieurs conditions
    Par Naxence dans le forum Général VBA
    Réponses: 2
    Dernier message: 29/03/2012, 14h38
  3. Un probléme de condition dans une boucle
    Par boubz013 dans le forum Débuter
    Réponses: 6
    Dernier message: 22/02/2010, 15h52
  4. Réponses: 3
    Dernier message: 12/03/2009, 18h08
  5. Réponses: 6
    Dernier message: 17/08/2005, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo