Utilisation de Ubound avec un tableau dynamique [Résolu]

matteli 38 Messages postés jeudi 23 novembre 2000Date d'inscription 14 mars 2007 Dernière intervention - 6 mars 2007 à 17:48 - Dernière réponse : cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention
- 21 mars 2007 à 09:50
Salut,

J'utilise le code classique suivant :

For i = 1 to Ubound (tableau)
    ...
next i

J'ai une erreur (normal) si le tableau est dynamique et qu'il n'a pas été dimensionné.

Quelle commande permet de savoir si un tableau dynamique a été dimensionné ?

Merci
Afficher la suite 

Votre réponse

26 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 6 mars 2007 à 18:31
3
Merci
Salut,


Perso je fais un redim tableau(0 to 0) pour l'intialiser (ou le vider).


Et je fais comme toi, je fais partir mes vrai données à partir de
l'indice 1. Comme ça, avec un For i = 1 to Ubound (tableau) sur un
tableau vide, on entre pas dans la boucle vu que ça fait For i = 1 to 0.

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de cs_rt15
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 6 mars 2007 à 20:09
3
Merci
salut,
pas obligé, tu peux tester :
http://www.codyx.org/snippet_savoir-si-tableau-existe-dimension_231.aspx

++
PCPT  [AFCK]
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de PCPT
matteli 38 Messages postés jeudi 23 novembre 2000Date d'inscription 14 mars 2007 Dernière intervention - 6 mars 2007 à 18:39
0
Merci
Ok, j'avais bien pensé à ça mais j'espérais ne pas avoir besoin de déclarer la dimension du tableau quand il n'était pas nécessaire.

Merci
Commenter la réponse de matteli
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 6 mars 2007 à 20:41
0
Merci
Erase MonTableau

pour le vider....

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 6 mars 2007 à 21:07
0
Merci
Woa


Heu... quesaco ?


C'est bien encore du code d'admin ça...


On peut avoir une petite explication sur le :

IsArrayNull = ((
Not (Not aArray)) = 0)

svp ?
Commenter la réponse de cs_rt15
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 6 mars 2007 à 21:15
0
Merci
Erase MonTableau 
   pour remplacer
Redim MonTableau(0 to 0)

pas d'explication, c'est une sorte de faille de VB, je ne pense pas qu'il y ai une explication logique au phénomène.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 6 mars 2007 à 21:27
0
Merci
dans le fonctionnement un peu plus détaillé, çà fait appel au pointeur de la dimention lbound (si elle existe)
comme avec VarPtrArray en fait

je saurai pas trop t'en dire plus...
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 mars 2007 à 21:51
0
Merci
je ne pense pas que ce soit une faille de VB
seulement une technique trouvée par moi, je la revendique
retourne le même pointeur que VarPtrArray

Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Sub Command1_Click()
    Dim SafeArray          As SAFEARRAY1D
    Dim PointerToPointer   As Long
    Dim PointerToSafeArray As Long
    Dim Pointer            As Long
    Dim Tableau()          As Integer
   
    If Not (Not Tableau) = False Then
       MsgBox "vide"
       End If
      
    ReDim Tableau(10)
  
    If Not (Not Tableau) = True Then
       MsgBox "non vide"
       End If
   
    Pointer = Not (Not Tableau)
    MsgBox Pointer
   
    PointerToPointer = VarPtrArray(Tableau)
    Call CopyMemory(PointerToSafeArray, ByVal PointerToPointer, 4&)
    MsgBox PointerToSafeArray
       

Daniel
Commenter la réponse de Gobillot
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 6 mars 2007 à 22:03
0
Merci
"faille VB", Renfield n'as pas dû lire ma réponse (je suppose)

quand au snippet, j'avais lu la réponse sur le forum (sans doute de toi en effet) il y a un moment.
j'ai encore le fichier.txt qui traine, je cite les sources, désolé pour les réponses en forum, on s'en sort plus sinon....

