Tiatia63
Messages postés60Date d'inscriptionmardi 12 juin 2007StatutMembreDernière intervention23 décembre 2010
-
12 juin 2007 à 16:20
Tiatia63
Messages postés60Date d'inscriptionmardi 12 juin 2007StatutMembreDernière intervention23 décembre 2010
-
18 juin 2007 à 14:22
Bonjour,
J’aurai besoin d’aide concernant la fonction count de visual basic.
Je voudrais faire une boucle et compter de 1 à ma dernière valeur et supprimer certaines valeurs. Comme le nombre de valeur change dans la boucle, je voudrais recompter à chaque fois pour pouvoir m’arrêter précisément à la dernière de mes données.
Je ne sais pas si j’ai été très claire… Mais j’espère que vous pourrai m’aider.
Merci par avance.
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Tiatia63
Messages postés60Date d'inscriptionmardi 12 juin 2007StatutMembreDernière intervention23 décembre 2010 12 juin 2007 à 16:39
Bon je vais essayer de la refaire plus clair.
En fait, j'ai fait un programme qui me choisit parmit un tableau des valeurs idéales selon les critères que j'ai posé. J'arrive à deux listes de valeurs car j'ai fait deux critères de choix séparement. Je peux obtenir dans ces deux listes 2 fois là meme valeur. Je voudrais donc comparer ces deux listes dont je ne connais pas la longueur et supprimer dans l'une d'elle les valeurs qui apparaissent déjà dans la première liste.
Oué je sais pas si c'est compréhensible! Mais bon je fais ce que je peux.
Merci pour les réponses super rapides!
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 12 juin 2007 à 16:57
La propriété ListCount d'une listbox est ce que tu cherches.
D'aucuns viendront te parler d'une boucle sur la liste la plus petite pour y relever ses articles et vérifier leur existence dans l'autre liste , à l'aide d'une autre boucle (sur l'autre liste).
Bien que je ne sois pas d'accord avec cette 2ème boucle, il me semble que c'est le chemin qu'à ton niveau apparent, tu devras prendre.
Vous n’avez pas trouvé la réponse que vous recherchez ?
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 12 juin 2007 à 17:01
Bonjour,
Plutôt que de gérer un compteur pourquoi ne pas faire tantque une donnée existe dans la cellule
et si le nombre de valeur est important, en fin de boucle tu récupère le numéro de la dernière ligne contenant une valeur dans la cellule concernée
DerniereLigne = Cells(1, 1).End(xlDown).Row
Bonne journée. JML
Tiatia63
Messages postés60Date d'inscriptionmardi 12 juin 2007StatutMembreDernière intervention23 décembre 2010 12 juin 2007 à 17:15
Ben je travaille dans Visual Basic sous excel mais je ne me sers pas d'excel. Je programme sur VB et je travaille sur des tableaux de valeurs sous format csv. Je converti mes tableaux à l'aide de mon programme et je travaille sur mon tableau "virtuel" dans visual basic.
Pas douée pour expliquer, je sais! Mais on fait ce qu'on peut!
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 12 juin 2007 à 17:20
Ben vois-tu ?
Tu as posté dans la section VB69 (qui n'est pas celle pour VBA) et tu as parlé de Listes et de tableaux (qui sont autre chose sous VB6 où l'on utilise des tableaux dynamiques et des ListBoxes, par exemple...).
Bref...
D'où la nécessité d'être très précis, y compris sur le choix de la section dans laquelle on ouvre sa discussion ...
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 12 juin 2007 à 17:21
Désolé pour les interférences mais tel que expliqué j'avais interprété "Excel"
Il n'en reste pas moins vrai qu'il te sera plus facile de gérer une "zone vide" ou dans le cas d'un tableau virtuel "une erreur du type '9' indice n'appartient pas ... " que d'essayer de gérer un compteur.
JML
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 12 juin 2007 à 17:40
Salut Exploreur,
Juste à côté de chez moi !
Dans un virage en U 16 (16 pour teize et trois) dont le revêtement de sol est de surcroît assez traitrement glissant (si tu savais le nombre de tête-à-queues que l'on y compte chaque jour !... De quoi avoir des cauchemars !.... et la municipalité ne semble pas vouloir intervenir ...)
Tiatia63
Messages postés60Date d'inscriptionmardi 12 juin 2007StatutMembreDernière intervention23 décembre 2010 13 juin 2007 à 10:02
Merci pour toutes vos réponses et désolée pour l'embrouille!!
Je vais vous mettre tout mon programme pour que vous comprennez mieux. J'ai reussi à compter le nombre de valeur dans mon tableau et j'arrive pas à "remover".je vous laisse regarder mon programme, je mets tout mais mon probleme est à la fin où je souhaite supprimer des valeurs...
Private Sub CommandButton1_Click()
'i,j=var TabCompo
'k=var Propr
'l,m = Var TabProp
'a,b,c,d,e= var 1ere condition
'f,g,h,n,o,p= var 2è condition
'q,r,s,t,u = var 3è condition
'v,w,x,y,z = var 4è contion
Dim ValeurExtraiteFichierTxt
Dim ValeurExtraiteProprietesTxt
Dim i, j, k, l, m As Integer
Dim ld() As String
Dim TabCompositionAciers(50, 37) As Variant
Dim TabProprietesAciers(50, 40) As Variant
Dim UsinabiliteTheorique(50) As String
Dim UsinabiliteVerifie(50) As String
Dim Increment As Integer
Close
'Ouvrir le fichier composition et le mettre en tableau
Open "D:Composition aciers.csv" For Input As #1
i = 0
While Not EOF(1)
i = i + 1
ReDim Preserve ld(i)
Line Input #1, ld(i)
j = 1
For j = 1 To 37
If j = 37 Then
ValeurExtraiteFichierTxt = ld(i)
Else
ValeurExtraiteFichierTxt = Left(ld(i), (InStr(ld(i), ";")) - 1)
ld(i) = Right(ld(i), Len(ld(i)) - InStr(ld(i), ";"))
End If
TabCompositionAciers(i, j) = ValeurExtraiteFichierTxt
Next j
Wend
' Dans mon tableau TabCompositioAciers, la colonne 33 = 1; colonne 22 >=0.02 ....
' ou alors la colonne 36 = 1; col 4 >=0.15;...
' ...
i 2: k 0: a 1: b 0.02: c = 0.1: d = 0.15: e = 0.25: f 1: g 0.15: h = 0.2: q 1: r 20 s 0.1: t 0.35
Initvar:
For i = 2 To 50
If CSng(TabCompositionAciers(i, 33)) = a And CSng(TabCompositionAciers(i, 22)) >= b And CSng(TabCompositionAciers(i, 23)) <= c And CSng(TabCompositionAciers(i, 30)) >= d And CSng(TabCompositionAciers(i, 31)) <= e Then
UsinabiliteTheorique(k) = CStr(TabCompositionAciers(i, 3))
k = k + 1
End If
If CSng(TabCompositionAciers(i, 36)) = f And CSng(TabCompositionAciers(i, 4)) >= g And CSng(TabCompositionAciers(i, 5)) <= h Then
UsinabiliteTheorique(k) = CStr(TabCompositionAciers(i, 3))
k = k + 1
End If
If CSng(TabCompositionAciers(i, 37)) = q And CSng(TabCompositionAciers(i, 15)) <= r Then
UsinabiliteTheorique(k) = CStr(TabCompositionAciers(i, 3))
k = k + 1
End If
If CSng(TabCompositionAciers(i, 22)) >= s And CSng(TabCompositionAciers(i, 23)) <= t Then
UsinabiliteTheorique(k) = CStr(TabCompositionAciers(i, 3))
k = k + 1
End If
Next i
Close #1
'Ouvrir le fichier propriétés et le mettre en tableau
Open "D:Propriétés aciers.csv" For Input As #1
l = 0
While Not EOF(1)
l = l + 1
ReDim Preserve ld(l)
Line Input #1, ld(l)
m = 1
For m = 1 To 40
If m = 40 Then
ValeurExtraiteProprietesTxt = ld(l)
Else
ValeurExtraiteProprietesTxt = Left(ld(l), (InStr(ld(l), ";")) - 1)
ld(l) = Right(ld(l), Len(ld(l)) - InStr(ld(l), ";"))
End If
TabProprietesAciers(l, m) = ValeurExtraiteProprietesTxt
Next m
Wend
' Dans mon tableau TabProprietesAciers, il faut : colonne 12 = 1
l 3: m 1: x = 1
For l = 3 To 50
If CSng(TabProprietesAciers(l, 12)) = x Then
UsinabiliteVerifie(n) = CStr(TabProprietesAciers(l, 3))
n = n + 1
End If
Next l
'jusque là tout marche!!
'je compte combien il y a de résultat pour UsinabiliteTheorique > j'ai enfin réussi à trouver une méthode qui marche!!
Increment = 0
For k = 1 To 50
If UsinabiliteTheorique(k) <> "" Then
Increment = Increment + 1
End If
Next k
' maintenant je veux comparer les résultats de UsinabiliteTheorique et UsinabiliteVerifie
' et si j'ai deux fois le même résultat je veux le supprimer de UsinabiliteTheorique
' et là j'arrive pas à faire marcher la fonction remove!
For k = 1 To Increment
If UsinabiliteTheorique(k) = UsinabiliteVerifie(n) Then
Remove UsinabiliteTheorique(k)
End If
Next k
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 14 juin 2007 à 00:51
Plutôt que de tenter d'utiliser Remove qui ne devrait pas fonctionner avec des tableaux, du moins à ce que je sache, tu pourrais créer un tableau Final dans lequel tu ne copies que les résultats souhaités.
Une chose me chicote, comment ces 2 tableaux peuvent-ils être comparés en se fiant aux Index comme tu le fais ? surtout que n ne bouge pas dans cette boucle...
En fait, ça te prendrait une double-boucle dans l'exemple que tu donnes
For k = 1 To Increment ' ou Ubound (UsinabiliteTheorique)
for n = 1 to Ubound(UsinabiliteVerifie)
If UsinabiliteTheorique(k) = UsinabiliteVerifie( n ) Then
Identique = True 'les 2 sont pareils, on ne garde pas
Exit for
End If
next
if not identique then MonTableauFinal(xyz) = UsinabiliteTheorique(k)
xyz = xyz + 1
Identique = False
Next k
Bien sûr, c'est fait à main levée, mais c'est un peu l'idée
Et fais une recherche sur UBound qui te donne le nombre d'items de ton tableau sans devoir boucler comme tu le fais pour trouver Increment
Tiatia63
Messages postés60Date d'inscriptionmardi 12 juin 2007StatutMembreDernière intervention23 décembre 2010 14 juin 2007 à 11:54
Merci pour la réponse!
En fait je veux faire un tableau final avec les valeurs de UsinabiliteTheorique(k) et de UsinabiliteVerifie(n) mais je ne veux pas qu'il y est deux fois la meme valeur dans mon nouveau tableau.
Parce que si j'ai bien compris tu me propose de supprimer totalement les valeurs en double et de ne garder que les valeurs de UsinabiliteTheorique(k). Mais je me suis surement mal exprimée!
En fait, je penser supprimer de UsinabiliteTheorique(k) les valeurs déjà présentent dans UsinabiliteVerifie(n) et ensuite faire un tableau ou je mettrai en premier les valeur de UsinabiliteVerifie(n) et ensuite celle de UsinabiliteTheorique(k) (sans doublon).
Merci de votre aide!
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 14 juin 2007 à 13:31
Bonjour,
Si l'on retient la proposition de MPi de créer un tableau pour stockage des données à conserver, on peut imaginer une boucle sur ce nouveau tableau qui vérifiera la non existence de la donnée avant sa création dans ce nouveau tableau. Ce qui te permettra de balayer les 2 tableaux de données sans risque de création de doublon. Parce que, à mon sens, si on ne parcours qu'un seul des 2 tableaux (comme suggéré plus haut) on risquerait de louper des données qui n'existeraient que dans le 2ème.
Bonne journée. JML
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 15 juin 2007 à 03:20
En fait, j'ai dû mal comprendre...
Dans ce genre de vérification sans doublon, j'ai l'habitude de me créer une Function qui balaie le tableau à remplir pour voir si la valeur est déjà présente (j'utilise le même principe avec Listbox et Combobox), du genre
Function IsInTablo(Valeur, tablo) As Boolean
Dim I As Long
For I = 0 To UBound(tablo)
If Valeur = tablo(I) Then
IsInTablo = True
Exit For
End If
Next
End Function
Dans ton cas, le premier tableau devrait, en principe, ne pas contenir de doublon... Et là tu boucles le second tableau et tu vérifies à l'aide de cette Function si la valeur y est déjà avant de la rajouter...
Disons que tu pars avec le tableau UsinabiliteTheorique comme base, tu dois donc vérifier l'autre.
for n = 1 to Ubound(UsinabiliteVerifie)
If Not IsInTablo(UsinabiliteVerifie(i), UsinabiliteTheorique) then
'insertion de l'item après ajustement de l'index
'avec Redim Preserve
end if
next