Petit probleme de test

Signaler
Messages postés
12
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
11 décembre 2006
-
Messages postés
9
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
24 juillet 2008
-
samouille666

Voila la question est un, peu ras de terre mais j'ai pas trouve alors bon...
access2000, les fonctions "isempty" , "isnull" ne permette pas de verifier qu'un tableau est vide.
Ubound et Lbound declenche une erreur...
"Not is Nothing" ne fonctionne pas non plus ...
En fait aucune fonction ne permet de verifier qu'un tableau declarer n'a pas été initialiser.

20 réponses

Messages postés
1247
Date d'inscription
mardi 7 mai 2002
Statut
Membre
Dernière intervention
18 février 2019
4
Oui j'ai le mm prob, j'ai ttrouvé une seule parade afin de ne pas faire bugguer le vode, mais c pas propre (On error goto...)

Dim Tableau() As String

On Error GoTo Vide
If Tableau(0) <> vbNullString Then GoTo PasVide Else GoTo Vide

PasVide:
MsgBox "Pas vide"
Exit Sub

Vide:
MsgBox "Tableau vide"

PS: c pas top, mais pour le moment c la seule chose que g trouver!!!!

Si qq a mieux????
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
n effet, a par utiliser un On Error Goto ca n'est pas très concluant....

attention, dans les options de compilation, on peut déconnecter la verification des tailles des tableaux, donc, je ne sais trop si cela fonctionne alors...

Tu peux au pire stocker un compteur du nombre d'elements de ton tableau...
Messages postés
120
Date d'inscription
jeudi 31 octobre 2002
Statut
Membre
Dernière intervention
2 août 2004

bonjour,

le isempty ne fonctionne QUE POUR les variables (pas les tableaux) de type VARIANT uniquement.

Pour ma part, je fais ceci :

Dim tableau(10) As String
Dim i As Integer
Dim vide As Boolean

vide = True

Do Until i = 10
If tableau(i) <> "" Then vide = False
i = i + 1
Loop

Je n'ai plus qu'à tester la variable boolean VIDE pour savoir si elle est restée à VRAI ou si une donnée l'a changer en FAUX

Colibri
Messages postés
12
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
11 décembre 2006

merci a tous , j'ai conserve la solution du booleen ...
samouille666
Messages postés
1247
Date d'inscription
mardi 7 mai 2002
Statut
Membre
Dernière intervention
18 février 2019
4
Dsl carnez mais ton code ne fonctionne que si un tableau a été déclararé!!!

Je ne pense pas que c la question au depart !! a moin que g pas compris!!!

essaie avec un tableau dynamique:
Dim Tableau() as string

ton code va bugger!!!!

Enfin pour mon exemple c dans le cas d'un tableau dynamique vide, c'est a dire sans aucun enregistrement, comme apres un "erase"!!!!
et c la seule facon que g trouvé!!!

Ps: sinon il y a plus simple et plus rapide que ton code :

Dim tableau(1 To 10) As String
If Trim(Join(tableau, "")) = vbNullString Then MsgBox "tableau vide"

voila ++
Messages postés
1247
Date d'inscription
mardi 7 mai 2002
Statut
Membre
Dernière intervention
18 février 2019
4
Renfield-->essayer de stocker le nb d'element du tableau, mais mm prob si pas diméntionné, alors bug!!!

c'est a peine plus propre lol!!!!

Dim tableau() As String
Dim nb As Integer

On Error Resume Next
nb = UBound(tableau)

If nb > 0 Then MsgBox "tableau Diméntionner" Else MsgBox "tableau non Diméntionner"

Ps: je pense qu'il n'est pas possible de tester si un tableau dynamique posséde au moin un enrg sans bug!!!! ????

Question ouverte???
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
j'utilise dans mes developpements actuels une classe qui joues le role de pile

j'ai dans un premier temps utilisé une gestion d'erreur pour savoir s'il y avait des elements dans mes piles

j'ai finallement conservé le noombre d'elements dans une variable... il est simple de tester si 'Count' = 0 ....
Messages postés
12
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
11 décembre 2006

dites moi ça a l'air d'exite pas mal les conscience de ce forum.
Je remercie pcpunch pour son assiduité à repondre "exactement " a la question, il a raison tout part d'un tab dynamique et le prob est dans la non declaration justement...(puisque des que le tab est declare il est rempli de variable "empty" visiblement un typename() le confirme)

Le probleme avec ton "on error" pcpunch c'est que au moment ou je debugg je ne sais pas du tout ce que le compilo fout si une autre erreur se declare. Je sais que le type d'erreur sur un tableau dynamique non initialise (mais declaré) que l'on essais de mesure (ubound()) est '9' , un err.number me fourni ce renseignement mais dans le cas ou une autre erreur se declare comment je fais pour qu'il reparte sur la ligne ou est née l'erreur? (me suis je bien exprimé? lol)

