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 :

comment imbriquer 2 arrays (dont 1 avec des valeurs à "spliter") et en les comparant [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2021
    Messages : 5
    Par défaut comment imbriquer 2 arrays (dont 1 avec des valeurs à "spliter") et en les comparant
    bonjour à tous,
    je me classe plutôt dans les débutantes en codage VBA et ceci est mon premier post alors j'espère que vous serez indulgents si je fais une bêtise malgré mes efforts pour l'éviter.

    j'ai cherché dans le site mais n'ai pas su trouver de post similaire alors je vous expose mon pb ( si cela existe déjà je vous présente mes excuses et j'espère que vous m'aiderez à trouver ce post).

    je dois comparer le contenu d'une colonne ayant plusieurs centaines de lignes, avec une autre colonne. Cà se complique quand certaines cellules de la première colonne contiennent des valeurs multiples séparées par des "/" alors que dans la 2ème colonne ces valeurs sont uniques.
    je dois, dans une 3ème colonne rapporter "OK" si les toutes les valeurs contenues dans chaque cellule de la 1ère colonne existent dans la 2ème colonne.

    en cherchant dans tous les posts qui me semblaient proches, j'ai pu rédiger un début de code que je n'arrive pas à faire fonctionner et je ne comprends pas ou j'ai pu faire une erreur car en séparant chaque étape de ce même code cela fonctionne (pour le moment je n'ai pas traité la 3ème colonne ). AU SECOURS SVP!!! j'ai l'impression que je passe à coté d'une évidence mais impossible de repérer le pb....

    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
    Option Explicit
    Sub CompareBoucleLignesColonnesArray()
     
    Dim ValCellule As String
    Dim Vligne As String
    Dim VColonne As String
    'Dim arrSplitText() As Variant 'valeur de ValCellule splitée
    Dim arrSplitText() As Variant 'j'ai aussi essayé avec ça puisqu'il s'agit de ma valeur après split
     
    Dim ArrayDonnees() As Variant
    Dim ArrayDonneesTarget() As Variant
    Dim DerniereLigne As Long
    Dim DerniereColonne As Long 'là pas utilisé car pour le moment on fait juste la colonne 9
    Dim Onglet As Worksheet
     
    'identifie l'onglet
    Set Onglet = Worksheets(1) '"ecs"
     
    'trouve limites du tableau
    DerniereLigne = Onglet.Cells(Rows.Count, 1).End(xlUp).Row
    'DerniereColonne = Onglet.Cells(1, Columns.Count).End(xlToLeft).Column 'pas utilisé pour le moment
     
    'enregistrer le tableau dans l'array des valeurs à comparer
    ArrayDonnees = Onglet.Range(Onglet.Cells(1, 9), Onglet.Cells(DerniereLigne, 9))
     
    'enregistrer le tableau dans l'array des valeurs "témoin"
    ArrayDonneesTarget = Onglet.Range(Onglet.Cells(1, 4), Onglet.Cells(DerniereLigne, 4))
     
     
    'boucle sur les lignes de la 1ère colonne pour récupérer la valeur à comparer 
    For i = LBound(ArrayDonnees) + 1 To UBound(ArrayDonnees)
        Vligne = ArrayDonnees(i, 1)[ATTACH]609596[/ATTACH]
        MsgBox Vligne 'pour vérifier ce que je lis
        arrSplitText = Split(Vligne, "/") 'ça bloque apparemment là est ce un pb de déclaration du tableau?  message d'erreur > erreur d'exécution 13 incompatibilité de type
     ,
    'boucle sur les lignes de la 2ème colonne pour vérifier si la valeur à comparer existe 
        For j = LBound(ArrayDonneesTarget, 1) To UBound(ArrayDonneesTarget, 1)
            If InStr(1, ArrayDonneesTarget(j), arrSplitText, vbTextCompare) > 0 Then
                VColonne = ArrayDonneesTarget(j)
                MsgBox VColonne
                Else
                 MsgBox "non OK"
                Exit For
            End If
        Next j
    Next i
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    Bonjour,

    Pas besoin de code VBA pour faire cela, la formule suivante suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ESTERR(CHERCHE("/" & D3 & "/";"/" & I3 & "/"));"NOK";"OK")
    Le principe est d'ajouter les marqueurs / avant et après les textes pour être certain que l'un (D3) se trouve dans l'autre (I3).

    Cordialement.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2021
    Messages : 5
    Par défaut
    Bonjour Eric, merci pour ta réponse rapide.
    la formule que tu me proposes est assez proche de celle que j'utilisais jusqu'à présent à ceci près que :
    - le sens de comparaison est inversé, se sont chacune des valeurs de I3 qui doivent se retrouver dans l'une des cellules de la colonne D.
    - à la place de l'adresse D3 j'utilisais un "champ nommé: ChDA" car la colonne D contient beaucoup plus de lignes remplies que les autres colonnes de mon onglet. Le pb c'est que désormais la colonne "D" a été déplacée dans un autre fichier se trouvant dans un autre répertoire. Ma formule ne fonctionne plus (je précise que j'ai modifié ChDA pour qu'il aille pointer sur le bon classeur). C'est ce qui m'a décidé à passer (plutôt à essayer de passer) par du VBA. Bien sûr s'il existe une possibilité d'éviter le VBA , c'est encore mieux , pourquoi faire compliqué quand.....

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    Bonjour,

    Effectivement, s'il faut faire la recherche dans l'autre sens, cela me parait plus simple de le faire à l'aide d'une routine. Une possibilité:
    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
    Sub EstOk()
        Dim rDD As Range, r As Range, Arr As Variant, ok As Boolean
        Dim kR As Long, k As Long
        ThisWorkbook.Worksheets("ecs").Select
        Set rDD = Range("rBase")                            '--- plage valeurs base
        For kR = 2 To Cells(Rows.Count, 1).End(xlUp).Row    '--- parcourir lignes
            Arr = Split(Range("I" & kR), "/")
            ok = True
            For k = 0 To UBound(Arr)
                Set r = rDD.Find(What:=Arr(k))
                If r Is Nothing Then
                    ok = False
                    Exit For
                End If
            Next k
            Range("J" & kR) = IIf(ok, "OK", "NOK")
        Next kR
        Set r = Nothing
        Set rDD = Nothing
    End Sub
    Cordialement.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2021
    Messages : 5
    Par défaut
    Super ca fonctionne plus que bien,
    me reste plus qu'à trouver moyen de ne pas traiter les cellules vides et ce sera parfait.

    Je te remercie sincèrement pour ton aide précieuse.
    ton code, que j'ai décortiqué pour essayer de comprendre et donc d'apprendre m'a également permis de comprendre mon erreur .
    MERCI !!!!

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    Pour traiter le cas de la cellule vide, il suffit de le tester avant de commencer la recherche (ligne 7):
    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
    Sub EstOk()
        Dim rDD As Range, r As Range, Arr As Variant, ok As Boolean
        Dim kR As Long, k As Long
        ThisWorkbook.Worksheets("ecs").Select
        Set rDD = Range("rBase")                            '--- plage valeurs base
        For kR = 2 To Cells(Rows.Count, 1).End(xlUp).Row    '--- parcourir lignes
            If Range("I" & kR) = "" Then
                Range("J" & kR) = "NOK"
            Else
                Arr = Split(Range("I" & kR), "/")
                ok = True
                For k = 0 To UBound(Arr)
                    Set r = rDD.Find(What:=Arr(k))
                    If r Is Nothing Then
                        ok = False
                        Exit For
                    End If
                Next k
                Range("J" & kR) = IIf(ok, "OK", "NOK")
            End If
        Next kR
        Set r = Nothing
        Set rDD = Nothing
    End Sub
    Bonne continuation.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/04/2013, 17h34
  2. Réponses: 2
    Dernier message: 03/04/2013, 12h04
  3. Réponses: 2
    Dernier message: 06/04/2007, 11h30
  4. Réponses: 7
    Dernier message: 01/04/2007, 12h30
  5. Réponses: 5
    Dernier message: 17/07/2006, 18h34

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