Comparer deux tableau multidimensionnel

Résolu
Signaler
Messages postés
370
Date d'inscription
dimanche 28 mars 2004
Statut
Membre
Dernière intervention
13 avril 2007
-
Messages postés
370
Date d'inscription
dimanche 28 mars 2004
Statut
Membre
Dernière intervention
13 avril 2007
-
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

Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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
Messages postés
370
Date d'inscription
dimanche 28 mars 2004
Statut
Membre
Dernière intervention
13 avril 2007

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
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Ha oui les deux tableau on bien sur le même nombre de "colone"?

D'oh! Nuts!
Mmmmm...
DONUTS
0
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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
Messages postés
370
Date d'inscription
dimanche 28 mars 2004
Statut
Membre
Dernière intervention
13 avril 2007

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
Messages postés
370
Date d'inscription
dimanche 28 mars 2004
Statut
Membre
Dernière intervention
13 avril 2007

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
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
PS: Désol pour le temps à repondre j'atais en réunion

D'oh! Nuts!
Mmmmm...
DONUTS
0
Messages postés
370
Date d'inscription
dimanche 28 mars 2004
Statut
Membre
Dernière intervention
13 avril 2007

OuaiP maintenant sa fonctionne , grand merci à toi .
0
Messages postés
370
Date d'inscription
dimanche 28 mars 2004
Statut
Membre
Dernière intervention
13 avril 2007

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
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
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
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
il existe aussi lbound à propo

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

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

Se reposerc important
0
Messages postés
370
Date d'inscription
dimanche 28 mars 2004
Statut
Membre
Dernière intervention
13 avril 2007

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