Comparaison de tableau

Résolu
Bonjour à tous,

Je sollicite à nouveau votre précieuse aide.

Je dois comparer 2 tableaux afin de déterminer si les données entrées l'ont été correctement.

Tab1 reprend des zones géographiques
Tab2 reprend des sites en relation avec ces zones

Tab1 : Zone 1, reponsable
Tab1 : Zone 2, responsable
...
Tab2 : Zone1, site 1
Tab2 : Zone 1, site 1 (tableau à 2 dimensions !!!)
Tab2 : Zone2, site4
Tab2 : Zone2, site16

Mon but est de vérifier si les zones du tab1 sont au moins reprises une fois dans le tableau 2. Mais je dois également vérifier que dans le tableau 2, les zones qui y sont reprises existent dans le tableau 1. Si ce n'est pas le cas, je souhaite afficher un message d'erreur indiquant la ligne concernée, ceci pour correction avant d'exécuter une macro.

J'espère avoir été assez clair et vous remercie pour votre aide.

2 réponses

  1. Modérateur
    Bonjour,

    Un exemple est parfois plus parlant.
    Regarde ce test et ses résultats dans la fenêtre d'exécution :
    Sub test()
    Dim Tb(), i As Long, ind_1 As Long
    Dim j As Long, ind_2 As Long
    Dim MaValeur As String
    Dim t As Single
    
    'tb 1 dimension :
    ReDim Preserve Tb(1000)
    For i = 0 To 999
        Tb(i) = "Valeur " & i
    Next
    MaValeur = "Valeur 995"
    Debug.Print "------- Tableaux à 1 dimension -------"
    Debug.Print "EstDans : " & EstDans(MaValeur, Tb)
    Debug.Print "IsIn : " & IsIn(MaValeur, Tb)
    Debug.Print "BoucleSurTabl : " & BoucleSurTabl(MaValeur, Tb, ind_1) & " à l'indice " & ind_1
    
    Erase Tb
    
    'tb 2 dimensions :
    ReDim Preserve Tb(1 To 1000, 1 To 100)
    For i = 1 To 1000
        For j = 1 To 100
            Tb(i, j) = "Valeur " & i & "--" & j
        Next j
    Next i
    MaValeur = "Valeur 995--99"
    Debug.Print ""
    Debug.Print "---Restart here and Now.................."
    Debug.Print ""
    Debug.Print "------- Tableaux à 2 dimensions -------"
    t = Timer
    Debug.Print "----------------------------------------" & vbCrLf & _
    "EstDans," & vbCrLf & _
    "        résultat : " & EstDans(MaValeur, Tb) & ", en : " & Timer - t & " sec."
    t = Timer
    Debug.Print "----------------------------------------" & vbCrLf & _
    "BoucleSurTabl," & vbCrLf & _
    "        résultat : " & BoucleSurTabl(MaValeur, Tb, ind_1, ind_2) & ", en : " & Timer - t & " sec." & vbCrLf & _
    "        En prime les indices : " & ind_1 & ", " & ind_2
    End Sub
    
    Function IsIn(mot As String, Tabl) As Boolean
    If UBound(Filter(Tabl, mot, True, 1)) >= 0 Then
        IsIn = True
    End If
    End Function
    
    
    Function EstDans(mot As String, Tabl) As Boolean
    Dim Dimension As Byte, j As Integer
    
    On Error Resume Next
    If IsError(UBound(Tabl, 2)) Then Dimension = 1 Else Dimension = 2
    On Error GoTo 0
    
    Select Case Dimension
        Case 1
            On Error Resume Next
            EstDans = Application.Match(mot, Tabl, 0)
            On Error GoTo 0
        Case 2
            For j = 1 To UBound(Tabl, 2)
                On Error Resume Next
                EstDans = Application.Match(mot, Application.Index(Tabl, , j), 0)
                On Error GoTo 0
                If EstDans = True Then Exit For
            Next
    End Select
    End Function
    
    Function BoucleSurTabl(mot As String, Tb, Optional Indice_1 As Long, Optional Indice_2 As Long) As Boolean
    Dim Dimension As Byte, i As Long, j As Long
    
    BoucleSurTabl = False
    
    On Error Resume Next
    If IsError(UBound(Tb, 2)) Then Dimension = 1 Else Dimension = 2
    On Error GoTo 0
    
    Select Case Dimension
        Case 1
            For j = LBound(Tb) To UBound(Tb)
                If Tb(j) = mot Then
                    BoucleSurTabl = True
                    Indice_1 = j
                    Exit Function
                End If
            Next
        Case 2
            For i = LBound(Tb, 1) To UBound(Tb, 1)
                For j = LBound(Tb, 2) To UBound(Tb, 2)
                    If Tb(i, j) = mot Then
                        BoucleSurTabl = True
                        Indice_1 = i
                        Indice_2 = j
                        Exit Function
                    End If
                Next j
            Next i
    End Select
    End Function
    

    1. Ouie ouie, ouie, merci pour ton code mais j'avoue que j'ai beaucoup de mal a le suivre. Voici un exemple plus parlant, je l'espère.

      Je l'ai simplifié au max.

      Voici mon premier tableau :
      Zone Nom site
      Paris Site B
      Paris Site C
      Paris Site D
      Bordeaux Site J
      Bordeaux Site K
      Lille Site E
      Caen Caen
      Nice Site F
      Voici mon seccond tableau
      Zone Contact principal
      Paris Bernard
      Lille Paul
      Caen Jean
      Bordeaux Albert
      Montellimar Vincent
      L'objet de ma vérification est de savoir schaque "zone" du tableau 1 correspond à une "zone" du tableau 2 puis, de vérifier si chaque zone définie dans le tableau 2 correspond à au moins une zone du tableau 1.

      Dans cet exemple, il y a 2 erreurs, voici le genre de message que j'aimerais qui apparaissent :

      La zone "Nice" du tab1 n'existe pas dans le tab2
      La zone "Montellimar" du tab2 n'resiste pas dan sle tab1

      D'avance merci pour votre aide
      1. Modérateur
        Je t'ai tout donné dans l'exemple, ne te restais qu'à adapter, en simplifiant...

        1- boucle sur le tableau 1
        2- test si l'élément appartient au tableau 2
        ==> si oui, élément suivant (rien à faire)
        ==> si non, message
        3- boucle sur le tableau 2
        4- test si l'élément appartient au tableau 1
        ==> si oui, élément suivant (rien à faire)
        ==> si non, message

        Donc deux fonctions :
        Une procédure principale ou tu met tes boucles et une fonction qui test l'appartenance.
        Donc :
        précision : j'ai écris cette macro sur le forum sans la tester, il peut y avoir des boulettes...
        Sub Main()
        Dim Tb_1(), Tb_2(), i As Long
        'remplissage des Tb_1 & 2
           'ICI TON CODE
        'boucles
        For i = LBound(Tb_1, 1) To UBound(Tb_1, 1)
            If EstDedans(Tb_1(i, 1), Tb_2) = False Then MsgBox Tb_1(i, 1) & " n'est pas dans Tb_2"
        Next i
        'IDEM POUR TB_2, je ne te le fait pas hein ;-)
        End Sub
        
        Function EstDedans(mot As String, Tb) As Boolean
        Dim j As Long
        For j = LBound(Tb, 1) To UBound(Tb, 1)
            If Tb(j, 1) = mot Then EstDedans = True: Exit Function
        Next
        End Function
      2. Un tout grand merci, je vais tester, je pense que ça ira
      3. Génial et super rapide, un tout grand merci !!!!