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 :

Syntaxe If Then / Comparaison de deux colonnes [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Par défaut Syntaxe If Then / Comparaison de deux colonnes
    Bonjour à tous,

    Total débutant en programmation, j'essaye de faire une macro pour excel me permettant de créer un nouveau fichier ne contenant pas les valeurs "doublons" sur deux colonnes.

    Je m'explique: Si le couple de valeurs de colonnes A et B sont identiques sur plusieurs lignes, je ne veux garder que la première ligne ou apparait ce couple de valeur.

    Afin de comparer les valeurs des deux colonnes sur deux lignes, je pensais utiliser quelque chose dans ce gout la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    If lat1 = lat2 And lon1 = lon2
        Then
       'si les coordonnées sont différentes, alors, on recopie la DEUXIEME LIGNE
         y = y + 1 'on incrémente le conteur de 1
     
         feuilleDonneeBrute.Rows(i).Copy Destination:=feuilleDonneeTriee.Rows(y)
     
    End If
    Mais cela me renvoit une erreur de syntaxe juste après la ligne du 'If'
    Une idée du problème ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Le Then doit être sur la même ligne que le If.

    Ca me défrise, c'est un des rares points ou le COBOL est supérieur au VB(le THEN est facultatif en cobol), mais c'est comme ça : il faut un then à la fin de la ligne ou il y a le if.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If lat1 = lat2 And lon1 = lon2 Then
       'si les coordonnées sont différentes, alors, on recopie la DEUXIEME LIGNE
         y = y + 1 'on incrémente le conteur de 1
     
         feuilleDonneeBrute.Rows(i).Copy Destination:=feuilleDonneeTriee.Rows(y)
     
    End If
    EDIT : précisions.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Par défaut
    el_slapper: merci pour la réactivité.

    Bon, alors du coup ce passage fonctionne, et je n'ai plu de message d'erreur.La macro me demande quelle fichier je veux traiter, le traite, sauvegarde un nouveau fichier.
    En revanche elle ne fait pas tout ce qu'elle est censé faire, c'est à dire "parser" et traiter l'ensemble du fichier.
    En fait, on dirait que dès qu'il s'agit d'engager un premier tour de Loop, y a plus personne.
    Pourtant j'incrémente mon ptit compteur, enfin je pense.

    Voila l'ensemble de la macro en espérant que ca en fasse aps trop "bloc".

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    Sub doubleLatLong()
     
    Dim classeurDonneeBrute As Workbook 
    Dim classeurDonneeTriee As Workbook 
     
    Dim feuilleDonneeBrute As Worksheet 
    Dim feuilleDonneeTriee As Worksheet 
     
    Dim lat1 As Double 'Latitude de la première ligne a comparer
    Dim lat2 As Double 'Latitude de la seconde ligne a comparer
    Dim lon1 As Double 'Longitude de la première ligne a comparer
    Dim lon2 As Double 'Longitude de la seconde ligne a comparer
     
    Dim i As Integer 'Compteur de ligne pour le fichier source
    Dim y As Integer 'Compteur de ligne pour le fichier destination
     
    Dim ParthFichierTraitement 
    Dim PathFichier As String 
    Dim PathDossier As String
     
    Dim stNomSauvegarde As String
     
    ParthFichierTraitement = ThisWorkbook.Path
     
    'choix du fichier source, on ouvre une fenetre de dialogue
    Application.FileDialog(msoFileDialogFilePicker).AllowMultiSelect = False
    Application.FileDialog(msoFileDialogFilePicker).InitialFileName = ParthFichierTraitement & "\"
    Application.FileDialog(msoFileDialogFilePicker).Show
     
     
    'chemin du fichier avec le nom ex: "C:\Mes documents\bibi.xls"
    PathFichier = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
    'chemin du fichier SANS le nom ex: "C:\Mes documents\"
    PathDossier = Application.FileDialog(msoFileDialogFilePicker).InitialFileName
     
    'ouvre le classeur avec le chemin absolut
    Set classeurDonneeBrute = Application.Workbooks.Open(PathFichier)
     
     
     
    'on sélectionne la première feuille
    Set feuilleDonneeBrute = classeurDonneeBrute.Worksheets(1)
     
    'on créer un classeur (virtuel) (on va l'enregister à la fin)
    Set classeurDonneeTriee = Application.Workbooks.Add
    'il y a déjà des feuilles dans ce classer (crées automatiquement avec le classeur)
    'on va dire qu'on utilise la première feuille
    Set feuilleDonneeTriee = classeurDonneeTriee.Worksheets(1)
     
    'On recopie la première ligne du classeur de données brutes (nom de champs)
    'dans le classeur de données triées
    feuilleDonneeBrute.Rows(1).Copy Destination:=feuilleDonneeTriee.Rows(1)
     
    'On recopie aussi la première ligne DE DONNEES
    feuilleDonneeBrute.Rows(2).Copy Destination:=feuilleDonneeTriee.Rows(2)
     
    i = 2
     
    'on initialise le compteur pour le fichier de données triées
    y = 2
     
    Do
     
    'on récupère les infos de la premiere ligne
    lat1 = feuilleDonneeBrute.Cells(i, 3).Value
    lat2 = feuilleDonneeBrute.Cells(i + 1, 3).Value
     
    'on récupère les infos de la seconde
    lon1 = feuilleDonneeBrute.Cells(i, 4).Value
    lon2 = feuilleDonneeBrute.Cells(i + 1, 4).Value
     
    'condition de sortie de la boucle lorsque qu'il n'y a plus de données
    ' il faut vérifier sur la deuxième valeur
    If lat2 = 0 Then
            Exit Do
    End If
     
     
    'on va comparer les coordonnées
    If lat1 = lat2 And lon1 = lon2 Then
       'si les coordonnées sont différentes, alors, on recopie la DEUXIEME LIGNE
         y = y + 1 'on incrémente le conteur de 1     
         feuilleDonneeBrute.Rows(i).Copy Destination:=feuilleDonneeTriee.Rows(y)
     
     
    End If
     
    'on incrémente le compteur de 1
    i = i + 1
     
    Loop
     
     
    stNomSauvegarde = InputBox("Entrer le nom du fichier de sortie." & vbCrLf & "Entrer nom de fichier sortie")
     
    'on enregistre le nouveau fichier
    classeurDonneeTriee.SaveAs (PathDossier & stNomSauvegarde & ".xls")
     
    End Sub
    J'avoue m'être arraché deux/trois cheveux sans vraiment capter d'ou ca pouvait venir

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    En utilisant une filtre avancé, ton code aura l'allure de ceci
    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
    28
    29
    30
    31
    32
    33
    34
    Sub doubleLatLong()
    Dim wbBrute As Workbook, wbTrie As Workbook
    Dim PathFichier As String, PathDossier As String, stNomSauvegarde As String, ParthFichierTraitement As String
    Dim LastLig As Long
     
    Application.ScreenUpdating = False
    ParthFichierTraitement = ThisWorkbook.Path
    'choix du fichier source, on ouvre une fenetre de dialogue
    With Application.FileDialog(msoFileDialogFilePicker)
       .AllowMultiSelect = False
       .InitialFileName = ParthFichierTraitement & "\"
       .Show
       'chemin du fichier avec le nom ex: "C:\Mes documents\bibi.xls"
       PathFichier = .SelectedItems(1)
       'chemin du fichier SANS le nom ex: "C:\Mes documents\"
       PathDossier = .InitialFileName
    End With
    'ouvre le classeur avec le chemin absolut
    Set wbBrute = Workbooks.Open(PathFichier)
    Set wbTrie = Workbooks.Add(1)
    With wbBrute.Worksheets(1)
       LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
       .Range("A1:B" & LastLig).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("Y1"), Unique:=True
       .Range("Y1").CurrentRegion.Copy wbTrie.Sheets(1).Range("A1")
       .Range("Y1:Z1").EntireColumn.Delete
    End With
    wbBrute.Close False
    Set wbBrute = Nothing
    stNomSauvegarde = InputBox("Entrer le nom du fichier de sortie." & vbCrLf & "Entrer nom de fichier sortie")
    'on enregistre le nouveau fichier
    wbTrie.SaveAs PathDossier & stNomSauvegarde & ".xls"
    wbTrie.Close
    Set wbTrie = Nothing
    End Sub

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Par défaut
    Mercatog: Merci, si je comprends c'est censé réduire la taille de mes déclarations de variables et toutes les manipulation que je fais sur les fichiers et worksheet ?

    Je vais essayer de trouver d'où vient le problème dans ma loop avant d'essayer d'optimiser le code je pense. =)

    EDIT:

    Ayé, ca fonctionne, c'est vraiment briccolé mais ca fonctionne...
    J'avais complétement inversé le sens de comparaison de mes valeurs ( = au lieu de <>) et j'avais un ptit soucis au niveau de la ligne que je gardais (i au lieu de i+1)
    Je doute que ca intéresse grand monde, mais je balance le code final.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    Sub doubleLatLong()
     
    Dim classeurDonneeBrute As Workbook
    Dim classeurDonneeTriee As Workbook
     
    Dim feuilleDonneeBrute As Worksheet
    Dim feuilleDonneeTriee As Worksheet
     
    Dim lat1 As Double 'Latitude de la première ligne a comparer
    Dim lat2 As Double 'Latitude de la seconde ligne a comparer
    Dim lon1 As Double 'Longitude de la première ligne a comparer
    Dim lon2 As Double 'Longitude de la seconde ligne a comparer
     
    Dim i As Integer 'Compteur de ligne pour le fichier source
    Dim y As Integer 'Compteur de ligne pour le fichier destination
     
    Dim ParthFichierTraitement
    Dim PathFichier As String
    Dim PathDossier As String
     
    Dim stNomSauvegarde As String
     
    ParthFichierTraitement = ThisWorkbook.Path
     
    'choix du fichier source, on ouvre une fenetre de dialogue
    Application.FileDialog(msoFileDialogFilePicker).AllowMultiSelect = False
    Application.FileDialog(msoFileDialogFilePicker).InitialFileName = ParthFichierTraitement & "\"
    Application.FileDialog(msoFileDialogFilePicker).Show
     
     
    'chemin du fichier avec le nom ex: "C:\Mes documents\bibi.xls"
    PathFichier = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
    'chemin du fichier SANS le nom ex: "C:\Mes documents\"
    PathDossier = Application.FileDialog(msoFileDialogFilePicker).InitialFileName
     
    'ouvre le classeur avec le chemin absolut
    Set classeurDonneeBrute = Application.Workbooks.Open(PathFichier)
     
     
     
    'on sélectionne la première feuille
    Set feuilleDonneeBrute = classeurDonneeBrute.Worksheets(1)
     
    'on créer un classeur (virtuel) (on va l'enregister à la fin)
    Set classeurDonneeTriee = Application.Workbooks.Add
    'il y a déjà des feuilles dans ce classer (crées automatiquement avec le classeur)
    'on va dire qu'on utilise la première feuille
    Set feuilleDonneeTriee = classeurDonneeTriee.Worksheets(1)
     
    'On recopie la première ligne du classeur de données brutes (nom de champs)
    'dans le classeur de données triées
    feuilleDonneeBrute.Rows(1).Copy Destination:=feuilleDonneeTriee.Rows(1)
     
    'On recopie aussi la première ligne DE DONNEES
    feuilleDonneeBrute.Rows(2).Copy Destination:=feuilleDonneeTriee.Rows(2)
     
    i = 2
     
    'on initialise le compteur pour le fichier de données triées
    y = 2
     
    Do
     
    'on récupère les infos de la premiere ligne
    lat1 = feuilleDonneeBrute.Cells(i, 3).Value
    lat2 = feuilleDonneeBrute.Cells(i + 1, 3).Value
     
    'on récupère les infos de la seconde
    lon1 = feuilleDonneeBrute.Cells(i, 4).Value
    lon2 = feuilleDonneeBrute.Cells(i + 1, 4).Value
     
    'condition de sortie de la boucle lorsque qu'il n'y a plus de données
    ' il faut vérifier sur la deuxième valeur
    If lat2 = 0 Then
            Exit Do
    End If
     
     
    'on va comparer les coordonnées
    If lat1 <> lat2 Or lon1 <> lon2 Then
       'si les coordonnées sont différentes, alors, on recopie la DEUXIEME LIGNE
         y = y + 1 'on incrémente le compteur de 1
         feuilleDonneeBrute.Rows(i + 1).Copy Destination:=feuilleDonneeTriee.Rows(y)
    End If
     
    'on incrémente le compteur de 1
    i = i + 1
     
    Loop
     
     
    stNomSauvegarde = InputBox("Entrer le nom du fichier de sortie." & vbCrLf & "Entrer nom de fichier sortie")
     
    'on enregistre le nouveau fichier
    classeurDonneeTriee.SaveAs (PathDossier & stNomSauvegarde & ".xls")
     
    End Sub
    Mercatog, je vais essayer de modifier le code en suivant tes recommandations dans l'après midi.

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Non pas du tout, le choix des noms à donner aux variables reste un choix personnel (avec certaines restrictions obligatoires, tel que nommer des variables avec des mots réservés)
    Sinon, j'ai tendance à éviter les boucles quand il y a une méthode directe.
    Pour ton cas précis, je préfère utiliser un filtre avancé qui me copie les données sans doublons (imagine si tu as une centaines de colonnes, combien de tests tu devras faire)
    Une question de curiosité: As tu testé le code proposé?

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Citation Envoyé par mercatog Voir le message
    En utilisant une filtre avancé, ton code aura l'allure de ceci...
    Je vais commenter la partie à adapter à ton besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With wbBrute.Worksheets(1)
    'Dernière ligne remplie de la colonne A
       LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
    'On applique le filtre avancé sur les colonnes A et B, à toi d'adapter et copie le résultat obtenu de ces 2 colonnes en Y1 (tu peu mettre n'importe quelle colonne au delà de tes données et non adjascente
    'On aura nos données en colonnes Y et Z (parce que au départ, j'avais comme base les 2 colonnes A et B
       .Range("A1:B" & LastLig).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("Y1"), Unique:=True
    'on recopie les données sans doublons à partir de la colonne Y vers notre destination
       .Range("Y1").CurrentRegion.Copy wbTrie.Sheets(1).Range("A1")
    'On supprime les colonnes Y et Z qui constituaient en faite notre plage provisoire
       .Range("Y1:Z1").EntireColumn.Delete
    End With
    Je propose que tu essaies d'adapter à ton fichier et de reporter ton code ici avec la disposition de ta feuille

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

Discussions similaires

  1. Comparaison entre deux colonnes
    Par stade13 dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 06/03/2015, 11h07
  2. [Toutes versions] Comparaison de deux colonnes par blocs
    Par Leonard02 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/07/2012, 09h00
  3. [XL-2007] Comparaison sur deux colonnes excel plus traitement
    Par guiltyspark dans le forum Excel
    Réponses: 5
    Dernier message: 04/03/2011, 10h53
  4. Comparaison de deux colonnes
    Par casavba dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/02/2008, 19h18
  5. [VBA-E] Pb Comparaison De Deux Colonnes Avec Fonction If
    Par gromorice dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/03/2007, 05h57

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