fg85
Messages postés370Date d'inscriptiondimanche 28 mars 2004StatutMembreDernière intervention13 avril 2007
-
24 avril 2006 à 16:38
fg85
Messages postés370Date d'inscriptiondimanche 28 mars 2004StatutMembreDernière intervention13 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.
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 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
'--------------
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 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
'-------------------------------
fg85
Messages postés370Date d'inscriptiondimanche 28 mars 2004StatutMembreDernière intervention13 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
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 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!!!)
fg85
Messages postés370Date d'inscriptiondimanche 28 mars 2004StatutMembreDernière intervention13 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).
fg85
Messages postés370Date d'inscriptiondimanche 28 mars 2004StatutMembreDernière intervention13 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 .
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 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")!
fg85
Messages postés370Date d'inscriptiondimanche 28 mars 2004StatutMembreDernière intervention13 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.
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 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
fg85
Messages postés370Date d'inscriptiondimanche 28 mars 2004StatutMembreDernière intervention13 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