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
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
A voir également:
- Comparaison de tableau
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Tableau coefficient marge ✓ - Forum Excel
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 751
16 mars 2015 à 11:00
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 :
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
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
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
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
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
16 mars 2015 à 15:01
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...
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
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
16 mars 2015 à 15:31
Un tout grand merci, je vais tester, je pense que ça ira
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
16 mars 2015 à 16:26
Génial et super rapide, un tout grand merci !!!!