Comparer deux tableau multidimensionnel

Résolu
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007 - 24 avril 2006 à 16:38
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007 - 28 avril 2006 à 17:39
Bonjour,

Je suis en train de développer une petit application en VB.NET (avec Microsoft Visual Basic 2005 Express Edition) , et un "petit" problème ce pose à moi.

En effet, j'ai deux tableau multidimensionnel, exemple :
Le rouge, le bleu, et le orange représente chacun une ligne de ces 2 tableaux.

Je souhaiterai comparer le premier avec le deuxième, pour voir quelle sont les nouvelles lignes.

En gros, le tableau 2 est le tableau 1 + d'autres lignes, je cherche justement ces autres lignes.

J'ai beau essayer je n'y arrive pas.

Merci à mon sauveur

18 réponses

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
25 avril 2006 à 10:13
Bon alors je n'ai pas fait de test mais ca devrais le faire

'Le principe est de comparer toutes les ligne de test1 à test2 (temps que on ne l'a pas trouver):
'-----------------------------------------
Sub test()
Dim Test1(15, 15) As Long
Dim Test2(20, 15) As String 'Nombre de colone identique!!!
Dim Flag, Flag2 As Boolean
Dim CptLigne1, CptLigne2, CptColone As Long
Do While CptLigne1 <= UBound(Test1, 1) 'Scan de toute les ligne de Test1
Flag2 = True
'Scan de toute les ligne de Test2 si ligne de test1 non trouver dans test2
Do While CptLigne2 <= UBound(Test2, 1) And Flag2
'Passe le flag à vrais (test la differance et non l'égalité)
Flag = True
'Scan de toute les colones temps que les donnée sont identique
Do While CptColone <= UBound(Test1, 2) And Flag
'Si les donnée sont differante stop la boucle (ça ne sert plus à rien!)
If CStr(Test1(CptLigne1, CptColone)) <> CStr(Test2(CptLigne2, CptColone)) Then
'Flag à faux
Flag = False
End If
CptColone = CptColone + 1
Loop
If Flag Then
'Ligne de test1 trouver dans ligne2 flag2 = faux (ligne unique)
Flag2 = False
End If
CptColone = 0
CptLigne2 = CptLigne2 + 1
Loop
If Flag2 Then
'Ligne cptligne1 de test1 est unique
Else
'Ligne cptligne1 de test1 trouver dans test2 à la ligne cptligne2 - 1
End If
CptLigne2 = 0
CptLigne1 = CptLigne1 + 1
Loop
End Sub
'--------------

D'oh! Nuts!
Mmmmm...
DONUTS
3
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
24 avril 2006 à 17:15
Si j'ai bien compris tu veut les lignes du tableau 2 qui n'apparaise pas dans le tableau 1?
Dans ce cas je testerais si la ligne 1 du tableau 2 apparait dans le tableau 1?
'-----------------------------------------
Sub test()
Dim Flag As Boolean
Dim Cpt, Cpt2 As Long
Do While Cpt < UBound(tableau2) 'San de tout les ligne de tab2
Flag = False 'init du flag
Do While Cpt2 < UBound(tableau1) And Flag = False 'scan de tout tab1 temps que ligne cpt de tableau 2 non détect If tableau2(Cpt) tableau1(Cpt2) Then 'Si donnée identique (donnée tab2 donnée tab1)
Flag = True 'Marque que les donnée on été trouver
End If
Loop
If Flag = False Then 'Si les donnée n'on pas été detect (donc donée dans tab2 pas dans tab1)
'Note le numéro de la ligne ou recup donnée
End If
Loop
End Sub
'-------------------------------

