Comparaison de tableau

Résolu/Fermé
reno421 - 16 mars 2015 à 09:39
reno421 Messages postés 41 Date d'inscription vendredi 30 janvier 2015 Statut Membre Dernière intervention 16 septembre 2015 - 16 mars 2015 à 16:26
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

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
16 mars 2015 à 11:00
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
reno421 Messages postés 41 Date d'inscription vendredi 30 janvier 2015 Statut Membre Dernière intervention 16 septembre 2015
16 mars 2015 à 14:44
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
16 mars 2015 à 15:01
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
reno421 Messages postés 41 Date d'inscription vendredi 30 janvier 2015 Statut Membre Dernière intervention 16 septembre 2015
16 mars 2015 à 15:31
Un tout grand merci, je vais tester, je pense que ça ira
0
reno421 Messages postés 41 Date d'inscription vendredi 30 janvier 2015 Statut Membre Dernière intervention 16 septembre 2015
16 mars 2015 à 16:26
Génial et super rapide, un tout grand merci !!!!
0