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 :

[VBA] Recherche multiple & Extraction


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut [VBA] Recherche multiple & Extraction
    Bonjour à vous!

    Je me permets de vous soumettre une question.
    En effet, ayant jusqu'à présent réussi à me débrouiller sur Excel (en utilisant occasionnellement contourner VBA) ; cet outil me semble aujourd'hui incontournable ; et malgré des recherches sur les différents forum, je n'ai pas trouvé de réponse.

    En effet, j'ai une base de données dont les codes de référence (identifiant chaque ligne) sont assez complexe (mélant chiffres et lettres et autres caractères spéciaux (points, virgules...)).

    De cette base de donnée, je souhaiterais extraire les lignes:
    1/ du code de référence recherché (dans le fichier joint le numéro "3")
    2/ de la référence mère (2)
    3/ des références qui en découlent (4.a, 4.b, 4.c)

    La base de donnée est assez longue et et il peut y avoir plusieurs références mères, et pluisieurs références qui découlent de la référence principale.

    Au cas où cet exposé manquerait de clareté, voici un fichier test en PJ.

    Merci bcp!!!

    Déb
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Juste une question : quand tu parles de base de données, tu veux faire une requète serveur/SQL depuis ta macro VBA ? Ou ce que tu appelles BDD, c'est une autre fichier Excel ?

  3. #3
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Salut Kimy,

    La base de donnée est sur le même fichier Excel, sur une autre feuille (dans le fichier test sur la même feuille).
    Il faut donc exporter certaines lignes de cette feuille vers une autre feuille de ce même fichier Excel

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bon... Que veux-tu extraires ?

    Tu souhaites lancer une Macro qui affiche une box, dans laquelle tu rentres quelque chose, mais je n'arrive pas à déterminer ce quelque chose... C'est le code ? (Dans ton fichier exemple 3 ?)
    Ensuite la référence mère est la référence qui à en sous-code la référence recherchée ?
    Enfin, les références qui en découlent sous les sous-codes de la référence recherchée ?

    Voila le code que je te propose :
    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
    Sub Extract_data_base()
    Dim ref As Integer
    Dim cell_ref As Range
    Dim rowmax As Integer
    Dim cell_sc As Range
    Dim off1 As Integer
    Dim off2 As Integer
    Dim str As String
    Dim table() As String
     
    ref = InputBox("Référence recherchée ?", "Référence", 0)
     
    With Worksheets("Data")
        Set cell_ref = .Columns(2).Find(ref, LookIn:=xlFormulas, lookat:=xlWhole)
        If cell_ref Is Nothing Then
            MsgBox "La référence n'a pas été trouvée"
            Exit Sub
        End If
     
        rowmax = 0
        For i = 0 To 2
            test = Worksheets("Export").Columns(1 + (i * 4)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row
            If Worksheets("Export").Columns(1 + (i * 4)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row > rowmax Then
                rowmax = Worksheets("Export").Columns(1 + (i * 4)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row
            End If
        Next i
        Set cell_des = Worksheets("Export").Cells(rowmax, 1)
     
        For i = 0 To 3
            cell_des.Offset(0, i) = cell_ref.Offset(0, i - 1)
        Next i
     
        Set cell_sc = .Columns(4).Find(ref, LookIn:=xlFormulas, lookat:=xlWhole)
     
        If Not cell_sc Is Nothing Then
            For i = 0 To 3
                cell_des.Offset(0, i + 4) = cell_sc.Offset(0, i - 3)
            Next i
     
            ReDim table(1 To 1)
            off1 = 0
            off2 = 0
            If cell_ref.Offset(0, 2) <> "" Then
                If InStr(cell_ref.Offset(0, 2), ",") Then
                    off1 = InStr(cell_ref.Offset(0, 2), ",")
                    table(1) = Left(cell_ref.Offset(0, 2), off1 - 1)
     
                    For i = 2 To 100
                        If InStr(off1 + 1, cell_ref.Offset(0, 2), ",") Then
                            off2 = InStr(off1 + 1, cell_ref.Offset(0, 2), ",")
                            ReDim Preserve table(1 To i)
                            table(i) = Mid(cell_ref.Offset(0, 2), off1 + 2, off2 - off1 - 2)
                            off1 = off2
                        Else
                            ReDim Preserve table(1 To i)
                            table(i) = Right(cell_ref.Offset(0, 2), Len(cell_ref.Offset(0, 2)) - off1 - 1)
                            Exit For
                        End If
                    Next i
                Else
                    table(1) = cell_ref.Offset(0, 2)
                End If
            End If
     
        '    strMessage = ""
        '    For boucle = 1 To UBound(table)
        '        strMessage = strMessage & table(boucle) & vbLf
        '    Next boucle
        '
        '    MsgBox strMessage
     
            For i = 0 To UBound(table) - 1
                Set cell_sc = .Columns(2).Find(table(i + 1), LookIn:=xlFormulas, lookat:=xlWhole)
                For j = 0 To 3
                    cell_des.Offset(i, j + 8) = cell_sc.Offset(0, j - 1)
                Next j
            Next i
        End If
     
    End With
     
    End Sub
    Je pensais que ça serait plus simple ! ^^
    Peu importe, voila les conditions d'utilisation :
    1) Il faut que ta feuille origine s'appelle "Data" et ta feuille destination ""Export". Change dans le code si tu veux des noms différents. Sache également que ces deux feuilles doivent être dans le même classeur !
    2) Lance ta Macro et insère la référence que tu veux.
    3) Je fais une recherche de référence sur la deuxième colonne (comme dans ton fichier exemple).
    4) Si je trouve la référence, je la place sur la dernière ligne disponible en comparant les colonnes A, E et I dans ta feuille "Export".
    5) Je place les valeurs sur les colonnes A à D du fichier "Export".
    6) Je fais une recherche ensuite sur la sous référence sur la colonne D de ton fichier "Data".
    7) Si je trouve un fichier parent, je le place sur les colonnes E à H du fichier 'Export".
    8) Enfin je regarde la/les références fichiers enfants. S'il y en a plusieurs, ILS DOIVENTS ETRE SOUS LA FORME DECRIRE : c'est-a-dire "code1, code2, code3, code4, etc..." avec les virgules et les espaces comme précisés dans le fichier exemple.
    9) Enfin je fais une recherche de ces fichiers enfants et je les places sur les colonnes I à L de la feuille "Export".

    Bref, fait tes tests et reviens vers moi si tu as la moindre difficulté.

    PS : Au final, place le tableau "Table Extraction" sur les colonnes A à L dans une feuille "Export" tout en renomant ta feuille origine par "Data" et lance ta macro !

  5. #5
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Salut Kim,


    Désolé pour cette réponse tardive, j'ai profité des vacances pour plonger sérieusement à nouveau dans cette macro.

    Malheureusement ça ne marche pas.

    Au-delà de ce constat, quelques explications:

    - après avoir modifié les lignes en fonction de mon propre fichier (que je ne peux malheureusement pas partager), je reçois un message d'erreur sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ref = InputBox("Référence recherchée ?", "Référence", 0)
    - j'ai modifié les compteurs de colonne en fonction de mon propre tableau (qui en comprend 11 colones * 3), et la colonne "mère" en 5{E} (donc 5, 16, 27) mais peut-être ai-je mal adapté?

    - je n'ai également pas compris malgré tes explications la partie de code débutant en ligne 40 (je ne suis pas certain d'ailleurs de la nécessité de détailler le format du nom recherché, car il a le même format partout (à chaque étape de la recherche, même dans le premier "recherche, copier/coller", et reste très complexe, avec des symboles du type .- chiffres et lettres)

    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
     
    ReDim table(1 To 1)
            off1 = 0
            off2 = 0
            If cell_ref.Offset(0, 2) <> "" Then
                If InStr(cell_ref.Offset(0, 2), ",") Then
                    off1 = InStr(cell_ref.Offset(0, 2), ",")
                    table(1) = Left(cell_ref.Offset(0, 2), off1 - 1)
     
                    For i = 2 To 100
                        If InStr(off1 + 1, cell_ref.Offset(0, 2), ",") Then
                            off2 = InStr(off1 + 1, cell_ref.Offset(0, 2), ",")
                            ReDim Preserve table(1 To i)
                            table(i) = Mid(cell_ref.Offset(0, 2), off1 + 2, off2 - off1 - 2)
                            off1 = off2
                        Else
                            ReDim Preserve table(1 To i)
                            table(i) = Right(cell_ref.Offset(0, 2), Len(cell_ref.Offset(0, 2)) - off1 - 1)
                            Exit For
                        End If
                    Next i
                Else
                    table(1) = cell_ref.Offset(0, 2)
                End If
            End If
    J'espère avoir été assez clair dans ces questions

    A très bientôt!! - et bonne année!

    Deb

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    As-tu testé le code sur le fichier exemple que tu m'as donné ?

    Il y a ENORMEMENT de choses à changer si le format n'est pas le même. Je te propose donc d'envoyer un fichier exmple avec le bon formalisme (sans pour autant divulger les données).

    Je reviens vers toi avec le code commenté. Cela t'aidera peut-être à le modifier.

    Code commenté :
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    'Nom de la macro
    Sub Extract_data_base()
     
    'Déclaration des vaiables
    Dim ref As Integer
    Dim cell_ref As Range
    Dim rowmax As Integer
    Dim cell_sc As Range
    Dim off1 As Integer
    Dim off2 As Integer
    Dim str As String
    Dim table() As String
     
    'Affichage d'une inputbox dans laquelle tu rentres la référence que tu veux. Cette référence est un ENTIER !
    ref = InputBox("Référence recherchée ?", "Référence", 0)
     
    'Avec la feuille "Data"
    With Worksheets("Data")
        'On set cell_ref (cellule référence) là où l'on trouve la référence rentrée dans l'inputbox. (On cherche sur la colonne 2)
        Set cell_ref = .Columns(2).Find(ref, LookIn:=xlFormulas, lookat:=xlWhole)
     
        'Si on ne trouve pas la référence on affiche une MsgBox et on quitte la macro.
        If cell_ref Is Nothing Then
            MsgBox "La référence n'a pas été trouvée"
            Exit Sub
        End If
     
        'On set rowmax à 0.
        rowmax = 0
        'On boucle 3 fois avec i = 0, 1 puis 2. Cette boucle va nous permettre de tester quelle ligne est la dernière dans la table d'extraction pour ne pas écrire sur des données existantes.
        For i = 0 To 2
            'On enregistre dans rowmax le numéro de la dernière ligne de la colonne "Columns(1 + (i * 4))", soit la colonne A, E et I du tableau extraction
            'SI ET SEULEMENT SI la précédente valeur de rowmax était inférieure
            If Worksheets("Export").Columns(1 + (i * 4)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row > rowmax Then
                rowmax = Worksheets("Export").Columns(1 + (i * 4)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row
            End If
        Next i
     
        'On place donc notre cellule de destination (cell_des) à la bonne ligne (celle qui est complètement vide).
        Set cell_des = Worksheets("Export").Cells(rowmax, 1)
     
        'On boucle maintenant 4 fois avec i = 0, 1, 2 puis 3.
        For i = 0 To 3
            'On place dans la cellule cell_des.Offset(0, i) (c-a-d là où se trouve cell_des avec un offset de i ligne(s) ) ce qui se trouve dans cell_ref.Offset(0, i - 1) (c-a-d là où se trouve cell_des avec un offset de i-1 ligne(s) )
            'Cela signifie que dans la feuille export je place les données sur les colonnes A, B, C, D.
            cell_des.Offset(0, i) = cell_ref.Offset(0, i - 1)
        Next i
     
        'Maintenant on set cell_sc (cellule sous-code) à l'endroit où l'on trouve la référence dans la colonne 4 (soir la D)
        Set cell_sc = .Columns(4).Find(ref, LookIn:=xlFormulas, lookat:=xlWhole)
     
        'Si l'on trouve cette référence
        If Not cell_sc Is Nothing Then
            'On boucle 4 fois et on place les bonnes valeurs de source dans la feuille Export (colonnes E, F, G, H)
            For i = 0 To 3
                cell_des.Offset(0, i + 4) = cell_sc.Offset(0, i - 3)
            Next i
     
            'On redimentionne un tableau (en effacant ses données)
            ReDim table(1 To 1)
            'On set off1 et off2 à 0
            off1 = 0
            off2 = 0
     
            'Si il il y a quelque chose dans le sous-code de la ligne de cell_ref alors...
            If cell_ref.Offset(0, 2) <> "" Then
                '... si on trouve une virgule dans ce sous-code alors...
                If InStr(cell_ref.Offset(0, 2), ",") Then
                    'Je ve vais pas expliquer en détail la suite, c'est complexe.
                    'Je cherche juste les virgules dans ce sous code et j'enregistre ce qu'il se trouve entre ces virgules (sans l'espace) dans le tableau "table"
                    off1 = InStr(cell_ref.Offset(0, 2), ",")
                    table(1) = Left(cell_ref.Offset(0, 2), off1 - 1)
     
                    For i = 2 To 100
                        If InStr(off1 + 1, cell_ref.Offset(0, 2), ",") Then
                            off2 = InStr(off1 + 1, cell_ref.Offset(0, 2), ",")
                            ReDim Preserve table(1 To i)
                            table(i) = Mid(cell_ref.Offset(0, 2), off1 + 2, off2 - off1 - 2)
                            off1 = off2
                        Else
                            ReDim Preserve table(1 To i)
                            table(i) = Right(cell_ref.Offset(0, 2), Len(cell_ref.Offset(0, 2)) - off1 - 1)
                            Exit For
                        End If
                    Next i
     
                '... et si je ne trouve pas de virgule alors j'enregistre le sous-code entièrement puisqu'il n'y a qu'un seul sous-code
                Else
                    table(1) = cell_ref.Offset(0, 2)
                End If
            End If
     
            'Ca, c'est des tests perso
        '    strMessage = ""
        '    For boucle = 1 To UBound(table)
        '        strMessage = strMessage & table(boucle) & vbLf
        '    Next boucle
        '
        '    MsgBox strMessage
     
            'Enfin, je place ce qui se trouve dans mon tableau "table" aux bons endroits dans la feuille Export (c-a-d aux colonnes I, J, K, L)
            For i = 0 To UBound(table) - 1
                Set cell_sc = .Columns(2).Find(table(i + 1), LookIn:=xlFormulas, lookat:=xlWhole)
                For j = 0 To 3
                    cell_des.Offset(i, j + 8) = cell_sc.Offset(0, j - 1)
                Next j
            Next i
        End If
     
     
    End With
     
    End Sub

  7. #7
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut Fichier original sans data
    Merci bcp,

    J'avais effectivement testé le code, mais j'ai eu une erreur dès la première ligne (ou presque: la textbox) :S

    J'ai essayé des modications supplémentaires avec les commentaires de ton code précédent mais sans succès...

    Ci-joint le fichier dans son format tel que dans l'original.

    Merci bcp pour le temps que tu as déjà passé à m'aider... je te suis très reconnaissant. J'espère que cette fois-ci cela va fonctionner

    Deb
    Fichiers attachés Fichiers attachés

  8. #8
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Première chose, j'ai bien spécifié ceci :
    'Affichage d'une inputbox dans laquelle tu rentres la référence que tu veux. Cette référence est un ENTIER !
    Alors si tes codes sont de la forme "2.B-5.0.1.2", forcément que "ref", spécifié comme "Integer", ne va pas aimer...

    Donc en fix rapide (pour passer la première ligne ) tu changes :
    en :
    et déjà tu avanceras ! ^^

    Bref, je jette un coup d'oeil à ton nouveau format.

    Après tests rapides :
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    'Nom de la macro
    Sub Extract_data_base()
     
    'Déclaration des vaiables
    Dim ref As String
    Dim cell_ref As Range
    Dim rowmax As Integer
    Dim cell_sc As Range
    Dim off1 As Integer
    Dim off2 As Integer
    Dim str As String
    Dim table() As String
     
    'Affichage d'une inputbox dans laquelle tu rentres la référence que tu veux. Cette référence est un ENTIER !
    ref = InputBox("Référence recherchée ?", "Référence", 0)
     
    'Avec la feuille "Data"
    With Worksheets("Original")
        'On set cell_ref (cellule référence) là où l'on trouve la référence rentrée dans l'inputbox. (On cherche sur la colonne 2)
        Set cell_ref = .Columns(2).Find(ref, LookIn:=xlFormulas, lookat:=xlWhole)
     
        'Si on ne trouve pas la référence on affiche une MsgBox et on quitte la macro.
        If cell_ref Is Nothing Then
            MsgBox "La référence n'a pas été trouvée"
            Exit Sub
        End If
     
        'On set rowmax à 0.
        rowmax = 0
        'On boucle 3 fois avec i = 0, 1 puis 2. Cette boucle va nous permettre de tester quelle ligne est la dernière dans la table d'extraction pour ne pas écrire sur des données existantes.
        For i = 0 To 2
            'On enregistre dans rowmax le numéro de la dernière ligne de la colonne "Columns(1 + (i * 4))", soit la colonne A, E et I du tableau extraction
            'SI ET SEULEMENT SI la précédente valeur de rowmax était inférieure
            If Worksheets("Export").Columns(1 + (i * 11)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row > rowmax Then
                rowmax = Worksheets("Export").Columns(1 + (i * 11)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row
            End If
        Next i
     
        'On place donc notre cellule de destination (cell_des) à la bonne ligne (celle qui est complètement vide).
        Set cell_des = Worksheets("Export").Cells(rowmax, 1)
     
        'On boucle maintenant 4 fois avec i = 0, 1, 2 puis 3.
        For i = 0 To 10
            'On place dans la cellule cell_des.Offset(0, i) (c-a-d là où se trouve cell_des avec un offset de i ligne(s) ) ce qui se trouve dans cell_ref.Offset(0, i - 1) (c-a-d là où se trouve cell_des avec un offset de i-1 ligne(s) )
            'Cela signifie que dans la feuille export je place les données sur les colonnes A, B, C, D.
            cell_des.Offset(0, i) = cell_ref.Offset(0, i - 1)
        Next i
     
        'Maintenant on set cell_sc (cellule sous-code) à l'endroit où l'on trouve la référence dans la colonne 4 (soir la D)
        Set cell_sc = .Columns(5).Find(ref, LookIn:=xlFormulas, lookat:=xlWhole)
     
        'Si l'on trouve cette référence
        If Not cell_sc Is Nothing Then
            'On boucle 4 fois et on place les bonnes valeurs de source dans la feuille Export (colonnes E, F, G, H)
            For i = 0 To 10
                cell_des.Offset(0, i + 11) = cell_sc.Offset(0, i - 4)
            Next i
        End If
     
        'On redimentionne un tableau (en effacant ses données)
        ReDim table(1 To 1)
        'On set off1 et off2 à 0
        off1 = 0
        off2 = 0
     
        'Si il il y a quelque chose dans le sous-code de la ligne de cell_ref alors...
        If cell_ref.Offset(0, 3) <> "" Then
            '... si on trouve un point-virgule dans ce sous-code alors...
            If InStr(cell_ref.Offset(0, 3), ";") Then
                'Je ve vais pas expliquer en détail la suite, c'est complexe.
                'Je cherche juste les virgules dans ce sous code et j'enregistre ce qu'il se trouve entre ces virgules (sans l'espace) dans le tableau "table"
                off1 = InStr(cell_ref.Offset(0, 3), ";")
                table(1) = Left(cell_ref.Offset(0, 3), off1 - 2)
     
                For i = 2 To 100
                    If InStr(off1 + 1, cell_ref.Offset(0, 3), ";") Then
                        off2 = InStr(off1 + 1, cell_ref.Offset(0, 3), ";")
                        ReDim Preserve table(1 To i)
                        table(i) = Mid(cell_ref.Offset(0, 3), off1 + 2, off2 - off1 - 2)
                        off1 = off2
                    Else
                        ReDim Preserve table(1 To i)
                        table(i) = Right(cell_ref.Offset(0, 3), Len(cell_ref.Offset(0, 3)) - off1 - 1)
                        Exit For
                    End If
                Next i
     
            '... et si je ne trouve pas de virgule alors j'enregistre le sous-code entièrement puisqu'il n'y a qu'un seul sous-code
            Else
                table(1) = cell_ref.Offset(0, 3)
            End If
     
            'Ca, c'est des tests perso
            '    strMessage = ""
            '    For boucle = 1 To UBound(table)
            '        strMessage = strMessage & table(boucle) & vbLf
            '    Next boucle
            '
            '    MsgBox strMessage
     
            'Enfin, je place ce qui se trouve dans mon tableau "table" aux bons endroits dans la feuille Export (c-a-d aux colonnes I, J, K, L)
            For i = 0 To UBound(table) - 1
                Set cell_sc = .Columns(2).Find(table(i + 1), LookIn:=xlFormulas, lookat:=xlWhole)
                For j = 0 To 10
                    cell_des.Offset(i, j + 22) = cell_sc.Offset(0, j - 1)
                Next j
            Next i
        End If
     
    End With
     
    End Sub
    Bonne continuation à toi !

    EDIT : les com' ne sont plus d'actualité pour la plupart.

  9. #9
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Hello Kim!

    Merci beaucoup beaucoup pour cette macro!!

    Ca fonctionne assez bien, mais il y a encore quelques cafouillages.

    1/lorsqu'il y a une référence "mère" et une autre "fille" par rapport à celle recherchée.

    Ainsi, ça plante à la dernière ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cell_des.Offset(i, j + 22) = cell_sc.Offset(0, j - 1)
    Le message d'erreur est le suivant:
    Erreur d'exécution '91':
    Variable objet et ou variable de bloc With non définie
    In fine, dans la feuille excel d'export il est intéressant de noter que la référence recherchée est affichée, celle qui en découle (la fille), mais pas celle qui est "au-dessus" (la mère).
    Peut-être est-ce là un indice pour déterminer l'erreur?!

    2/ Lorsque l'on va à une référence élevée, qui n'a pas de "mère", la macro ne bug pas, mais ne trouve pas la/les référence(s) "filles".


    Donc pour conclure: la macro fonctionne uniquement dans les cas suivants:
    a. on recherche un cran au dessus (de la fille à la mère, mais on ne va pas "en-dessous")
    b. lorsque l'on recherche une référence "mère" qui n'a pas de fille (donc la macro n'a qu'à afficher la référence recherchée, et c'est tout)


    N'hésite pas à me questionner si tu as des problèmes d'interprétation (avec tout ces termes familiaux mère/fille/... faut être presque aussi bon en généalogie! )

    Bon appétit!

    Deb

  10. #10
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bon, je viens de retester tout marche pour moi.

    Je t'explique donc ce que j'ai compris de notre conversation (qui date un peu maintenant, je l'avoue ).

    Bref, dans le dernier fichier exemple que tu m'as donné :
    1) Je rentre un code (Exemple : du type "2.B-4.3").
    2) La macro parcours la colonne B et cherche ce code.
    3) a) La macro ne trouve rien : une MsgBox apparait spécifiant "La référence n'a pas été trouvée". => Tout s'arrète.
    __ b) La macro trouve une référence : (dans l'exemple : la ligne 10) et va donc placer dans les colonnes A à K de la feuille "Export" les bonnes valeurs. Dans l'exemple, on placera :
    B | 2.B-4.3 | aléatoire | aléatoire | 1.A-2.3 | aléatoire | aléatoire | aléatoire | aléatoire | aléatoire
    4) La macro va ensuite parcourir la colonne "Sous-Code" de la feuille "Original" à la recherche du code rentré initialement ("2.B-4.3").
    5) a) Lors de la première référence trouvée, la macro va placer la ligne de la référence trouvée dans les colonnes L à V de la feuille "Export".
    Dans l'exemple, on placera :
    C | 3.C-6.2 | aléatoire | aléatoire | 2.B-4.3 | aléatoire | aléatoire | aléatoire | aléatoire | aléatoire
    __ b) Si la macro ne trouve rien, rien ne se passe à cette étape.
    6) Ensuite la macro va chercher le/les "Sous-Jacent". Pour ce faire, on enregistre le code qui se trouve dans le "Sous-Code" (dans la colonne E de la feuille "Original") de la première occurence (je rappelle, c'était la ligne 10, dans notre exemple).
    7) a) Si la macro trouve une valeur, elle décompose cette dernière :
    ___ - S'il y a au moins un point virgule, alors la macro décompose les différents codes pour les chercher séparément
    ___ - S'il n'y a pas de point virgule alors la macro prend la celulle entière comme un seul code
    ___ => La recherche s'effectue de cette manière : pour le ou les "Sous-Code" récupéré(s), on cherche dans la colonne B de la feuille "Original". A chaque occurence trouvé, on place les bonnes valeurs dans les colonnes W à AG de la feuille "Export".
    Dans l'exemple, n'ayant qu'un seul Sous-Code, on aura :
    A | 1.A-2.3 | aléatoire | aléatoire | "nothing" | aléatoire | aléatoire | aléatoire | aléatoire | aléatoire
    __ b) Si la macro ne trouve pas de "Sous-Code" de notre première occurence, elle s'arrète.

    J'ai beau relire tout ce que tu m'as écris jusqu'alors, je n'ai fait qu'appliquer tes instructions. Je te propose donc d'essayer la macro dans le fichier exemple que tu m'as donné et de me dire ce que tu souhaites changer.

    Une chose, dans le premier fichier exemple, tes "Sous-Code" était de la forme "xxx, xxx". Dans le dernier, de la forme "xxx ; xxx". Cela n'implique pas le même code.

    Bref, lis attentivement ceci. Dis moi ce que je n'ai pas compris de manière explicite. Donne moi un fichier exemple avec ce que tu as initialement et ce que tu veux au final AVEC LE BON FORMALISME !!!

    En espérant pouvoir t'aider d'avantage avec ces quelques instructions !

  11. #11
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Bonsoir!

    Effectivement la macro marche bien dans le fichier test, à l'exeption du cas où l'on recherche
    2.B-4.3
    auquel cas il devrait y avoir 2 lignes de résultat (3.C-6.2 & 3.C-6.3). Il peut potentiellement y avoir plus que 2 résultats...

    En PJ, se trouve un fichier test avec en onglet "Export_2" plusieurs exemples de recherche avec les résultats escomptés. (pour les besoins ergonomique, certaines colonnes sont masquées).



    Egalement, les références (qu'elles soient en "sous-code" ou non) peuvent être de plusieurs formats:
    Chiffre(s)|Lettre(s)|-|chiffres séparés par des points|quelques fois suivi par un point et lettre(s)
    Quelques exmples: 1ABS-1.5 ou encore 8T-5.6.7.E

    Egalement la séparation de ces références dans la colonne sous-code peut se faire de plusieurs manières:
    - virgule
    - espace
    - ... (utilisateurs indisciplinés )

    L'idéal serait à mon avis de trouver le même résultat qu'en entrant directement la référence recherchée dans la fonction Excel de recherche (Ctrl + F), ne prenant pas en considération les séparations/... mais juste la casse de la référence.

    J'espère ne pas avoir induit en erreur auparavant ou causé une perte de temps... auquel cas mes sincères excuses.


    Peut-être que ces 2 éléments sont à l'origine des erreurs retrouvées sur le fichier original?


    -A NOUVEAU MERCI BEAUCOUP-

    Deb
    Fichiers attachés Fichiers attachés

  12. #12
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Effectivement la macro marche bien dans le fichier test, à l'exeption du cas où l'on recherche
    2.B-4.3
    auquel cas il devrait y avoir 2 lignes de résultat (3.C-6.2 & 3.C-6.3). Il peut potentiellement y avoir plus que 2 résultats...
    => Partie corrigée. (Je ne pensais pas qu'il pouvois y avoir plusieurs "sources". C'est mon "bon sens" qui m'a fait codé des bétises... ^^; )

    Bref, avant de t'envoyer le code, je voudrais corriger la deuxième partie. Cependant, comme tu le dis bien, il y a plusieurs formalisme ce qui devient donc difficile.
    La solution que j'imagine est faisable mais UNIQUEMENT si les "Sous-Code" (qu'ils aient des virgules, points-virgule, autres...) sont séparés au moins par un espace.
    L'idée serait de détecter les "espaces" en question. Ensuite on décompose ce sous-code en sub-string entre chaque espace. Si il y a une virgule ou un point virgule au début ou à la fin de ces sub-string, on l'enlève puis on fait la recherche de tous ces sub-string après.

    Exemple :
    1.A-2.2 ; 1.A-1.1, 3.C-6.3
    On décompose, on obtient :
    1ère sub-string : 1.A-2.2
    2ème : 1.A-1.1,
    3ème : 3.C-6.3
    La deuxième sub-string à une virgule à la fin. On la supprime. Et on fait trois recherche :
    1.A-2.2 puis 1.A-1.1 puis 3.C-6.3
    Est-ce que cela te conviendrait ?

  13. #13
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Hello!

    En effet, la solution que tu proposes devrait - hopefully - fonctionner ...

    D'avance, merci!

    Buonanotte!

    Deb

  14. #14
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Ca devrait être bon ! ^^
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    Sub Extract_data_base()
    Dim ref As String
    Dim cell_ref As Range
    Dim rowmax As Integer
    Dim cell_sc As Range
    Dim off1 As Integer
    Dim off2 As Integer
    Dim str As String
    Dim table() As String
     
    ref = InputBox("Référence recherchée ?", "Référence", 0)
     
    If ref = "" Then
        Exit Sub
    End If
     
    With Worksheets("Original")
        Set cell_ref = .Columns(2).Find(ref, LookIn:=xlFormulas, lookat:=xlWhole)
     
        If cell_ref Is Nothing Then
            MsgBox "La référence n'a pas été trouvée"
            Exit Sub
        End If
     
        rowmax = 0
        For i = 0 To 2
            If Worksheets("Export").Columns(1 + (i * 11)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row > rowmax Then
                rowmax = Worksheets("Export").Columns(1 + (i * 11)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row
            End If
        Next i
     
        Set cell_des = Worksheets("Export").Cells(rowmax, 1)
     
        For i = 0 To 10
            cell_des.Offset(0, i) = cell_ref.Offset(0, i - 1)
        Next i
     
        off = 0
        For j = 0 To .Columns(5).Find("*", , , , xlByColumns, xlPrevious).Row
            If .Range("E1").Offset(j, 0) = ref Then
                Set cell_sc = .Range("E1").Offset(j, 0)
     
                For i = 0 To 10
                    cell_des.Offset(off, i + 22) = cell_sc.Offset(0, i - 4)
                Next i
                off = off + 1
            End If
        Next j
     
        ReDim table(1 To 1)
        off1 = 0
        off2 = 0
     
        If cell_ref.Offset(0, 3) <> "" Then
            If InStr(cell_ref.Offset(0, 3), " ") Then
                off1 = InStr(cell_ref.Offset(0, 3), " ")
                table(1) = Left(cell_ref.Offset(0, 3), off1 - 1)
     
                i = 2
                Do While i < 100
                    If InStr(off1 + 1, cell_ref.Offset(0, 3), " ") Then
                        off2 = InStr(off1 + 1, cell_ref.Offset(0, 3), " ")
                        If Len(Mid(cell_ref.Offset(0, 3), off1 + 1, off2 - off1 - 1)) > 1 Then
                            ReDim Preserve table(1 To i)
                            table(i) = Mid(cell_ref.Offset(0, 3), off1 + 1, off2 - off1 - 1)
                            i = i + 1
                        End If
                        off1 = off2
                    Else
                        ReDim Preserve table(1 To i)
                        table(i) = Right(cell_ref.Offset(0, 3), Len(cell_ref.Offset(0, 3)) - off1)
                        Exit Do
                    End If
                Loop
     
            Else
                table(1) = cell_ref.Offset(0, 3)
            End If
     
    '            strMessage = ""
    '            For boucle = 1 To UBound(table)
    '                strMessage = strMessage & table(boucle) & vbLf
    '            Next boucle
    '
    '            MsgBox strMessage
     
           For i = 0 To UBound(table) - 1
    '*****************************************************************************************************************************************
                'Si tu dois ajouter des caractères succeptibles de corrompre les données places seulement ceci :
    '                        If InStr(table(i + 1), "*_CARAC_*") Then
    '                            table(i + 1) = Replace(table(i + 1), "*_CARAC_*", "")
    '                        End If
                'en remplacant *_CARAC_* par le caractère corrompu.
    '*****************************************************************************************************************************************
                If InStr(table(i + 1), ";") Then
                    table(i + 1) = Replace(table(i + 1), ";", "")
                End If
                If InStr(table(i + 1), ",") Then
                    table(i + 1) = Replace(table(i + 1), ",", "")
                End If
                If InStr(table(i + 1), " ") Then
                    table(i + 1) = Replace(table(i + 1), " ", "")
                End If
     
                Set cell_sc = .Columns(2).Find(table(i + 1), LookIn:=xlFormulas, lookat:=xlWhole)
                For j = 0 To 10
                    cell_des.Offset(i, j + 11) = cell_sc.Offset(0, j - 1)
                Next j
            Next i
        End If
     
    End With
     
    End Sub
    Tiens moi au courant !

    Amélioration ! ^^
    J'ai recodé la fonction "Split" qui existait déjà en VBA ! xD

    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
    Sub Extract_data_base()
    Dim ref As String
    Dim cell_ref As Range
    Dim rowmax As Integer
    Dim cell_sc As Range
    Dim off As Integer
    Dim str As String
    Dim table() As String
     
    ref = InputBox("Référence recherchée ?", "Référence", 0)
     
    If ref = "" Then
        Exit Sub
    End If
     
    With Worksheets("Original")
        Set cell_ref = .Columns(2).Find(ref, LookIn:=xlFormulas, lookat:=xlWhole)
     
        If cell_ref Is Nothing Then
            MsgBox "La référence n'a pas été trouvée"
            Exit Sub
        End If
     
        rowmax = 0
        For i = 0 To 2
            If Worksheets("Export").Columns(1 + (i * 11)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row > rowmax Then
                rowmax = Worksheets("Export").Columns(1 + (i * 11)).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0).Row
            End If
        Next i
     
        Set cell_des = Worksheets("Export").Cells(rowmax, 1)
     
        For i = 0 To 10
            cell_des.Offset(0, i) = cell_ref.Offset(0, i - 1)
        Next i
     
        off = 0
        For j = 0 To .Columns(5).Find("*", , , , xlByColumns, xlPrevious).Row
            If .Range("E1").Offset(j, 0) = ref Then
                Set cell_sc = .Range("E1").Offset(j, 0)
     
                For i = 0 To 10
                    cell_des.Offset(off, i + 22) = cell_sc.Offset(0, i - 4)
                Next i
                off = off + 1
            End If
        Next j
     
     
        If cell_ref.Offset(0, 3) <> "" Then
            table() = Split(cell_ref.Offset(0, 3), " ")
     
            off = 0
            For i = 0 To UBound(table)
    '*****************************************************************************************************************************************
                'Si tu dois ajouter des caractères succeptibles de corrompre les données places seulement ceci :
    '                        If InStr(table(i + 1), "*_CARAC_*") Then
    '                            table(i + 1) = Replace(table(i + 1), "*_CARAC_*", "")
    '                        End If
                'en remplacant *_CARAC_* par le caractère corrompu.
    '*****************************************************************************************************************************************
                If InStr(table(i), ";") Then
                    table(i) = Replace(table(i), ";", "")
                End If
                If InStr(table(i), ",") Then
                    table(i) = Replace(table(i), ",", "")
                End If
                If InStr(table(i), " ") Then
                    table(i) = Replace(table(i), " ", "")
                End If
     
                If Len(table(i)) > 0 Then
                    Set cell_sc = .Columns(2).Find(table(i), LookIn:=xlFormulas, lookat:=xlWhole)
                    If Not cell_sc Is Nothing Then
                        For j = 0 To 10
                            cell_des.Offset(off, j + 11) = cell_sc.Offset(0, j - 1)
                        Next j
                    Else
                        cell_des.Offset(off, 11) = "Not found"
                        cell_des.Offset(off, 12) = table(i)
                    End If
                    off = off + 1
                End If
            Next i
        End If
     
    End With
     
    End Sub
    Dis moi ! =D

  15. #15
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Salut!

    Merci bien!!
    Ca fonctionne très bien!
    Il ne reste plus qu'un cas où ça ne fonctionne pas encore parfaitement...mais je suis très confiant que la solution est très proche de nous!!

    Il s'agit probablement de la partie sur la recherche de sous-code:

    Le souci vient apparement autre élément d'enquête: il n'y a apparemment de souci que lorsque du texte est mélangé aux références dans la colonne sous-code -hé oui j'ai à nouveau oublié de dire ça... aïe aïe aïe!!
    (c'était sous-entendu dans les "...", mais j'avais pas compris que la macro ne faisait pas la distinction)

    in fact, tu peu avoir une cellule avec une référence qui se présenterait de la façon suivante:
    ygeazfyg qsdygfql sqfgf 1ABS-1.5, 8T-5.6.7.E ezfuh

    et potentiellement:
    ygeazfyg qsdygfql sqfgf 1ABS-1.5 ezygfu; 8T-5.6.7.E ezfuh

    y a-t-il une solution à ceci..??





    MERCIIIIIIIIIII

    Deb

  16. #16
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    La macro actuelle devrait logiquement, à chaque sous-code commenté, mettre un "not found" pour chaque cellule non trouvée.

    Si tu as ceci :
    ygeazfyg qsdygfql sqfgf 1ABS-1.5, 8T-5.6.7.E ezfuh
    Tu devrais obtenir dans les colonnes L à V ceci :
    Not found | ygeazfyg
    Not found | qsdygfql
    Not found | sqfgf
    "La bonne référence" | 1ABS-1.5 | "La bonne référence" | ...
    "La bonne référence" | 8T-5.6.7.E | "La bonne référence" | ...
    Not found | ezfuh
    Donc, je te propose de changer cette partie du code, l'ayant placé de cette manière pour éviter les cas difficiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                    If Not cell_sc Is Nothing Then
                        For j = 0 To 10
                            cell_des.Offset(off, j + 11) = cell_sc.Offset(0, j - 1)
                        Next j
                    Else
                        cell_des.Offset(off, 11) = "Not found"
                        cell_des.Offset(off, 12) = table(i)
                    End If
                    off = off + 1
    ... en ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    If Not cell_sc Is Nothing Then
                        For j = 0 To 10
                            cell_des.Offset(off, j + 11) = cell_sc.Offset(0, j - 1)
                        Next j
                        off = off + 1
                    End If
    Je pense que cela fonctionnera comme tu le souhaiteras après ! =)
    Tiens moi au courant !

  17. #17
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Hello!

    Malheureusement ça ne marche pas...: le problème reste inchangé :S

    Je reçois les messages d'erreur suivants:
    La référence n'a pas été trouvée
    Afin de s'assurer que nous parlons du même problème, le voici reformulé:

    Re-prenons le fichier test, et allons dans l'onglet "Original".
    En cellule E11, dans le fichier original:
    1.A-2.2 ; 1.A-1.1
    La macro devrait fonctionner et réussir à retrouver ces 2 références dans le cas suivant:

    zjhaygd zeyg 1.A-2.2 ; 1.A-1.1 ez ufgyf
    zjhaygd zeyg 1.A-2.2, uezifhy qzeufh; 1.A-1.1 ezuf gyf
    Merci!

    Deb

  18. #18
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Attends... Tu fais des recherches UNIQUEMENT sur la colonne A, n'est-ce pas ?

    Pourquoi tu me parles de colonne E et de "La référence n'a pas été trouvée" ?

  19. #19
    Membre régulier
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Bonjour!

    Oui, on ne fait des recherches sur la colonne A en effet...
    Toutefois, on peut aussi chercher dans la colonne E.

    Ainsi, lorsque l'on recherche dans la text box: 2.B-5.1, la macro regarde sur cette ligne la colonne E et y trouve 1.A-2.2 & 1.A-1.1.
    Elle doit retrouver 1.A-2.2 & 1.A-1.1 dans la colonne B et exporter les lignes où elle les a trouvées (lignes 3 & 5)

    Maintenant, elle doit aussi chercher ce que l'on a recherché dans la texte box (2.B-5.1) dans la colonne E et exporter les lignes qu'elle l'a trouvé! (dans cet exemple il n'y a rien à retrouver, mais cela aurait put être le cas en cherchant [2.B-4.3], ce qui aurait donné lieu à l'export des lignes 14 et 15, où elle aurait trouvé les références 3.C-6.2 & 3.C-6.3 liées à 2.B-4.3).

    Maintenant, dans cette colonne E, les références sont mal formulées, elles sont un petit peu désordonnées dans le fichier original. Ainsi au lieu d'avoir comme dans le fichier test:
    1.A-2.2 ; 1.A-1.1
    l'on peut trouver cette cellule avec des références exprimées de cette façon:
    texte texte 1.A-2.2, texte texte; 1.A-1.1 texte texte
    Dans la colonne B, les références sont TOUJOURS "joliment" écrites: une référence par ligne, sans aucune autre information (comme dans le fichier test).


    En espérant avoir répondu à ton exclamation,

    Deb

  20. #20
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Chez moi, ca fonctionne...

Discussions similaires

  1. Macro VBA de recherche et d'extraction de valeur
    Par mattchoco dans le forum Macros et VBA Excel
    Réponses: 42
    Dernier message: 06/07/2013, 23h59
  2. Sql ou vba recherche
    Par stargates dans le forum VBA Access
    Réponses: 6
    Dernier message: 09/02/2006, 20h54
  3. [VBA]Rechercher une chaine dans une cellule?
    Par ZIED dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/01/2006, 06h31
  4. [Vba]recherche infos sur tables
    Par Emcy dans le forum Access
    Réponses: 8
    Dernier message: 09/11/2005, 09h44
  5. Réponses: 2
    Dernier message: 19/10/2005, 16h38

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