Renfield me parle de pile, mais je suis un petit nouveau dans la prog desole ça je connais pas ...

j'ai donc pris la solution booleen car il me suffit au moment ou je commence a le remplir (le tab) de changer sa valeur.

samouille666
Messages postés
12
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
11 décembre 2006

bon pcpunch a la palme ...
son code :
Dim tableau(1 To 10) As String
If Trim(Join(tableau, "")) = vbNullString Then MsgBox "tableau vide"

marche avec un tableau dynamique non dimensionne.
neanmoins a partir d'une certaine longeur de tableau genre quelque millier de case on peut se demander si au niveau temps de calcul le booleen n'est pas une meilleur solution.
a mediter
merci a tous en tous cas j'ai plus de solutions et de pistes que jamais
samouille666
Messages postés
4
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
23 février 2006

Si je peux me permettre, je me suis inspiré de tout ce que vous avez dit (à peu près) pour sortir ça :

Public Function Array_Count(arr As Variant)
On Error GoTo errCount
If UBound(arr) <> -1 And LBound(arr) <> -1 Then
Array_Count = UBound(arr) - LBound(arr) + 1
End If


Exit Function


errCount:
Array_Count = 0
End Function

Utilisation :

Dim arr() as Integer
MsgBox Array_Count(arr)
'renvoi 0

Dim arr(1 To 5) as Integer
MsgBox Array_Count(arr)
'renvoi 5

Dim arr(0 To 5) as Integer
MsgBox Array_Count(arr)
'renvoi 6
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
c'est pas mal, quoi qu'un peu gourmand, si utilisé trop souvent....

Renfield
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
4
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
23 février 2006

oué c'est un peu gourmand comme tu dis mais c'est la seule solution que j'ai trouvé qui renvoi un résultat "propre". J'ai passé une heure et demi sur le net hier soir à éplucher toutes les docs et les forums et je n'ai absolument rien trouvé. Je ne suis pas un pro du VB mais c'est quand même étonnant de galérer autant pour compter les éléments d'un tableau (à une dimension dans mon cas).
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
il t'est pas possible de conserver le nombre d'elements dans une
variable.... et de se baser dessus, pour connaitre, a chaque instant le
nombre d'elements ?

Renfield
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
4
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
23 février 2006

Si bien sûr mais je trouve que ça fait trop "bidouillage" d'autant plus qu'il faut entretenir une variable compteur à chaque altération du tableau ce qui peut être source d'ennuis.
Ca oblige pour un seul tableau à gérer 2 objets (au sens variables).
D'autant plus que quand on gère une grande quantité de tableaux, ça oblige à créer un compteur pour chaque et donc doubler les déclarations.

Ma fonction Array_Count doit pouvoir s'optimiser pour être moins couteuse, je trouve ce système surtout plus fonctionnel.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
ok.... tout dépend du contexte ^^

Renfield
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
2
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
5 septembre 2007

Je viens moi aussi de me cogner à ce problème : tester proprement si un tableau dynamique est vide (c.à.d. non initialisé, et non un tableau "plein de  vide"). Comme il a été dit, une (la?) solution est de tester une erreur. Dans mon cas :

   Public Function IsEmptyArray(tbl As Variant) As Boolean

         Dim n As Integer



         On Error Resume Next
         n = LBound(tbl)
         If Err Then IsEmptyArray = True
    
   End Function


et ensuite dans le corps de code :

   If IsEmptyArray(MonTableau) then ...

Y aurait-il mieux ?
Messages postés
9
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
24 juillet 2008

kanelesavant
marche avec un tableau dynamique non dimensionne.
neanmoins a partir d'une certaine longeur de tableau genre quelque millier de case on peut se demander si au niveau temps de calcul le booleen n'est pas une meilleur solution.
a mediter
Messages postés
9
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
24 juillet 2008

kanelesavant
marche avec un tableau dynamique non dimensionne.
neanmoins a partir d'une certaine longeur de tableau genre quelque millier de case on peut se demander si au niveau temps de calcul le booleen n'est pas une meilleur solution.
a mediter
Messages postés
9
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
24 juillet 2008

kanelesavant
marche avec un tableau dynamique non dimensionne.
neanmoins a partir d'une certaine longeur de tableau genre quelque millier de case on peut se demander si au niveau temps de calcul le booleen n'est pas une meilleur solution.
a mediter
Messages postés
9
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
24 juillet 2008

kanelesavant
marche avec un tableau dynamique non dimensionne.
neanmoins a partir d'une certaine longeur de tableau genre quelque millier de case on peut se demander si au niveau temps de calcul le booleen n'est pas une meilleur solution.
a mediter