Comment savoir si un tableau dynamique est dimensionné ?

Résolu
Signaler
Messages postés
20
Date d'inscription
dimanche 22 juin 2003
Statut
Membre
Dernière intervention
31 octobre 2006
-
Messages postés
20
Date d'inscription
dimanche 22 juin 2003
Statut
Membre
Dernière intervention
31 octobre 2006
-
Salut à tous !

Je suis en plein développement, et là, je suis confronté à un "pseudo" problème on va dire. Je sais comment le contourner, mais si je pouvais éviter de le contourner et plutôt de le solutionner, ce serait pas mal.

Voilà... Je crée 4 tableaux dynamiques. Avec une BDD, je remplis ces tableaux en fonction d'un SELECT CASE. A chaque fois que je remplis un tableau, je fais un REDIM PRESERVE.

Une fois ces remplissages faits, je fais d'autres traitements sur chacun de ces 4 tableaux. Vu que le remplissage précédent se fait par un SELECT CASE, certains de ces tableaux peuvent ne pas être remplis, et donc de ce fait, ne pas être dimensionné... Alors forcément, si je fais un traitement sur un tableau qui finalement est déclaré mais qui n'existe pas, ça part en erreur...

Actuellement, pour contourner le problème, je fais par défaut un DIM de 1 élement pour chacun de ces tableaux, et si un tableau(0) est égal à NULL (ce sont des tableaux de Integer), je sais que mon tableau n'existe pas...

Donc pour abréger (LOL), je voudrais savoir s'il existe une fonction permettant de dire si un tableau déclaré dynamiquement a été dimensionné ou pas. Ce serait plus propre. Maintenant, s'il n'y a pas de solution, tant pis, je resterai comme ça. Mais je trouve que ça fait un peu poporc. J'avais choisi les tableaux dynamiques pour justement ne pas prendre de place quand j'en avais pas besoin.

Merci à vous tous !!

7 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Private Sub Command1_Click()

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



End Sub


Daniel
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
un solution comlète, comme tu l'espères, pas à ma connaissance.
ta solution 'poporc" ne l'est pas tant que çà, et à le mérite d'être rapide.
si tu veux une version "plus officielle", çà serait de faire une gestion d'erreur

Dim Montablo1() as String, Montablo2() as String, Montablo3() as String, Montablo4() as String
Dim WhichErr as String
Dim Temp as Integer

On Error Goto ERRTABLEAU
WhichErr="MonTablo1"
Temp = Ubound(MonTablo1)

WhichErr="MonTablo2"
Temp = Ubound(MonTablo2)

WhichErr="MonTablo3"
Temp = Ubound(MonTablo3)

WhichErr="MonTablo4"
Temp = Ubound(MonTablo4)

On Error Goto 0 'fin de gestion d'erreur
Temp=""
MsgBox "Les 4 tableaux sont OK", 32, "***"
Exit Sub

ERRTABLEAU :
MsgBox "Une erreur est survenue sur " & chr(34) & WichErr & chr(34), 32, "***"
Exit Sub

là tu as une gestion propre. à toi de voir l'utilité

PCPT
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
c'était WichErr que je voulais vider. çà peut te servir à ne pas faire d'Exit Sub, et de vérifier en dernière ligne
If LenB(WhichErr)=0 Then exit Sub

PCPT
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
bien bien bien... en effet
j'la connaissais pas celle là ;)
PCPT
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
c'est une astuce pour trouver le pointeur de la SafaArray,

ça évite de passer par les API







Private Type SAFEARRAYBOUND

cElements As Long

lLbound As Long

End Type



Private Type SAFEARRAY1D

cDims As Integer

fFeatures As Integer

cbElements As Long

cLocks As Long

pvData As Long

Bounds(0 To 0) As SAFEARRAYBOUND

End Type



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



ReDim Tableau(10)



Pointer = Not (Not Tableau)

MsgBox Pointer



PointerToPointer = VarPtrArray(Tableau)

Call CopyMemory(PointerToSafeArray, ByVal PointerToPointer, 4&)

MsgBox PointerToSafeArray



End Sub


Daniel
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
18
Salut,

Bien vu Daniel !

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
Messages postés
20
Date d'inscription
dimanche 22 juin 2003
Statut
Membre
Dernière intervention
31 octobre 2006

Bonsoir !!

Merci à tous pour vos réponses, c'est super sympa. Et spécial thank à Gobillot pour ce code "tout bête" qui permet de faire ce que j'attendais. Je faisais "not tableau" qui ne marchait pas, mais effectivement, "not (not tableau)", ça passe !

Encore merci.