Comparer deux tableau multidimensionnel [Résolu]

fg85 370 Messages postés dimanche 28 mars 2004Date d'inscription 13 avril 2007 Dernière intervention - 24 avril 2006 à 16:38 - Dernière réponse : fg85 370 Messages postés dimanche 28 mars 2004Date d'inscription 13 avril 2007 Dernière intervention
- 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
Afficher la suite 

18 réponses

Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 25 avril 2006 à 10:13
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 24 avril 2006 à 17:15
0
Utile
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
fg85 370 Messages postés dimanche 28 mars 2004Date d'inscription 13 avril 2007 Dernière intervention - 24 avril 2006 à 17:41
0
Utile
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
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 25 avril 2006 à 09:47
0
Utile
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
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 25 avril 2006 à 09:50
0
Utile
Ha oui les deux tableau on bien sur le même nombre de "colone"?

D'oh! Nuts!
Mmmmm...
DONUTS
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 25 avril 2006 à 10:16
0
Utile
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
fg85 370 Messages postés dimanche 28 mars 2004Date d'inscription 13 avril 2007 Dernière intervention - 25 avril 2006 à 12:09
0
Utile
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
fg85 370 Messages postés dimanche 28 mars 2004Date d'inscription 13 avril 2007 Dernière intervention - 25 avril 2006 à 14:38
0
Utile
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
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 25 avril 2006 à 15:54
0
Utile
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
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 25 avril 2006 à 15:56
0
Utile
PS: Désol pour le temps à repondre j'atais en réunion

D'oh! Nuts!
Mmmmm...
DONUTS
fg85 370 Messages postés dimanche 28 mars 2004Date d'inscription 13 avril 2007 Dernière intervention - 25 avril 2006 à 18:17
0
Utile
OuaiP maintenant sa fonctionne , grand merci à toi .
fg85 370 Messages postés dimanche 28 mars 2004Date d'inscription 13 avril 2007 Dernière intervention - 28 avril 2006 à 15:30
0
Utile
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.
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 28 avril 2006 à 15:49
0
Utile
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
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 28 avril 2006 à 15:57
0
Utile
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
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 28 avril 2006 à 15:58
0
Utile
il existe aussi lbound à propo

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

D'oh! Nuts!
Mmmmm...
 DONUTS
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 28 avril 2006 à 16:47
0
Utile
Bon WeekEnd et à mardi (enfain si tu poste qqchose)

Se reposerc important
fg85 370 Messages postés dimanche 28 mars 2004Date d'inscription 13 avril 2007 Dernière intervention - 28 avril 2006 à 17:39
0
Utile
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.