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 :

Faire une recherche sur une colonne [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut Faire une recherche sur une colonne
    Bonjour, je suis tout nouveau sur ce forum et je suis débutant en VBA.
    Je travail sur un projet où je dois rechercher des clés identiques ou différentes sur deux colonnes d'une feuille.
    Voici ce que je dois faire
    - J'ai une feuille nommée "feuil1" avec les connes A et B remplis de clés (izin représentants des personnes)
    - je dois faire une VLOOKUP sur chaque colonne et lister les clés identiques sur les autres colonnes vides ( C et D par exemple)
    - Afficher aussi les clé qui sont dans la colonne A et qui ne sont pas dans la colonne B et vice-versa
    - les deux colonnes ont des milliers de lignes

    Merci pour qui voudrait m'aider !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 122
    Par défaut
    Bonjour

    Merci de vous relire, tout n'est pas clair une feuille oui mais les données recherchées sont t'elles dans la même feuille, le même classeur, comment sont t'elles structurées?
    Le Vlookup est une méthode décrite ici : https://learn.microsoft.com/en-us/of...nction.vlookup
    Afin de vous aider, il serait bon de fournir un fichier Excel avec des données et mettre également le résultat attendu.

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Bonjour @fraflt69
    Merci pour ton retour.
    Oui tout est sur un même classeur et pour l'instant sur une même feuille
    l'objectif étant de faire les opérations sur un même classeur avec deux feuilles différentes
    Si j'arrive à le faire sur une même feuille, je pourrais le faire sur plusieurs
    Voici le fichier en question :


    merci d'avance

  4. #4
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    j'ai eu du mal à joindre le fichier finalement mais j'espère être un peu plus clair

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 593
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 593
    Par défaut
    Tu cherches à le faire avec une macro ou avec des formules excel ?

    Si j'ai compris, tu dois ressortir 3 informations:
    1. les clés identiques entre les 2 colonnes
    2. les clés uniquement dans la colonne A
    3. les clés uniquement dans la colonne B

    Sous quelle forme tu dois avoir ces résultats?
    • une colonne avec le status (par exemple, juste dans A, juste dans B, dans les 2) en correspondance avec la valeur d'une des 2 colonnes
    • 3 colonnes avec dans chacune d'elle la liste des clés selon chaque critère


    En macro, je verrai bien, dans un 1er temps:
    - création d'un tableau pour chacune des colonnes
    - boucle sur le tableau A, et test de présence dans tableau B:
    - Si élément A présent dans tableau B, alors ajout de l'élément dans la table d'élément commun et suppression dans le tableau B, sinon ajout dans la table d'élément justeA
    A la fin tu auras le tableau justA qui contient les éléments seulement présent dans A, la table d'élément commun avec les éléments dans les 2, et dans tableau B, les éléments uniquement dans le tableau B (du fait que l'on a supprimé les éléments présents dans A du tableau d'origine);
    Il reste ensuite à mettre recopier les éléments dans une colonne.
    Je pense que ça pourrais être long, vu le nombre de boucles, mais c'est sans doute optimisable.

  6. #6
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Bonjour @umfrud !
    Merci pour ton retour et ta réponse me permet de mieux explique mon problème.

    Tout doit se faire avec une macro.

    J'ai un classeur avec une seule feuille nommé "feuill1"

    Dans cette feuille, j'ai des données sur la colonne A et sur la colonne B

    Ces données sont des identifiants (en chaine de caractère comme "FR0014006NJ501LA12")
    Ce que je dois faire :


    1- Parcourir la colonne A et B

    - Si je trouve un élément présent dans A qui n'est pas dans B, je fais une copie coller sur la colonne A d'une feuille que ma macro va créer
    - Si je trouve un élément présent dans les deux colonnes, je le mets dans la colonne B de ma deuxième feuille ( qui sera créé par ma macro)

    2 - Faire les mêmes opérations en dans le sens inverse mais juste lister les éléments présents dans B et pas dans A
    C'est à dire lister les éléments de la colonne B absents dans la colonne A dans une colonne de la feuille 2 qui sera créée par ma macro

    J'espère que c'est un peu plus clair parce que j'ai pas pu joindre mon fichier.

    merci d'avance

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 593
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 593
    Par défaut
    Citation Envoyé par waggoor Voir le message
    1- Parcourir la colonne A et B

    - Si je trouve un élément présent dans A qui n'est pas dans B, je fais une copie coller sur la colonne A d'une feuille que ma macro va créer
    Je n'ai pas compris ce passage sur le copier/coller (à moins qu'il ne s'agisse que de copier l'élément dans la colonne A d'une nouvelle Feuille.

    Le reste c'est faisable selon ce que j'ai décrit, il me semble.

    Si tu donnais des noms aux différentes feuilles et colonnes, ça serait plus parlant et plus facile de se repérer pour toi et pour nous je pense.

    (pour la façon de faire, sans passer par des tableaux, on pourrait aussi utiliser la fonction Range.Find(..) dans une boucle)

  8. #8
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Ok je vais essayer d'être plus clair et vraiment merci pour les retours.


    Bonjour @umfrud !
    Merci pour ton retour et ta réponse me permet de mieux explique mon problème.

    Tout doit se faire avec une macro.

    J'ai un classeur avec une seule feuille nommé "feuill1"

    Dans cette feuille (feuill1), j'ai des données sur la colonne A et sur la colonne B

    Ces données sont des identifiants (en chaine de caractère comme "FR0014006NJ501LA12")

    Ce que je dois faire :


    1- Parcourir la colonne A et B

    - Je me place d'abord sur le premier élément de la colonne A (A1) et je vais parcourir la colonne B

    a) Si je retrouve l'élément A1 dans la colonne B ( ça sera un doublons théoriquement) je prends cet élément que je place dans une colonne (colonne A) d'une nouvelle feuille ( qui doit être créé dans la macro et appelé feuill2)
    Ensuite je descends à la cellule A2 et ainsi de suite jusqu'à la fin ( j'ai plus de 2000 lignes)

    b) Si je retrouve pas cet élément, je vais quand même le copier dans feuill2 (colonne B)

    2 - Faire les mêmes opérations en dans le sens inverse

    - Je me place cette fois sur la cellule B2 ( premier élément de la colonne B) et je fais un parcours de la colonne A

    c) Si je retrouve l'élément dans la colonne A ( ça sera un doublons théoriquement) je prends cet élément que je place dans feuill2 (colonne C)
    Ensuite je descends à la cellule A2 et ainsi de suite jusqu'à la fin ( j'ai plus de 2000 lignes)

    d) Si je retrouve pas cet élément, je vais quand même le copier dans feuill2 (dans la colonne D)


    J'espère que c'est un peu plus clair parce que j'ai pas pu joindre mon fichier.

    merci d'avance

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 593
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 593
    Par défaut
    Tu as tenté d'écrire un peu de code, déjà pour parcourir tes colonnes ? l'idée c'est de t'aider, pas forcément le faire à ta place.

  10. #10
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, en fait si je comprends bien, il y a une recherche qui est inutile puisque les doublons sont copiées une première fois en colonne A et une deuxième fois en colonne C ? Donc lors de la première recherche on peut copier directement les doublons dans les 2 colonnes.

  11. #11
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Citation Envoyé par Franc Voir le message
    Salut, en fait si je comprends bien, il y a une recherche qui est inutile puisque les doublons sont copiées une première fois en colonne A et une deuxième fois en colonne C ? Donc lors de la première recherche on peut copier directement les doublons dans les 2 colonnes.
    Bonjour Franc!
    la deuxième recherche n'est pas inutile puisqu'il y a des clés présents dans la colonne B qui ne sont pas dans la colonne A.
    Donc dans la deuxième recherche je vais juste copier coller ces clés inexistantes dans une colonne de la nouvelle feuille

  12. #12
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Citation Envoyé par umfred Voir le message
    Tu as tenté d'écrire un peu de code, déjà pour parcourir tes colonnes ? l'idée c'est de t'aider, pas forcément le faire à ta place.
    Bonjour umfred !
    Oui j'ai beaucoup essayé et voici le dernier code que j'ai fait qui ne marche pas
    J'ai beaucoup cherché sur internet aussi mais sans solution


    Sub Vlookup_fonction()

    With Application
    .CutCopyMode = False
    .DisplayAlerts = True
    .EnableEvents = False
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    End With

    Dim x As Integer
    Dim i As Integer
    Dim cle_recherche As String
    Dim MaPlage As Range
    Dim valeur_recherche As Variant
    Dim NumRows1 As Integer
    Dim NumRows2 As Integer

    cle_recherche = ThisWorkbook.Sheets("Feuill1").Range("A1").Value

    Set MaPlage = ThisWorkbook.Sheets("Feuill1").Range("AT:AT")

    NumRows1 = ThisWorkbook.Sheets("Feuill1").Range("A2", ThisWorkbook.Sheets("Feuill1").Range("A2").End(xlDown)).Rows.Count
    NumRows2 = ThisWorkbook.Sheets("Feuill1").Range("A2", ThisWorkbook.Sheets("Feuill1").Range("A2").End(xlDown)).Rows.Count
    'Sheets.Add.Name = "NEW_TITRES"

    'For i = 1 To NumRows2

    'ThisWorkbook.Sheets("Feuill1").Range ("AT1")

    For x = 1 To NumRows1 ' Establish "For" loop to loop "numrows" number of times.

    valeur_recherche = Application.VLOOKUP(cle_recherche, MaPlage, 1, 0)

    'val_rech = Application.WorksheetFunction.VLookup(cle_id_1, Sheets("Feuill1").Range("AT:AT"), 1, False)

    ThisWorkbook.Sheets("Feuill1").Cells(1, 1) = valeur_recherche

    If IsError(valeur_recherche) Then

    Sheets("Feuill1").Cells(1, 2).Range("A:A") = cle_recherche ' handle error

    Else

    Sheets("Feuill1").Cells(2, 2) = cle_recherche 'CurrentRow = CInt(vreturn)

    End If
    ActiveCell.Offset(1, 0).Select

    'If IsError(2042) Then

    'Cells(1, 2) = cle_recherche ' handle error
    'End If

    ActiveCell.Offset(1, 0).Select
    ' Selects cell down 1 row from active cell.

    If IsError(valeur_recherche) Then

    Sheets("Feuil1").Cells(1, 2) = cle_recherche ' handle error

    Else

    Sheets("Feuill1").Range("A:A").Cells(2, 2) = cle_recherche 'CurrentRow = CInt(vreturn)

    End If
    ActiveCell.Offset(1, 0).Select

    Next

    'valeur_recherche = Application.VLookup(cle_recherche, MaPlage, 1, 0)

    'Cells(2, 2) = valeur_recherche


    'Next
    With Application
    .CutCopyMode = False
    .DisplayAlerts = True
    .EnableEvents = False
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    End With



    End Sub

  13. #13
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Citation Envoyé par waggoor Voir le message
    Bonjour Franc!
    la deuxième recherche n'est pas inutile puisqu'il y a des clés présents dans la colonne B qui ne sont pas dans la colonne A.
    Donc dans la deuxième recherche je vais juste copier coller ces clés inexistantes dans une colonne de la nouvelle feuille
    Pour moi, quand tu dis:
    a) Si je retrouve l'élément A1 dans la colonne B ( ça sera un doublons théoriquement) je prends cet élément que je place dans une colonne (colonne A)
    et ensuite:
    Je me place cette fois sur la cellule B2 ( premier élément de la colonne B) et je fais un parcours de la colonne A

    c) Si je retrouve l'élément dans la colonne A ( ça sera un doublons théoriquement) je prends cet élément que je place dans feuill2 (colonne C)

    Cela signifie que avec une première boucle de recherche, quand on trouve un doublon on peut le copier directement en A et C de la feuille 2.

    Teste ceci pour voir si ça te convient et adapte si nécessaire:

    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
    Sub copierDonnees()
        'Déclaration des variables
        Dim feuill1 As Worksheet
        Dim feuill2 As Worksheet
        Dim derniereLigneA As Long
        Dim derniereLigneB As Long
        Dim i As Long
        Dim j As Long
        Dim trouve As Boolean
        Dim ligneA As Long
        Dim ligneB As Long
        Dim ligneC As Long
        Dim ligneD As Long
     
        'Initialisation des variables de ligne
        ligneA = 1
        ligneB = 1
        ligneC = 1
        ligneD = 1
     
        'Définition des feuilles de calcul
        Set feuill1 = ThisWorkbook.Sheets("feuil1")
        Set feuill2 = ThisWorkbook.Sheets.Add(After:=Feuil1)
        feuill2.Name = "feuill2"
     
        'Détermination de la dernière ligne de données dans les colonnes A et B
        derniereLigneA = feuill1.Cells(feuill1.Rows.Count, "A").End(xlUp).Row
        derniereLigneB = feuill1.Cells(feuill1.Rows.Count, "B").End(xlUp).Row
     
        'Parcours de la colonne A et recherche dans la colonne B
        For i = 1 To derniereLigneA
            trouve = False 'Initialisation de la variable trouve à False
            For j = 1 To derniereLigneB
                'Comparaison des valeurs dans les colonnes A et B
                If feuill1.Cells(i, "A").Value = feuill1.Cells(j, "B").Value Then
                    trouve = True 'Si une correspondance est trouvée, mettre la variable trouve à True
                    Exit For 'Sortir de la boucle interne
                End If
            Next j
     
            'Si une correspondance a été trouvée, copier la valeur dans les colonnes A et C de feuill2 et incrémenter les variables ligneA et ligneC.
            If trouve Then
                feuill2.Cells(ligneA, "A").Value = feuill1.Cells(i, "A").Value
                feuill2.Cells(ligneC, "C").Value = feuill1.Cells(i, "A").Value
                ligneA = ligneA + 1
                ligneC = ligneC + 1
            Else 'Sinon, copier la valeur dans la colonne B de feuill2 et incrémenter la variable ligneB.
                feuill2.Cells(ligneB, "B").Value = feuill1.Cells(i, "A").Value
                ligneB = ligneB + 1
            End If
        Next i
     
        'Parcours de la colonne B et vérification si chaque valeur est unique (non présente dans la colonne A)
        For i = 1 To derniereLigneB
            trouve = False
            For j = 1 To derniereLigneA
                If feuill1.Cells(i, "B").Value = feuill1.Cells(j, "A").Value Then
                    trouve = True
                    Exit For
                End If
            Next j
     
            If Not trouve Then 'Si aucune correspondance n'a été trouvée (la valeur est unique), copier la valeur dans la colonne D de feuill2 et incrémenter la variable ligneD.
                feuill2.Cells(ligneD, "D").Value = feuill1.Cells(i, "B").Value
                ligneD = ligneD + 1
            End If
        Next i
     
    End Sub

  14. #14
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Citation Envoyé par Franc Voir le message
    Pour moi, quand tu dis:
    a) Si je retrouve l'élément A1 dans la colonne B ( ça sera un doublons théoriquement) je prends cet élément que je place dans une colonne (colonne A)
    et ensuite:
    Je me place cette fois sur la cellule B2 ( premier élément de la colonne B) et je fais un parcours de la colonne A

    c) Si je retrouve l'élément dans la colonne A ( ça sera un doublons théoriquement) je prends cet élément que je place dans feuill2 (colonne C)

    Cela signifie que avec une première boucle de recherche, quand on trouve un doublon on peut le copier directement en A et C de la feuille 2.

    Teste ceci pour voir si ça te convient et adapte si nécessaire:

    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
    Sub copierDonnees()
        'Déclaration des variables
        Dim feuill1 As Worksheet
        Dim feuill2 As Worksheet
        Dim derniereLigneA As Long
        Dim derniereLigneB As Long
        Dim i As Long
        Dim j As Long
        Dim trouve As Boolean
        Dim ligneA As Long
        Dim ligneB As Long
        Dim ligneC As Long
        Dim ligneD As Long
     
        'Initialisation des variables de ligne
        ligneA = 1
        ligneB = 1
        ligneC = 1
        ligneD = 1
     
        'Définition des feuilles de calcul
        Set feuill1 = ThisWorkbook.Sheets("feuil1")
        Set feuill2 = ThisWorkbook.Sheets.Add(After:=Feuil1)
        feuill2.Name = "feuill2"
     
        'Détermination de la dernière ligne de données dans les colonnes A et B
        derniereLigneA = feuill1.Cells(feuill1.Rows.Count, "A").End(xlUp).Row
        derniereLigneB = feuill1.Cells(feuill1.Rows.Count, "B").End(xlUp).Row
     
        'Parcours de la colonne A et recherche dans la colonne B
        For i = 1 To derniereLigneA
            trouve = False 'Initialisation de la variable trouve à False
            For j = 1 To derniereLigneB
                'Comparaison des valeurs dans les colonnes A et B
                If feuill1.Cells(i, "A").Value = feuill1.Cells(j, "B").Value Then
                    trouve = True 'Si une correspondance est trouvée, mettre la variable trouve à True
                    Exit For 'Sortir de la boucle interne
                End If
            Next j
     
            'Si une correspondance a été trouvée, copier la valeur dans les colonnes A et C de feuill2 et incrémenter les variables ligneA et ligneC.
            If trouve Then
                feuill2.Cells(ligneA, "A").Value = feuill1.Cells(i, "A").Value
                feuill2.Cells(ligneC, "C").Value = feuill1.Cells(i, "A").Value
                ligneA = ligneA + 1
                ligneC = ligneC + 1
            Else 'Sinon, copier la valeur dans la colonne B de feuill2 et incrémenter la variable ligneB.
                feuill2.Cells(ligneB, "B").Value = feuill1.Cells(i, "A").Value
                ligneB = ligneB + 1
            End If
        Next i
     
        'Parcours de la colonne B et vérification si chaque valeur est unique (non présente dans la colonne A)
        For i = 1 To derniereLigneB
            trouve = False
            For j = 1 To derniereLigneA
                If feuill1.Cells(i, "B").Value = feuill1.Cells(j, "A").Value Then
                    trouve = True
                    Exit For
                End If
            Next j
     
            If Not trouve Then 'Si aucune correspondance n'a été trouvée (la valeur est unique), copier la valeur dans la colonne D de feuill2 et incrémenter la variable ligneD.
                feuill2.Cells(ligneD, "D").Value = feuill1.Cells(i, "B").Value
                ligneD = ligneD + 1
            End If
        Next i
     
    End Sub
    C'est exactement ce que je cherche à faire depuis plus d'une semaine
    il n y eu aucun bug et tout fonctionne à merveille
    Je ne sais pas comment vous remercier
    C'est tellement clair
    merci beaucoup infiniment pour cet aide!

  15. #15
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Pour le cas où tu aurais de grosses quantités de données à traiter, j'ai fait une version avec tableaux en mémoire, c'est plus rapide.

    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
    Sub copierDonnees()
        'Déclaration des variables
        Dim feuill1 As Worksheet
        Dim feuill2 As Worksheet
        Dim derniereLigneA As Long
        Dim derniereLigneB As Long
        Dim i As Long
        Dim j As Long
        Dim trouve As Boolean
        Dim ligneA As Long
        Dim ligneB As Long
        Dim ligneC As Long
        Dim ligneD As Long
        Dim donneesA() As Variant
        Dim donneesB() As Variant
        Dim resultatA() As Variant
        Dim resultatB() As Variant
        Dim resultatC() As Variant
        Dim resultatD() As Variant
     
        'Initialisation des variables de ligne et de tableau
        ligneA = 1
        ligneB = 1
        ligneC = 1
        ligneD = 1
     
        'Définition des feuilles de calcul et lecture des données dans les tableaux en mémoire
        Set feuill1 = ThisWorkbook.Sheets("feuil1")
        Set feuill2 = ThisWorkbook.Sheets.Add(After:=Feuil1)
        feuill2.Name = "feuill2"
     
        derniereLigneA = feuill1.Cells(feuill1.Rows.Count, "A").End(xlUp).Row
        derniereLigneB = feuill1.Cells(feuill1.Rows.Count, "B").End(xlUp).Row
     
        donneesA = feuill1.Range("A1:A" & derniereLigneA).Value
        donneesB = feuill1.Range("B1:B" & derniereLigneB).Value
     
        ReDim resultatA(1 To derniereLigneA, 1 To 1)
        ReDim resultatB(1 To derniereLigneA, 1 To 1)
     
         'Initialisation des tableaux resultatC et resultatD
         ReDim resultatC(1 To derniereLigneA, 1 To 1)
         ReDim resultatD(1 To derniereLigneB, 1 To 1)
     
         'Parcours de la colonne A et recherche dans la colonne B (en utilisant les tableaux en mémoire)
         For i = 1 To derniereLigneA
             trouve = False
             For j = 1 To derniereLigneB
                 If donneesA(i, 1) = donneesB(j, 1) Then
                     trouve = True
                     Exit For
                 End If
             Next j
     
             If trouve Then 'Si une correspondance a été trouvée, stocker la valeur dans les tableaux resultatA et resultatC et incrémenter les variables ligneA et ligneC.
                 resultatA(ligneA, 1) = donneesA(i, 1)
                 resultatC(ligneC, 1) = donneesA(i, 1)
                 ligneA = ligneA + 1
                 ligneC = ligneC + 1
             Else 'Sinon, stocker la valeur dans le tableau resultatB et incrémenter la variable ligneB.
                 resultatB(ligneB, 1) = donneesA(i, 1)
                 ligneB = ligneB + 1
             End If
         Next i
     
         'Parcours de la colonne B et vérification si chaque valeur est unique (non présente dans la colonne A)
         For i = 1 To derniereLigneB
             trouve = False
             For j = 1 To derniereLigneA
                 If donneesB(i, 1) = donneesA(j, 1) Then
                     trouve = True
                     Exit For
                 End If
             Next j
     
             If Not trouve Then 'Si aucune correspondance n'a été trouvée (la valeur est unique), stocker la valeur dans le tableau resultatD et incrémenter la variable ligneD.
                 resultatD(ligneD, 1) = donneesB(i, 1)
                 ligneD = ligneD + 1
             End If
         Next i
     
        'Copie des résultats des tableaux en mémoire dans feuill2
        feuill2.Range("A1").Resize(ligneA - 1).Value = resultatA
        feuill2.Range("B1").Resize(ligneB - 1).Value = resultatB
        feuill2.Range("C1").Resize(ligneC - 1).Value = resultatC
        feuill2.Range("D1").Resize(ligneD - 1).Value = resultatD
    End Sub

  16. #16
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Citation Envoyé par Franc Voir le message
    Pour le cas où tu aurais de grosses quantités de données à traiter, j'ai fait une version avec tableaux en mémoire, c'est plus rapide.

    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
    Sub copierDonnees()
        'Déclaration des variables
        Dim feuill1 As Worksheet
        Dim feuill2 As Worksheet
        Dim derniereLigneA As Long
        Dim derniereLigneB As Long
        Dim i As Long
        Dim j As Long
        Dim trouve As Boolean
        Dim ligneA As Long
        Dim ligneB As Long
        Dim ligneC As Long
        Dim ligneD As Long
        Dim donneesA() As Variant
        Dim donneesB() As Variant
        Dim resultatA() As Variant
        Dim resultatB() As Variant
        Dim resultatC() As Variant
        Dim resultatD() As Variant
     
        'Initialisation des variables de ligne et de tableau
        ligneA = 1
        ligneB = 1
        ligneC = 1
        ligneD = 1
     
        'Définition des feuilles de calcul et lecture des données dans les tableaux en mémoire
        Set feuill1 = ThisWorkbook.Sheets("feuil1")
        Set feuill2 = ThisWorkbook.Sheets.Add(After:=Feuil1)
        feuill2.Name = "feuill2"
     
        derniereLigneA = feuill1.Cells(feuill1.Rows.Count, "A").End(xlUp).Row
        derniereLigneB = feuill1.Cells(feuill1.Rows.Count, "B").End(xlUp).Row
     
        donneesA = feuill1.Range("A1:A" & derniereLigneA).Value
        donneesB = feuill1.Range("B1:B" & derniereLigneB).Value
     
        ReDim resultatA(1 To derniereLigneA, 1 To 1)
        ReDim resultatB(1 To derniereLigneA, 1 To 1)
     
         'Initialisation des tableaux resultatC et resultatD
         ReDim resultatC(1 To derniereLigneA, 1 To 1)
         ReDim resultatD(1 To derniereLigneB, 1 To 1)
     
         'Parcours de la colonne A et recherche dans la colonne B (en utilisant les tableaux en mémoire)
         For i = 1 To derniereLigneA
             trouve = False
             For j = 1 To derniereLigneB
                 If donneesA(i, 1) = donneesB(j, 1) Then
                     trouve = True
                     Exit For
                 End If
             Next j
     
             If trouve Then 'Si une correspondance a été trouvée, stocker la valeur dans les tableaux resultatA et resultatC et incrémenter les variables ligneA et ligneC.
                 resultatA(ligneA, 1) = donneesA(i, 1)
                 resultatC(ligneC, 1) = donneesA(i, 1)
                 ligneA = ligneA + 1
                 ligneC = ligneC + 1
             Else 'Sinon, stocker la valeur dans le tableau resultatB et incrémenter la variable ligneB.
                 resultatB(ligneB, 1) = donneesA(i, 1)
                 ligneB = ligneB + 1
             End If
         Next i
     
         'Parcours de la colonne B et vérification si chaque valeur est unique (non présente dans la colonne A)
         For i = 1 To derniereLigneB
             trouve = False
             For j = 1 To derniereLigneA
                 If donneesB(i, 1) = donneesA(j, 1) Then
                     trouve = True
                     Exit For
                 End If
             Next j
     
             If Not trouve Then 'Si aucune correspondance n'a été trouvée (la valeur est unique), stocker la valeur dans le tableau resultatD et incrémenter la variable ligneD.
                 resultatD(ligneD, 1) = donneesB(i, 1)
                 ligneD = ligneD + 1
             End If
         Next i
     
        'Copie des résultats des tableaux en mémoire dans feuill2
        feuill2.Range("A1").Resize(ligneA - 1).Value = resultatA
        feuill2.Range("B1").Resize(ligneB - 1).Value = resultatB
        feuill2.Range("C1").Resize(ligneC - 1).Value = resultatC
        feuill2.Range("D1").Resize(ligneD - 1).Value = resultatD
    End Sub
    Encore plus rapide d'exécution
    Merci infiniment @franc

  17. #17
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Sub Titres_invest()

    With Application
    .DisplayAlerts = False
    .EnableEvents = False
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    End With

    'Déclaration des variables
    Dim feuill1 As Worksheet
    Dim feuill2 As Worksheet
    Dim derniereLigneA As Long
    Dim derniereLigneB As Long
    Dim i As Long
    Dim j As Long
    Dim ligneA As Long
    Dim resultat As Variant
    Dim ligneB As Long
    Dim ligneC As Long
    Dim cle_recherche1 As String
    Dim cle_recherche2 As String
    Dim ligneD As Long

    'Initialisation des variables de ligne
    ligneA = 1
    ligneB = 1
    ligneC = 1
    ligneD = 1

    'Définition des feuilles de calcul
    Set feuill1 = ThisWorkbook.Sheets("feuil1")
    Set feuill2 = ThisWorkbook.Sheets.Add(After:=Feuil1)
    feuill2.Name = "feuill2"

    'Détermination de la dernière ligne de données dans les colonnes A et B
    derniereLigneA = feuill1.Cells(feuill1.Rows.Count, "A").End(xlUp).Row
    derniereLigneB = feuill1.Cells(feuill1.Rows.Count, "B").End(xlUp).Row

    'Parcours de la colonne A et recherche dans la colonne B ie les titres de la BDA N-1 absents dans la BDA N
    For i = 1 To derniereLigneA
    'Initialisation de la clé recherchée sur la première cellule de la colonne A
    cle_recherche1 = feuill1.Cells(i, "A").Value
    resultat = Application.VLookup(cle_recherche1, feuill1.Range("B1:B" & derniereLigneB), 1, 0)
    feuill2.Cells(ligneA, "A").Value = resultat
    ligneA = ligneA + 1
    If IsError(resultat) Then
    feuill2.Cells(ligneB, "B").Value = cle_recherche1
    ligneB = ligneB + 1
    End If
    Next i


    'Parcours de la colonne B et vérification si chaque valeur est unique non présente dans la colonne A ie les titres de la BDA N absents dans la BDA N-1
    For j = 1 To derniereLigneB
    'Initialisation de la clé recherchée sur la première cellule de la colonne des titres de la BDA N-1
    cle_recherche2 = feuill1.Cells(j, "B").Value
    resultat2 = Application.VLookup(cle_recherche2, feuill1.Range("A1:A" & derniereLigneA), 1, 0)
    feuill2.Cells(ligneC, "C").Value = resultat2
    ligneC = ligneC + 1
    If IsError(resultat2) Then
    feuill2.Cells(ligneD, "D").Value = cle_recherche2
    ligneD = ligneD + 1

    End If
    Next j
    With Application
    .DisplayAlerts = True
    .EnableEvents = True
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
    End With

    End Sub
    Bonjour !
    Voilà ce que je cherchais à faire au final et j'ai pu insérer la fonction VLOOKUP qui marche très bien.
    Le code marche mais je n'arrive pas à gérer les N/A et j'ai pas retrouvé de solution pouvant m'avancer non plus

  18. #18
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    C'est parce que vlookup renvoie une erreur quand il ne trouve pas. Il faut donc tester le résultat de la recherche avant d'écrire dans "Feuil2".

    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
    Sub Titres_invest()
     
    With Application
        .DisplayAlerts = False
        .EnableEvents = False
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
     
    'Déclaration des variables
    Dim feuill1 As Worksheet
    Dim feuill2 As Worksheet
    Dim derniereLigneA As Long
    Dim derniereLigneB As Long
    Dim i As Long
    Dim j As Long
    Dim ligneA As Long
    Dim resultat As Variant
    Dim resultat2 As Variant
    Dim ligneB As Long
    Dim ligneC As Long
    Dim cle_recherche1 As String
    Dim cle_recherche2 As String
    Dim ligneD As Long
     
    'Initialisation des variables de ligne
    ligneA = 1
    ligneB = 1
    ligneC = 1
    ligneD = 1
     
    'Définition des feuilles de calcul
    Set feuill1 = ThisWorkbook.Sheets("feuil1")
    Set feuill2 = ThisWorkbook.Sheets.Add(After:=Feuil1)
    feuill2.Name = "feuill2"
     
    'Détermination de la dernière ligne de données dans les colonnes A et B
    derniereLigneA = feuill1.Cells(feuill1.Rows.Count, "A").End(xlUp).Row
    derniereLigneB = feuill1.Cells(feuill1.Rows.Count, "B").End(xlUp).Row
     
    'Parcours de la colonne A et recherche dans la colonne B ie les titres de la BDA N-1 absents dans la BDA N
    For i = 1 To derniereLigneA
        'Initialisation de la clé recherchée sur la première cellule de la colonne A
        cle_recherche1 = feuill1.Cells(i, "A").Value
        resultat = Application.VLookup(cle_recherche1, feuill1.Range("B1:B" & derniereLigneB), 1, 0)
        If Not IsError(resultat) Then
            feuill2.Cells(ligneA, "A").Value = resultat
            ligneA = ligneA + 1
        End If
        If IsError(resultat) Then
            feuill2.Cells(ligneB, "B").Value = cle_recherche1
            ligneB = ligneB + 1
        End If
    Next i
     
     
    'Parcours de la colonne B et vérification si chaque valeur est unique non présente dans la colonne A ie les titres de la BDA N absents dans la BDA N-1
    For j = 1 To derniereLigneB
        'Initialisation de la clé recherchée sur la première cellule de la colonne des titres de la BDA N-1
        cle_recherche2 = feuill1.Cells(j, "B").Value
        resultat2 = Application.VLookup(cle_recherche2, feuill1.Range("A1:A" & derniereLigneA), 1, 0)
        If Not IsError(resultat2) Then
            feuill2.Cells(ligneC, "C").Value = resultat2
            ligneC = ligneC + 1
        End If
        If IsError(resultat2) Then
            feuill2.Cells(ligneD, "D").Value = cle_recherche2
            ligneD = ligneD + 1
        End If
    Next j
     
    With Application
        .DisplayAlerts = True
        .EnableEvents = True
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With
     
    End Sub

  19. #19
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Citation Envoyé par Franc Voir le message
    C'est parce que vlookup renvoie une erreur quand il ne trouve pas. Il faut donc tester le résultat de la recherche avant d'écrire dans "Feuil2".
    Merci infiniment @Franc!

  20. #20
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2023
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2023
    Messages : 56
    Par défaut
    Bonjour !

    J'ai un prblème avec ce bout de code:

    a = ThisWorkbook.Sheets("BDA_N-1").Range(Range("A1"), Range("A1").End(xlToRight))
    je ne comprends pas pourquoi ça ne marche pas
    j'aimerais juste déclarer ma variable de sorte qu'elle représente toute la première ligne de ma feuille

    Ensuite j'aimerai affecter à une variable la position d'une cellule de la première ligne de ma feuille avec la ApplicationFonction.Match
    Voici ce que j'ai fais :
    'For j = 1 To a
    'result1 = "Quantité"
    'x = ApplicationFonction.Match(result, ThisWorkbook.Sheets("le_nom_de_ma_feuille").Range("A1" & a), 0)
    'If Not IsError(x) Then
    result1 = x
    'End If

    'Next j
    Quelqu'un aurait-il une idée ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. faire une recherche sur plusieurs colonne
    Par B55176 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/12/2016, 08h00
  2. [AC-2003] comment faire pour rechercher sur une table ?
    Par Kalem dans le forum VBA Access
    Réponses: 8
    Dernier message: 10/04/2012, 09h33
  3. [XL-2003] Modification d'un code pour rechercher sur plusieurs colonnes au lieu d'une
    Par chipster008 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/05/2011, 14h10
  4. faire une recherche sur la colonne d'une liste annuaire
    Par gracouille dans le forum SharePoint
    Réponses: 1
    Dernier message: 13/10/2008, 17h06

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