Utilisation de Ubound avec un tableau dynamique

Résolu
matteli Messages postés 38 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 14 mars 2007 - 6 mars 2007 à 17:48
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 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

26 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 mars 2007 à 18:31
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.
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 mars 2007 à 20:09
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
3
matteli Messages postés 38 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 14 mars 2007
6 mars 2007 à 18:39
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 mars 2007 à 20:41
Erase MonTableau

pour le vider....

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 mars 2007 à 21:07
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 ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 mars 2007 à 21:15
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 mars 2007 à 21:27
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
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 mars 2007 à 21:51
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 mars 2007 à 22:03
"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
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 mars 2007 à 22:20
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 mars 2007 à 22:27
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 mars 2007 à 22:32
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 mars 2007 à 22:33
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.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 mars 2007 à 22:40
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 mars 2007 à 22:48
mmm Quand on fait un redim, la borne inférieur, c'est pas 1 par défaut ?


For i = 1 To UBound(d)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 mars 2007 à 22:50
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
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 mars 2007 à 23:16
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 mars 2007 à 23:23
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...
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 mars 2007 à 23:34
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
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
7 mars 2007 à 00:07
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
0
Rejoignez-nous