Comparaison de tableau

Résolu
reno421 -  
reno421 Messages postés 47 Statut Membre -
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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    

    0
  2. reno421 Messages postés 47 Statut Membre
     
    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
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
      0
    2. reno421 Messages postés 47 Statut Membre
       
      Un tout grand merci, je vais tester, je pense que ça ira
      0
    3. reno421 Messages postés 47 Statut Membre
       
      Génial et super rapide, un tout grand merci !!!!
      0