Voila (désol pour l'orthographe)

D'oh! Nuts!
Mmmmm...
DONUTS
0
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007
24 avril 2006 à 17:41
Merci d'avoir répondu si vite. Mais cela ne fonctionne pas.

Mes tableaux sont de la forme :
a(0,4) et b(0,4)

ainsi la ligne :If b(Cpt) <gras>a(Cpt2) Then 'Si donnée identique (donnée tab2 donnée tab1)</gras>
génère une erreur, car cela devrait être de la forme :If b(x,x) <gras>a(x,x) Then 'Si donnée identique (donnée tab2 donnée tab1)</gras>
je n'y arrive pas
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
25 avril 2006 à 09:47
Je te prépare un petit code vite fait.
Répond vite si une des répoces ces questions est NON!!!
Tes tableau sont des variables (pas tableau Excel ou autre)
Tes tableau on donc 2 dimension?
Toute les donées de toute les "colones" doive être identique (si une donnée differante alors ligne differante)?

D'oh! Nuts!
Mmmmm...
DONUTS
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
25 avril 2006 à 09:50
Ha oui les deux tableau on bien sur le même nombre de "colone"?

D'oh! Nuts!
Mmmmm...
DONUTS
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
25 avril 2006 à 10:16
La fonction "cstr()" me sert à convertire les valeur des tableau en chaine de carac (cas peut eviter des problémes mais si les donnée son numeric utilise plutot "cdec()" car même si "1" et "1,0" pour toi et mois c pareille ce ne sont pas les même chaine de carac!!!)

D'oh! Nuts!
Mmmmm...
DONUTS
0
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007
25 avril 2006 à 12:09
Tes tableau sont des variables (pas tableau Excel ou autre) => oui, elles sont toutes de type "string"
Tes tableau on donc 2 dimension? => oui
Toute les donées de toute les "colones" doive être identique (si une donnée differante alors ligne differante)? => eh bien par exemple a(0,0) peut être égal à b(5,0).

Je suis en train de tester le script.

http://fg.logiciel.free.fr
0
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007
25 avril 2006 à 14:38
Voici ce que cela donne comme code :
Dim Flag, Flag2 As Boolean
Dim CptLigne1, CptLigne2, CptColone As Long
Do While CptLigne1 <= UBound(b, 1) 'Scan de toute les ligne de Test1
Flag2 = True
'Scan de toute les ligne de Test2 si ligne de test1 non trouver dans test2
Do While CptLigne2 <= UBound(a, 1) And Flag2
'Passe le flag à vrais (test la differance et non l'égalité)
Flag = True
'Scan de toute les colones temps que les donnée sont identique
Do While CptColone <= UBound(b, 2) And Flag
'Si les donnée sont differante stop la boucle (ça ne sert plus à rien!)
If CStr(b(CptLigne1, CptColone)) <> CStr(a(CptLigne2, CptColone)) Then
'Flag à faux
Flag = False
End If
CptColone = CptColone + 1
Loop
If Flag Then
'Ligne de test1 trouver dans ligne2 flag2 = faux (ligne unique)

Flag2 = False
End If
CptColone = 0
CptLigne2 = CptLigne2 + 1
Loop
If Flag2 Then
'Ligne cptligne1 de test1 est unique
MsgBox("Nouvelle Item" & b(CptLigne1, 0))
Console.WriteLine("Nouvelle Item" & b(CptLigne1, 0))
Else
'Ligne cptligne1 de test1 trouver dans test2 à la ligne cptligne2 - 1
End If
CptLigne2 = 0
CptLigne1 = CptLigne1 + 1
Loop

Le problème est que cela ne m'affiche rien. Je récapitule :
j'ai un tableau "a" et un tableau "b".
Le tableau "b" est le tableau "a" + certaines autres lignes.
Je cherche les lignes du tableau "b" non présentent dans le tableau "a".

Je pense qu'on n'est prêt de la solution, du moins j'espère .

http://fg.logiciel.free.fr
http://longhornrc.free.fr
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
25 avril 2006 à 15:54
Moi je n'ai pas de probléme avec le code que tu à mis (en VBA sous Excel office 2003)
Il semble juste que mes definition de variable soit à noter de cette façon et non comme je l'avais noter plus haut.

Dim Flag As Boolean, Flag2 As Boolean
Dim CptLigne1 As Long, CptLigne2 As Long, CptColone As Long

A part ca tout fonctione chez moi (la procédure m'affiche bien le "msgbox")!

D'oh! Nuts!
Mmmmm...
DONUTS
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
25 avril 2006 à 15:56
PS: Désol pour le temps à repondre j'atais en réunion

D'oh! Nuts!
Mmmmm...
DONUTS
0
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007
25 avril 2006 à 18:17
OuaiP maintenant sa fonctionne , grand merci à toi .
0
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007
28 avril 2006 à 15:30
J'ai intégrer le script mais il y a de nouveau une erreur, voici le code :
Dim Flag As Boolean, Flag2 As Boolean
        Dim CptLigne1 As Long, CptLigne2 As Long, CptColone As Long
        Do While CptLigne1 <= UBound(b, 1) 'Scan de toute les ligne de Test1
            Flag2 = True
            'Scan de toute les ligne de Test2 si ligne de test1 non trouver dans test2
            Do While CptLigne2 <= UBound(a, 1) And Flag2
                'Passe le flag à vrais (test la differance et non l'égalité)
                Flag = True
                'Scan de toute les colones temps que les donnée sont identique
                Do While CptColone <= UBound(b, 2) And Flag
                    'Si les donnée sont differante stop la boucle (ça ne sert plus à rien!)
                    If CStr(b(CptLigne1, CptColone)) <> CStr(a(CptLigne2, CptColone)) Then
                        'Flag à faux
                        Flag = False
                    End If
                    CptColone = CptColone + 1
                Loop
                If Flag Then
                    'Ligne de test1 trouver dans ligne2 flag2 = faux (ligne unique)
                    Flag2 = False
                End If
                CptColone = 0
                CptLigne2 = CptLigne2 + 1
            Loop

            If Flag2 Then
                'Ligne cptligne1 de test1 est unique
                'ICI !!! Ajout de la nouvelle ligne au tableau "a"
                        nbma = (a.Length / 5)
                        ReDim a(nbma, 4)
                        a(nbma, 0) = b(CptLigne1, 0)
                        a(nbma, 1) = b(CptLigne1, 1)
                        a(nbma, 2) = b(CptLigne1, 2)
                        a(nbma, 3) = b(CptLigne1, 3)
                        a(nbma, 4) = b(CptLigne1, 4)
                        Console.WriteLine("Nouvelle Item (" & nbma & " (" & CptLigne1 & ")) : " & a(nbma, 0) & " : " & a(nbma, 1))

                'Else
                'Ligne cptligne1 de test1 trouver dans test2 à la ligne cptligne2 - 1
            End If
            CptLigne2 = 0
            CptLigne1 = CptLigne1 + 1
        Loop