au moins c'est clarifié et matteli a 3 méthodes ;)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 mars 2007 à 22:20
0
Merci
attention toutefois, ça peut parfois générer une erreur bizarre (expression trop complexe)
essayer dans le lien ci-dessous d'enlever le List1.Clear ou d'enlever le  If Not ( Not d) Then
s'efface aussi par Me Refresh  (pourquoi ?)
http://www.codyx.org/snippet_obtenir-toutes-dates-valides-comprises-entre-dates_128.aspx
Daniel
Commenter la réponse de Gobillot
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 6 mars 2007 à 22:27
0
Merci
c'est la listbox qui n'est pas contente, elle préfère rester à l'abris (invisible)

     If Not (Not d) Then
        List1.Visible = False
        For i = 0 To UBound(d)
            List1.AddItem CStr(d(i)) 'avec ou sans cstr
        Next i
        List1.Visible = True
    End If

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 6 mars 2007 à 22:32
0
Merci
quand je parle de faille, je veux dire qu'en fait, y'a pas de raison pour que l'on ne puisse faire un Not sur un tableau (dejà) alors pourquoi deux Not l'un après l'autre nous sorte le pData du tableau...

y'a une raison physique, bien entendu !

mais c'est conceptuellement non désiré, je pense ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 6 mars 2007 à 22:33
0
Merci
Bah merci tout le monde pour ce début d'explication.


N'empèche que not tableau qui renvoie la négation de l'adresse du
tableau... C'est quand même original. Z'auraient balancer une erreur à
la compile que s'aurait été plus dans l'esprit de VB je trouve.
Commenter la réponse de cs_rt15
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 mars 2007 à 22:40
0
Merci
effectivement avec le List1.Visible ça marche mais pourquoi ?

en fait Tableau contient le pointeur (en Long) mais on ne peut pas l'avoir directement (type mismatch)
alors que Not Tableau marche (VB est trompé)
il faut bien rajouter un deuxième Not pour l'avoir direct
mais c'est pas obligaoire, seulement plus pratique: 
Not Tableau donne -1 si Tableau vide
le Not -1 donne 0 donc False.

Daniel
Commenter la réponse de Gobillot
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 6 mars 2007 à 22:48
0
Merci
mmm Quand on fait un redim, la borne inférieur, c'est pas 1 par défaut ?


For i = 1 To UBound(d)
Commenter la réponse de cs_rt15
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 mars 2007 à 22:50
0
Merci
non c'est zéro par défaut
sauf si t'as mis Option Base 1 au début
le mieux c'est d'utiliser Lbound:
For i = Lbound(d) To UBound(d)

Daniel
Commenter la réponse de Gobillot
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 mars 2007 à 23:16
0
Merci
en fait c'est pas vraiment vrai,
tu peux très bien faire Redim par défaut à zéro (pour Lbound) et l'utiliser à partir de 1
c'est que je fais en général
ce qui permet d'utiliser le zéro pour autre, par l'exemple tester si le tableau est vide

    Dim Tableau()          As Integer
   
    ReDim Tableau(0) 'tout de suite
   
    If UBound(Tableau) = 0 Then
       MsgBox "vide"
       End If

    - - - - - - - - - - - - - - -
  
    ReDim Tableau(10)
   
    If UBound(Tableau) > 0 Then
       MsgBox "non vide"
       End If

Daniel
Commenter la réponse de Gobillot
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 6 mars 2007 à 23:23
0
Merci
Milles excuses, j'aurais dûe commencer par vérifier...


La technique de ton dernier post est celle de mon premier. Sauf que moi je met des To pour être sûre de où ça commence.


Par contre j'aimerais bien trouvé le temps de le passer au désassembleur le petit code qui plante...
Commenter la réponse de cs_rt15
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 mars 2007 à 23:34
0
Merci
ah oui c'est vrai j'avais pas vu, de même milles excuses
on ne peut pas utiliser le tableau quand il n'est pas initialisé, le pointeur est à zéro
et il n'y a pas de SafeArray, donc pas de Lbound, Ubound, etc ... donc plantage
il y a que le Not qui marche (à part le Redim, Erase ou ... je sais pas)

PS: on peut trés bien ne pas mettre de Dim et l'initialiser au Redim
      le Dim ne sert qu'à lui donner un type, ce qui peut être fait dans le Redim
      Redim Tableau(10) As Long

Daniel
Commenter la réponse de Gobillot
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 7 mars 2007 à 00:07
0
Merci
mais notre ami ne veut de Redim initial
il peut aussi capter l'erreur générer et faire ce qu'il faut dans le cas de tableau vide.

    Dim i   As Long
    Dim U As Long

    On Error Resume Next
    U = UBound(Tableau)
    If Err.Number Then
       MsgBox Err.Description
       Exit Sub
       End If
    On Error GoTo 0   'c'est préférable

'   ici la suite du code
    For i = 1 To U
        MsgBox i
        Next

Daniel
Commenter la réponse de Gobillot

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.

Utilisation de Ubound avec un tableau dynamique - page 2