Comparaison de tableau
Résolu
reno421
-
reno421 Messages postés 47 Statut Membre -
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.
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.
A voir également:
- Comparaison de tableau
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Comparaison million milliard - Accueil - Technologies
- Tableau croisé dynamique - Guide
2 réponses
Bonjour,
Un exemple est parfois plus parlant.
Regarde ce test et ses résultats dans la fenêtre d'exécution :
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
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
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
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...
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