En gros, quand de nouveau item sont trouvés je les mets dans le tableau "a", mais le problème est qu'au début cela fonctionne, mais lors de la rééxécution de cette fonction, se sont tous les items qui sont détectés comme nouveau.
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
28 avril 2006 à 15:49
Le probléme c'est "ReDim a(nbma, 4)" ou tu pert les valeurs contenu dans a il faut que tu fasse un "ReDim Preserve a(nbma, 4)"
Enfain je croi

D'oh! Nuts!
Mmmmm...
 DONUTS
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
28 avril 2006 à 15:57
he a.length te sert à cois???? Si c pour recup la taille de ton tableau a c plus simple à mon avie de faire ubound(tableau,dimention) qui te renvoie la réferance à la dernierre "donnée" de ton tableau
donc si a est de la forme (14,3)
ubound(a,1) renvoie 14
ubound(a,2) renvoie 3

D'oh! Nuts!
Mmmmm...
 DONUTS
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
28 avril 2006 à 15:58
il existe aussi lbound à propo

D'oh! Nuts!
Mmmmm...
 DONUTS
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
28 avril 2006 à 16:27
Heeeee, alors c bon car je suis en WeekEnd dans 15 minutes.

D'oh! Nuts!
Mmmmm...
 DONUTS
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
28 avril 2006 à 16:47
Bon WeekEnd et à mardi (enfain si tu poste qqchose)

Se reposerc important
0
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007
28 avril 2006 à 17:39
Lol, ben en fait, je viens juste d'ouvrir mon client mail et de voir tes postes.

Voici le code que j'ai fait et qui fonctionne parfaitement :
Do While CptLigne1 <= UBound(b, 1) 'Scan de toute les ligne de Test1
            Flag2 = True
            'Scan de toute les ligne de Test2 si ligne de test1 non trouver dans test2
            Do While CptLigne2 <= UBound(a, 1) And Flag2
                'Passe le flag à vrais (test la differance et non l'égalité)
                Flag = True
                'Scan de toute les colones temps que les donnée sont identique
                Do While CptColone <= UBound(b, 2) And Flag
                    'Si les donnée sont differante stop la boucle (ça ne sert plus à rien!)
                    If CStr(b(CptLigne1, CptColone)) <> CStr(a(CptLigne2, CptColone)) Then
                        'Flag à faux
                        Flag = False
                    End If
                    CptColone = CptColone + 1
                Loop
                If Flag Then
                    'Ligne de test1 trouver dans ligne2 flag2 = faux (ligne unique)
                    Flag2 = False
                End If
                CptColone = 0
                CptLigne2 = CptLigne2 + 1
            Loop

            If Flag2 Then
                'Ligne cptligne1 de test1 est unique
                'ICI !!! Ajout de la nouvelle ligne au tableau "a"
                nbma = UBound(a, 1) + 1

        ReDim c(nbma, 4)
        For i = 0 To UBound(a, 1)
            For p = 0 To 4
                c(i, p) = a(i, p)
            Next p
        Next i

        c(nbma, 0) = b(CptLigne1, 0).ToString()
        c(nbma, 1) = b(CptLigne1, 1).ToString()
        c(nbma, 2) = b(CptLigne1, 2).ToString()
        c(nbma, 3) = b(CptLigne1, 3).ToString()
        c(nbma, 4) = b(CptLigne1, 4).ToString()
        ReDim a(nbma, 4)
        a = c.Clone
                'Else
                'Ligne cptligne1 de test1 trouver dans test2 à la ligne cptligne2 - 1
            End If
            CptLigne2 = 0
            CptLigne1 = CptLigne1 + 1
        Loop

En me baladant sur le site de M$ j'ai trouvé la propriété Ubound que je me suis empresser d'utiliser
0
Rejoignez-nous