Fonction Count Visual Basic

Signaler
Messages postés
60
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
23 décembre 2010
-
Messages postés
60
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
23 décembre 2010
-
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" /??>

 

21 réponses

Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

Non(pour moi)  tu n'es pas très clair...tu veux compter ou decompter quoi ? Ou ?

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
boucle dans l'autre sens

For i = Count -1 To 0 Step -1
     '# ....
Next i

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
60
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
23 décembre 2010

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!
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
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.
Messages postés
46
Date d'inscription
jeudi 17 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013

Bonjour,

Non c'est pas toujours clair, mais essayons
si tu utilises des tableaux dynamiques

dim tableau() as integer
redim tableau(nnn)
alors la fonction ubound(tableau) te retournera nnn

for i = 0 to ubound(tableau)

next i

Etienne
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Tiens !
D'où sorten maintenant ces cellules d'Excel, d'un seul coup ?
T'es finalement sous VBA Excel, TiaTia63 ?
Messages postés
60
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
23 décembre 2010

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!
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
message déplacé

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
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 ...
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
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
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut Jmfmarques,

Une petite question : Pourrais-tu me dire ou on trouve ce fameux Vb69 ? Car je suis intéressé pour en faire l'acquisition!!!

Ok...Ok...Je sort....

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
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 ...)
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Il ne fait que dans la nouveauté ce soir  jmfmarques VB69    "teize et trois"    peut être un petit soucis avec les chiffres
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Salut Tiatia63,

Juste pour mettre au clair... et apporter un peu de précision. Et je ne mets pas en cause tes explications, mais on en voit de toutes les sortes...

Lorsque tu parles de tableau, tu parles de
Dim Tableau(10) As Integer (vrai tableau) 
ou Range("A1:G25")  (préférablement nommé Plage)

Lorsque tu parles de liste, tu veux dire ListBox ?
ou encore une plage ? ou un Tableau() ?

Si tu pouvais mettre un bout de code et les déclarations de variables et autres, ça aiderait, je pense...

MPi
Messages postés
60
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
23 décembre 2010

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



Close #1
End Sub

Merci d'avance pour votre aide!

Tiatia63
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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

MPi
Messages postés
60
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
23 décembre 2010

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!
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
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
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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

J'espère avoir mieux compris...

MPi