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 Comparer deux tableaux (array of string )


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 13
    Par défaut
    Bonjour.
    J'ai un problème dans une macro VBA qui a pour rôle de comparer deux tableaux (array of string ) et de stocker les données identiques dans une variable.
    j'ai procédé comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ct = -1
        For i = 3 To RowCount
            If objsheet.Cells(i, 4) <> "-" Then
                ct = ct + 1
                ReDim Preserve VarExcel(ct)
                VarExcel(ct) = objsheet.Cells(i, 7)
            End If
        Next i
    Cette boucle sert à extraire les données excel qui vont servir à faire la comparaison avec la variable VarFile après. Ces données sont stockées dans la variables VarExcel.
    Puis, j'effectue la comparaison entre VarFile et VarExcel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cpt = -1
        For j = 1 To UBound(VarFile)
            For k = 0 To UBound(VarExcel)
                If InStr(VarFile(j), VarExcel(k)) Then
                    cpt = cpt + 1
                    ReDim Preserve ch1(cpt)
                    ch1(cpt) = VarFile(j)
                  Debug.Print ch(cpt)
                End If
            Next k
        Next j
    Mon problème est que la variable ch est exactement identique à Varfile alors qu'elle doit normalement ne contenir que les "cases" de VarFile si InStr(VarFile(j), VarExcel(k)).

    SVP aidez moi, j'arrive pas à identifier le problème et c'est vraiment urgent.
    Merci

    Re-salut

    alors y a personne pour m'aider ?
    si mon message n'est pas tout à fait clair, que quelqu'un me le dise pour que j'essaye de réexpliquer.

    SVP je cherche une réponse en urgence car je suis bloqué et je ne peux pas avancer dans le développement de mon application avant que je résolve ce problème.

    Merci à l'avance

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

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Faut pas t'impatienter comme ça, tu n'es pas tout seul ici. "VarFile", c'est quoi ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ne faudrait-il pas tester le résultat de :
    If InStr(VarFile(j), VarExcel(k)) Then
    Ci-dessous, l'aide de la fonction Instr



    Si la chaîne est trouvée, le résultat est > 0.

    Pas sûr, à tester.


    Cordialement.

  4. #4
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 13
    Par défaut
    Merci Daniel.C et Eric KERGRESSE pour vos réponses.

    Daniel, je fais une course contre la montre pour terminer mon application à temps c'est pour cela que je ne m'impatiente un peu. et tu as raison, y a pas que moi qui demande de l'aide sur ce forum.
    Alors VarFile est un array de string (variable où j'ai stocker des données extraites à partir d'un fichier texte). A tire d'exemple:
    VarFile (1) = "Anne : femme 34ans;"
    VarFile (2) = "jean : homme 50ans;"

    Désolée Eric,mais j'ai pas tout à fait saisi ta remarque :/

  5. #5
    Invité
    Invité(e)
    Par défaut
    En suivant le raisonnement de mon message, il faut que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If InStr(VarFile(j), VarExcel(k))>0 Then
    Dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cpt = -1
        For j = 1 To UBound(VarFile)
            For k = 0 To UBound(VarExcel)
                If InStr(VarFile(j), VarExcel(k))>0 Then
                    cpt = cpt + 1
                    ReDim Preserve ch1(cpt)
                    ch1(cpt) = VarFile(j)
                  Debug.Print ch(cpt)
                End If
            Next k
        Next j

  6. #6
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 13
    Par défaut
    Merci Eric pour la clarification
    Mais ça ne fonctionne toujours pas càd même résultat avec ou sans la condition >0 !!

  7. #7
    Invité
    Invité(e)
    Par défaut
    As-tu un classeur exemple sans données confidentielles avec ton code VBA ?

    Cordialement.

  8. #8
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 13
    Par défaut
    c'est ça tout le problème Eric.
    Je ne peux pas t'envoyer mon classeur avec le code VBA.
    Mais est ce que tu peux m'indiquer une piste (celle que tu suspectes) et j'essaierai de creuser moi même pour résoudre le problème ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai essayé de reproduire l'exemple sur 3 enregistrements dont 1 était commun aux deux matrices dans le fichier joint.
    Le résultat est bien l'enregistrement commun (Eric).

    Nb : Mes variables matrices sont de type Variant (voir le code).

    Avec quelques données à toi, tu peux modifier le fichier transmis et regarder si cela fonctionne correctement.

    Cordialement.

  10. #10
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 13
    Par défaut
    Bonjour Eric.

    Merci infinement pour ta réponse et pour l'effort que t'as fourni pour me la donner

    En effet, j'ai pu identifier la cause de mon problème: ma VarExcel contient une "case" vide. Quand je remplis cette case, mon code fonctionne normalement.
    Mais franchement je vois pas comment corriger ce problème au cas où j'aurais des cases vides.
    Un autre problème, c'est que ma variable ch contient des cases en doublons mais j'arrive pas à en déterminer la cause ! donc si tu as un conseil à me donner, il sera le bienvenu.

    Merci encore et bonne journée

  11. #11
    Invité
    Invité(e)
    Par défaut
    En insérant une valeur vide dans VarExcel, CH1 récupère tout Varfile.

    Essaye de modifier la code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          If InStr(VarFile(J), VarExcel(K)) > 0
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                If InStr(VarFile(J), VarExcel(K)) > 0 And Not IsEmpty(VarExcel(K)) Then
              '  MsgBox ("Valeur Varfile : " & VarFile(J) & Chr(10) & "Valeur VarExcel : " & VarExcel(K) & Chr(10) & " Valeur Instr : " & InStr(VarFile(J), VarExcel(K)))
    La condition ne fonctionne que si VarExcel(K) n'est pas vide.

    Indique moi si tu as toujours des doublons.

    Cordialement.

  12. #12
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 13
    Par défaut
    j'ai essayé comme tu m'as conseillé et bizarrement ça n'a pas fonctionné.
    PS: les doublons persistent encore !!

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour

    Avec une autre méthode que instr avec l'objet dictionary
    par un exemple quelconque; le tableau final ne comporte pas de doublon
    Fichiers attachés Fichiers attachés

  14. #14
    Invité
    Invité(e)
    Par défaut
    Dans ce cas modifie ton code en initialisant deux variables "PresenceDoublon" et CompteurCh1 et ajoute les lignes de code testant la présence des doublons dans ta macro

    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
    Sub ComparerVarExcel()
     
    Dim Cpt As Long
    Dim J As Long
    Dim K As Long
    Dim PresenceDoublon As Boolean
    Dim CompteurCh1 As Long
     
        Call ChargementVarfile
        Call ChargerVarExcel
        Cpt = -1
        For J = 0 To UBound(VarFile)
            For K = 0 To UBound(VarExcel)
                If InStr(VarFile(J), VarExcel(K)) > 0 And Not IsEmpty(VarExcel(K)) Then
                    MsgBox ("Valeur Varfile : " & VarFile(J) & Chr(10) & "Valeur VarExcel : " & VarExcel(K) & Chr(10) & " Valeur Instr : " & InStr(VarFile(J), VarExcel(K)))
     
                    PresenceDoublon = False
                    For CompteurCh1 = LBound(Ch1, 1) To UBound(Ch1, 1)
                     If Ch1(CompteurCh1) = VarFile(J) Then PresenceDoublon = True
                    Next CompteurCh1
     
                    If PresenceDoublon = False Then
                           Cpt = Cpt + 1
                           ReDim Preserve Ch1(Cpt)
                           Ch1(Cpt) = VarFile(J)
                           MsgBox ("Ch1 : " & Ch1(UBound(Ch1)))
                        ' Debug.Print Ch1(Cpt)
                   End If
                End If
            Next K
        Next J
    End Sub
    Cordialement.

  15. #15
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 13
    Par défaut
    Merci Eric pour l'astuce que t'as ajoutée au code
    .
    Mais je ne sais pas pourquoi ça bloque au niveau de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For CompteurCh1 = LBound(ch1, 1) To UBound(ch1, 1)
    m'indiquant le message d'erreur suivant:
    Run-time error '9' subscript out of range

  16. #16
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Excusez moi d'avoir dérangé en essayant de montrer une méthode simple et rapide; pourtant l'objet dictionary est du niveau débutant

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par rebelious Voir le message
    Merci Eric pour l'astuce que t'as ajoutée au code
    .
    Mais je ne sais pas pourquoi ça bloque au niveau de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For CompteurCh1 = LBound(ch1, 1) To UBound(ch1, 1)
    m'indiquant le message d'erreur suivant:
    Run-time error '9' subscript out of range
    L'erreur se produit car la variable Ch1 n'est pas initialisée à la première occurrence. J'ai donc initialisé Ch1 en début de programme. Par contre, il faut qu'à la première occurrence, la valeur aille dans Ch1(0) et que Redim Preserve Ch1 n'intervienne qu'à partir de la deuxième occurrence. J'ai donc ajouté un select case pour tester la valeur de Cpt. Attention Cpt démarre à 0 maintenant.


    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
    Sub ComparerVarExcel()
     
    Dim Cpt As Long
    Dim J As Long
    Dim K As Long
    Dim PresenceDoublon As Boolean
    Dim CompteurCh1 As Long
     
        ReDim Ch1(0)
        Call ChargementVarfile
        Call ChargerVarExcel
        Cpt = 0
        For J = 0 To UBound(VarFile)
            For K = 0 To UBound(VarExcel)
                If InStr(VarFile(J), VarExcel(K)) > 0 And Not IsEmpty(VarExcel(K)) Then
                    MsgBox ("Valeur Varfile : " & VarFile(J) & Chr(10) & "Valeur VarExcel : " & VarExcel(K) & Chr(10) & " Valeur Instr : " & InStr(VarFile(J), VarExcel(K)))
     
     
                         PresenceDoublon = False
                         For CompteurCh1 = LBound(Ch1) To UBound(Ch1)
                          If Ch1(CompteurCh1) = VarFile(J) Then PresenceDoublon = True
                         Next CompteurCh1
     
                         If PresenceDoublon = False Then
                            Select Case Cpt
                                Case 0
                                    Ch1(Cpt) = VarFile(J)
                                    MsgBox ("Ch1 : " & Ch1(Cpt))
                                    Cpt = Cpt + 1
                                Case Else
                                    ReDim Preserve Ch1(Cpt)
                                    Ch1(Cpt) = VarFile(J)
                                    MsgBox ("Ch1 : " & Ch1(Cpt))
                                Cpt = Cpt + 1
                             ' Debug.Print Ch1(Cpt)
                            End Select
     
                        End If
                End If
            Next K
        Next J
    End Sub
    Cordialement.

  18. #18
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 13
    Par défaut
    bonsoir

    Michel_M, je suis vraiment désolé, je ne me suis rendue-compte de ton premier message qu'après lecture du 2ème .
    Alors merci bien pour la méthode que tu m'as proposée mais franchement en tant que débutant en VBA je préfère pas utiliser des objet qui ne me sont pas familiers si je peut me débrouiller autrement

    Eric, je ne saurais te remercier pour l'effort que tu as fournis pour me répondre et le code que tu as posté fonctionne à merveille.
    Juste une dernière question et j'espère pouvoir bien la poser:
    sais tu comment contourner le problème suivant:
    dans ma VarExcel j'ai parfois des chaines de la forme "Rebelious_1" ou encore "Eric KERGRESSE" alors que leurs équivalents dans VarFile sont de la forme "Rebelious" ou "Eric"
    càd "Rebelious_1"est équivalente à "Rebelious" et "Eric KERGRESSE"est équivalente à "Eric".
    L'instrucstion InStr(VarFile(J), VarExcel(K)) > 0 ne peut pas prendre en compte ces cas particuliers et je ne sais vraiment pas s'il est possible de trouver une issue à ce problème.

    J'attend vos propsitions SVP
    allez, bonne soirée

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il faut ajouter une nouvelle condition dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If (InStr(VarFile(J), VarExcel(K)) > 0 And Not IsEmpty(VarExcel(K))) Or (VarFile(J) = Mid(VarExcel(K), 1, Len(VarFile(J))) And Not IsEmpty(VarFile(J))) Then
    Le code devient

    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
    Sub ComparerVarExcel()
     
    Dim Cpt As Long
    Dim J As Long
    Dim K As Long
    Dim PresenceDoublon As Boolean
    Dim CompteurCh1 As Long
     
        ReDim Ch1(0)
        Call ChargementVarfile
        Call ChargerVarExcel
        Cpt = 0
        For J = 0 To UBound(VarFile)
            For K = 0 To UBound(VarExcel)
                If (InStr(VarFile(J), VarExcel(K)) > 0 And Not IsEmpty(VarExcel(K))) Or (VarFile(J) = Mid(VarExcel(K), 1, Len(VarFile(J))) And Not IsEmpty(VarFile(J))) Then
                    MsgBox ("Valeur Varfile : " & VarFile(J) & Chr(10) & "Valeur VarExcel : " & VarExcel(K) & Chr(10) & " Valeur Instr : " & InStr(VarFile(J), VarExcel(K)))
     
     
                         PresenceDoublon = False
                         For CompteurCh1 = LBound(Ch1) To UBound(Ch1)
                          If Ch1(CompteurCh1) = VarFile(J) Then PresenceDoublon = True
                         Next CompteurCh1
     
                         If PresenceDoublon = False Then
                            Select Case Cpt
                                Case 0
                                    Ch1(Cpt) = VarFile(J)
                                    MsgBox ("Ch1 : " & Ch1(Cpt))
                                    Cpt = Cpt + 1
                                Case Else
                                    ReDim Preserve Ch1(Cpt)
                                    Ch1(Cpt) = VarFile(J)
                                    MsgBox ("Ch1 : " & Ch1(Cpt))
                                Cpt = Cpt + 1
                             ' Debug.Print Ch1(Cpt)
                            End Select
     
                        End If
                End If
            Next K
        Next J
    End Sub
    Cordialement.

Discussions similaires

  1. [XL-2007] comparer deux tableaux avec VBA
    Par anstech dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/01/2014, 14h36
  2. Comparer deux tableaux de String
    Par ziad.shady dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/09/2008, 09h44
  3. comparer deux chaines ansistrin ou string .
    Par supersoft5 dans le forum C++Builder
    Réponses: 6
    Dernier message: 24/05/2007, 14h02
  4. comparer deux tableaux
    Par djibril dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 15h26

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