Problème avec tableau dynamique à deux dimensions

Problème avec tableau dynamique à deux dimensions - VB/VBA/VBS - Programmation

Marsh Posté le 20-02-2007 à 09:47:13    

Bonjour,
 
J'ai un soucis avec des tableaux dynamique à deux dimensions. Je les ait déclarer comme suit dans mon programmes :
 Dim tab() As Variant
 
puis dans mon algo, je récupère un entier et je fait : Redim tab(int,int). J'ai vérifié que mon entier avait bien une valeur différente de null et de 0.
 
Le reste de mon algo alimente ce tableau. Malheureusement, il semble qu'aucunne données ne soit inscrite dans le tableau. Si je mets des tailles fixes : Dim tab(100,100) par exemple, mon programme fonctionne correctement.
 
J'ai également vérifié que je rentrais pas plus de valeur que le tableau était grand (pas de débordement, si mon entier vaut 30, je ne peux pas rentrer plus de 30 valeurs).
 
Je précise que le Redim se fait en début de programme quand le tableau ne contient aucune valeur (pas d'écrasement donc).
 
Quelqu'un peut-il m'aider?

Reply

Marsh Posté le 20-02-2007 à 09:47:13   

Reply

Marsh Posté le 20-02-2007 à 14:15:09    

Essaye sans donner de type à ta première déclaration ?  (et aussi évite les noms tels que "tab" je sais pas si ce n'est pas un nom réservé)

Code :
  1. Dim montab()
  2. Dim i
  3. (...)
  4. i = 100
  5. MsgBox ("Valeur de i : " & i)
  6. Redim montab(i,i)
  7. ' stockage de tes valeurs ici et affichage du contenu

 

*edit*

 

Essaye aussi une déclaration directement en deux dimensions :

 
Code :
  1. Dim montab()()
 

(c'est un peu loin le VB je ne sais plus si ce type de décla existe)

Message cité 1 fois
Message édité par ZeBix le 20-02-2007 à 14:17:52
Reply

Marsh Posté le 20-02-2007 à 14:41:59    

ZeBix a écrit :

Essaye sans donner de type à ta première déclaration ?  (et aussi évite les noms tels que "tab" je sais pas si ce n'est pas un nom réservé)

Code :
  1. Dim montab()
  2. Dim i
  3. (...)
  4. i = 100
  5. MsgBox ("Valeur de i : " & i)
  6. Redim montab(i,i)
  7. ' stockage de tes valeurs ici et affichage du contenu

 
 
*edit*  
 
Essaye aussi une déclaration directement en deux dimensions :  
 

Code :
  1. Dim montab()()


 
(c'est un peu loin le VB je ne sais plus si ce type de décla existe)


 
il n'accepte pas montab()()... j'ai essayé de leur donner une dimension du genre montab(1,1) et de faire un redim montab(i,i) mais il me dit que mon tableau est déjà dimensioné.
 
PS: mes tableaux ne s'appellent pas tab() .
 
 

Reply

Marsh Posté le 20-02-2007 à 14:50:42    

Oki tâtonnons donc un peu plus (où sont les experts VB du forum ?  :cry: )
 

Code :
  1. Dim montab(,)


 
(c'est une déclaration .NET dont je ne suis pas sûr de la syntaxe exacte et ne sais pas si elle marche en VBS/VBA/VB6   :pt1cable:  )

Reply

Marsh Posté le 20-02-2007 à 15:50:31    

« Dim tab() As Variant  » est une déclaration tout à fait valable et si tu n'as aucune valeur dans ton tableau, c'est que ton remplissage est mauvais ou que ton ReDim est, soit mal placé (après le remplissage), soit mal utilisé.
 
Un Redim doit être suivi du mot-clé « Preserve » pour pouvoir redéfinir la taille de la dernière dimension du tableau en gardant le contenu actuel :
Dim tab() as Variant   ' on connait pas les dimensions
Redim tab(12, 5) as Variant  ' on connait les dimensions de base
...
Redim Preserve tab(12, 14) as Variant ' on augmente la dernière dimension
 
On ne peut pas augmenter les dimensions autres que la dernière.
 
 

Reply

Marsh Posté le 20-02-2007 à 16:12:21    

Bon, merci pour vos réponses mais j'ai toujours mon problème.
 
Alors, je doisa voir des tableaux de la forme suivante montableau(1,x). Si j'ai bien compris, ça veut dire que j'ai 2 colonnes et x lignes dans ce cas? J'ai un doute là.
 
Pour l'instant, je déclarais mes tableaux en mettant 100,100 et ma macro les remplissaient correctement, même si 100,100 sont exagerés. Voilà comment se présenterais les tableaux que je dois gérer:
 
Titi   Toto  Tata  etc..
 1       0       4    etc...
 
 
Bref, montab(,) ne fonctionne pas et je fait les Redim avant d'insérer des données.

Reply

Marsh Posté le 20-02-2007 à 16:34:49    

Sans le code (du moins une partie éclairante) il est difficile de voir quel est ton problème.
Je rencontre tellement de programmeurs qui me disent qu'ils font telle ou telle chose et dont le code n'a rien à voir avec ce qu'ils me disent que je préfère rester prudent. Rien de personnel :)
 
Tu n'as déjà pas précisé si tu travailles en VB6 ou en VBA (Word, Excel ?)
 
Pour ce qui est de savoir si c'est des lignes ou des colonnes, ça n'a aucune importance à moins de jouer dans Excel, auquel cas on respecte le plus souvent le « sens » Excel.
 

Reply

Marsh Posté le 20-02-2007 à 16:57:53    

En fait j'avais pas fait attention mais je devais partir de 0 et pas de 1 to x... Maintenant ça fonctionne  :whistle:  
 
 
Par contre, j'ai eu un drôle de bug. Mes tableaux sont déclarés de façon globale à la macro (tout en haut dans le code, arf oui je suis pas bon en vba donc c'est peut etre pas comme cela qu'on dit). J'ai donc une fonction qui fait les redim et qui remplit les tableaux. Certaines fois, cette fonction en apelle une autre qui  les remplit à nouveau (les mêmes). J'ai eu de nouveau des problèmes d'indices comme si les tableaux n'était plus à deux dimensions.
 
J'ai donc fait de nouveau un redim (sans preserve, je voulais au contraire que çà efface tout) et ça marche. Dois-je en déduire que les redim n'ont une porté que sur la fonction ? (entre sub et end sub je sais plus comment ça s'apelle).
 
Merci quand même pour l'aide apportée plus haut :jap:
 
nb : je travaille sous excel 2003.


Message édité par skystef2 le 20-02-2007 à 16:58:20
Reply

Marsh Posté le 21-02-2007 à 11:14:17    

Si tu as bien déclaré ton tableau dans la partie « (Déclarations) » de ton module alors ton tableau est valable pour toutes les procédures et fonctions du module.
Le Redim ne doit rien y changer.

Option Explicit
Dim t() As Variant
Sub test()
    ReDim t(4) As Variant
    ' ici, le tableau t() contient bien 5 éléments (indices 0 à 4)
    test2
    ' ici, le tableau t() contient bien 7 éléments (indices 0 à 6)
End Sub
Sub test2()
    ReDim t(6) As Variant
End Sub


Tu dois avoir un autre problème.

Reply

Marsh Posté le 24-07-2007 à 08:35:59    

On ne peut pas redimenssionner un tableau a deux dimension en VB. Mais j'ai une solution ^^
public type tablo
     tab() as integer
end type
 
dim tabl() as tablo
 
Tu redimenssione les deux dimension de façon séparée, mais tu a un tableau à deux dimension dynamique

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed