Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

variable type tableau en dynamique

6 réponses
Avatar
claude.vonknechten
Bonjour et bonne année à tous

Comme je suis novice avec VB, j'ai un ple de déclaration de tableau dynamique!

J'ai besoin d'une variable tableau à 2 dimensions que je souhaite remplir de
façon dynamique.
Voici le code que j'ai ecrit et qui ne fonctionne pas!
dim W_JF()
i = 0
While Cells(i + 1, 1).Value <> ""
ReDim Preserve W_JF(i,1)
W_JF(i,0) = i
W_JF(i,1) = Cells(i + 1, 1).Value
i = i + 1
Wend
Pour i = 0, c'est OK.
pour i = 1 Le message d'erreur est le suivant: l'indice n'appartient pas à
la selection.

Ensuite j'ai besoin de trier le tableau W_JF sur le contenu de la deuxieme
colonne.

Je vous remercie pour votre aide précieuse

6 réponses

Avatar
X
Bonjour,

Réponse basée sur du VB, donc sûrement incomplète...

Le tableau, je crois que c'est à partir de 1 et non 0

Le redim en boucle:
tu peux boucler 1 fois pour compter, puis fixer le redim en taille, puis
reboucler cette fois pour charger...

Tri, en vb... dans une liste (sorted=true), en tri bulle... en inversant
les colonnes dans des variables tabelau afin que le tri soit sur la 2eme qui
deviendrait 1ere, mais il y a sans doute d'autres façons en vbA ???





"claude.vonknechten" a écrit
dans le message de news:

| Bonjour et bonne année à tous
|
| Comme je suis novice avec VB, j'ai un ple de déclaration de tableau
dynamique!
|
| J'ai besoin d'une variable tableau à 2 dimensions que je souhaite remplir
de
| façon dynamique.
| Voici le code que j'ai ecrit et qui ne fonctionne pas!
| dim W_JF()
| i = 0
| While Cells(i + 1, 1).Value <> ""
| ReDim Preserve W_JF(i,1)
| W_JF(i,0) = i
| W_JF(i,1) = Cells(i + 1, 1).Value
| i = i + 1
| Wend
| Pour i = 0, c'est OK.
| pour i = 1 Le message d'erreur est le suivant: l'indice n'appartient pas à
| la selection.
|
| Ensuite j'ai besoin de trier le tableau W_JF sur le contenu de la deuxieme
| colonne.
|
| Je vous remercie pour votre aide précieuse
|
Avatar
Fred
Dans : news:,
claude.vonknechten disait :
Bonjour et bonne année à tous




Bonjour,

J'ai besoin d'une variable tableau à 2 dimensions que je souhaite
remplir de façon dynamique.
Voici le code que j'ai ecrit et qui ne fonctionne pas!



dim W_JF()



Là déjà, je dirais ReDim W_JF(0, 0) mais cela ne résout pas le problème,
voir plus loin.

ReDim Preserve W_JF(i,1)



<extrait de l'aide vba>
Si vous utilisez le mot clé *Preserve*, vous ne pouvez redimensionner
que la dernière dimension du tableau. Vous ne pouvez en aucun cas
modifier le nombre de dimensions. Par exemple, si votre tableau n'a
qu'une dimension, vous pouvez la modifier puisqu'il s'agit de la
dernière et seule dimension. Toutefois, si le tableau compte plusieurs
dimensions, seule la taille de la dernière dimension est modifiable si
vous souhaitez préserver le contenu du tableau
<fin de l'extrait>

Je crois que cela n'est donc pas possible !


Ensuite j'ai besoin de trier le tableau W_JF sur le contenu de la
deuxieme colonne.



Oui, pourrais-tu exposer ton but précisément ? Je doute que tout cela
soit nécessaire.
Si toutefois tu veux continuer ainsi. Je te conseille de déterminer
d'abord le nombre de ligne et de déclarer ton tableau ensuite.
Tu feras une boucle à vide, mais je soupçonne que le temps perdu est
négligeable par rapport à tant de ReDim Preserve.


Je vous remercie pour votre aide précieuse






--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
claude.vonknechten
"Fred" a écrit :

Dans : news:,
claude.vonknechten disait :
> Bonjour et bonne année à tous


Bonjour,

> J'ai besoin d'une variable tableau à 2 dimensions que je souhaite
> remplir de façon dynamique.
> Voici le code que j'ai ecrit et qui ne fonctionne pas!

> dim W_JF()

Là déjà, je dirais ReDim W_JF(0, 0) mais cela ne résout pas le problème,
voir plus loin.

> ReDim Preserve W_JF(i,1)

<extrait de l'aide vba>
Si vous utilisez le mot clé *Preserve*, vous ne pouvez redimensionner
que la dernière dimension du tableau. Vous ne pouvez en aucun cas
modifier le nombre de dimensions. Par exemple, si votre tableau n'a
qu'une dimension, vous pouvez la modifier puisqu'il s'agit de la
dernière et seule dimension. Toutefois, si le tableau compte plusieurs
dimensions, seule la taille de la dernière dimension est modifiable si
vous souhaitez préserver le contenu du tableau
<fin de l'extrait>

Je crois que cela n'est donc pas possible !


> Ensuite j'ai besoin de trier le tableau W_JF sur le contenu de la
> deuxieme colonne.

Oui, pourrais-tu exposer ton but précisément ? Je doute que tout cela
soit nécessaire.
Si toutefois tu veux continuer ainsi. Je te conseille de déterminer
d'abord le nombre de ligne et de déclarer ton tableau ensuite.
Tu feras une boucle à vide, mais je soupçonne que le temps perdu est
négligeable par rapport à tant de ReDim Preserve.


> Je vous remercie pour votre aide précieuse




--
Fred
http://www.cerbermail.com/?3kA6ftaCvT

Tout dabord merci pour ta réponse.


J'ai l'habitude de travailler avec foxpro ou il n'y a pas de probleme pour
redimentionner un tableau d'ou une certaine habitude prise de travailler
comme cela. . . .

Pour expliquer le pourquoi du comment.
Cela concerne la gestion du temps de travail.
J'ai un classeur contenant 2 feuilles.
la premiere nommée PLANNING contient tous les jours de l'annee (une cellule
= 1 jour). Chaque cellule est construite sur la base d'une liste deroulante
contenant la liste des codes à saisir
Par exemple :PC, P, GA, AS.
Cette liste est renseigné en fin de tableau comme cela
PC 1
P 1
GA 0.5
AS 0.5
S2 0
G2 0
A chaque code corespond une duree de travail exprimée en ½ journée, d'ou
l'utilité d'un tableau à 2 dimensions.
La deuxieme feuille de nom CALCUL est construite de façon identique à la
premiere, mais chaque cellule doit contenir non pas le code mais la duree de
travail correspondante.
Par consequent, à la construction (par programmation) de cette deuxieme
feuille, j'ai besoin de connaitre la duree correspondante à chaque code.
pour cela je construis la formule à partir de mon tableau à deux dimensions
contenant codes et valeurs en ½ journée, pour obtenir un truc du style, par
exemple pour la cellule D12 de CALCUL
=SI(OU(PLANNING!D12="PC";D10="P");1;SI(OU(PLANNING!D12="S2";PLANNING!D12="G2");0,5))
en clair si (contenu = PC ou D10) compter 1 et si ( contenu = S2 ou G2)
compter 0.5 etc
Avatar
Fred
Dans : news:,
claude.vonknechten disait :

J'ai un classeur contenant 2 feuilles.
la premiere nommée PLANNING contient tous les jours de l'annee (une
cellule = 1 jour). Chaque cellule est construite sur la base d'une
liste deroulante contenant la liste des codes à saisir
Par exemple :PC, P, GA, AS.
Cette liste est renseigné en fin de tableau comme cela
PC 1
P 1
GA 0.5
AS 0.5
S2 0
G2 0
A chaque code corespond une duree de travail exprimée en ½ journée,
d'ou l'utilité d'un tableau à 2 dimensions.
La deuxieme feuille de nom CALCUL est construite de façon identique à
la premiere, mais chaque cellule doit contenir non pas le code mais
la duree de travail correspondante.
Par consequent, à la construction (par programmation) de cette
deuxieme feuille, j'ai besoin de connaitre la duree correspondante à
chaque code. pour cela je construis la formule à partir de mon
tableau à deux dimensions contenant codes et valeurs en ½ journée,
pour obtenir un truc du style, par exemple pour la cellule D12 de
CALCUL
=SI(OU(PLANNING!D12="PC";D10="P");1;SI(OU(PLANNING!D12="S2";PLANNING!D12="G2");0,5))
en clair si (contenu = PC ou D10) compter 1 et si ( contenu = S2 ou
G2) compter 0.5 etc



OK,
Je te propose une autre solution basée sur l'utilisation de la fonctione
RECHERCHEV.
En bref, il s'agit d'utiliser une plage de cellules dont la première
colonne contient les clés de recherche (PC, P, GA, etc ...)
Les colonnes suivantes contiennent les données associées.
Dans ton cas, cela se résume à deux colonnes, la seconde contenant les
durées.
Et je crois comprendre que ce tableau existe déjà dans ta feuille.

La fonction RECHERCHEV te retourne la valeur associée à la clé de
recherche.
Quelque chose du style :
=RECHERCHEV(clé;plage_de_données;2)
Où clé est donc une référence à une cellule de la page PLANNING (qui
contient un des codes)
plage_de_données est la plage de cellules à deux colonnes contenant les
clés et les valeurs.
2 est le numéro de la colonne (relativement à plage_de_données) qui
contient la valeur à renvoyer.

Ainsi, pour construire ta seconde feuille, la formules à insérer dans
les cellules est toujours la même. Et tu n'as pas besoin de construire
ce tableau problématique ;-)

Cela te convient-il ainsi ?


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Patrice Henrio
Pourquoi ne pas utiliser un type utilisateur qui permettrait de stocker dans
un tableau unidimensionnel les deux champs nécessaires.

Type t_Util
champ1 as tChamp1
champ2 as tChamp2
...
End Type

Dim T() as t_Util

Redim T(1 to N)

Et le preserve marche dans ce cas.

mais je n'ai peut-être pas compris le problème



"claude.vonknechten" a écrit
dans le message de news:



"Fred" a écrit :

Dans : news:,
claude.vonknechten disait :
> Bonjour et bonne année à tous


Bonjour,

> J'ai besoin d'une variable tableau à 2 dimensions que je souhaite
> remplir de façon dynamique.
> Voici le code que j'ai ecrit et qui ne fonctionne pas!

> dim W_JF()

Là déjà, je dirais ReDim W_JF(0, 0) mais cela ne résout pas le problème,
voir plus loin.

> ReDim Preserve W_JF(i,1)

<extrait de l'aide vba>
Si vous utilisez le mot clé *Preserve*, vous ne pouvez redimensionner
que la dernière dimension du tableau. Vous ne pouvez en aucun cas
modifier le nombre de dimensions. Par exemple, si votre tableau n'a
qu'une dimension, vous pouvez la modifier puisqu'il s'agit de la
dernière et seule dimension. Toutefois, si le tableau compte plusieurs
dimensions, seule la taille de la dernière dimension est modifiable si
vous souhaitez préserver le contenu du tableau
<fin de l'extrait>

Je crois que cela n'est donc pas possible !


> Ensuite j'ai besoin de trier le tableau W_JF sur le contenu de la
> deuxieme colonne.

Oui, pourrais-tu exposer ton but précisément ? Je doute que tout cela
soit nécessaire.
Si toutefois tu veux continuer ainsi. Je te conseille de déterminer
d'abord le nombre de ligne et de déclarer ton tableau ensuite.
Tu feras une boucle à vide, mais je soupçonne que le temps perdu est
négligeable par rapport à tant de ReDim Preserve.


> Je vous remercie pour votre aide précieuse




--
Fred
http://www.cerbermail.com/?3kA6ftaCvT

Tout dabord merci pour ta réponse.


J'ai l'habitude de travailler avec foxpro ou il n'y a pas de probleme pour
redimentionner un tableau d'ou une certaine habitude prise de travailler
comme cela. . . .

Pour expliquer le pourquoi du comment.
Cela concerne la gestion du temps de travail.
J'ai un classeur contenant 2 feuilles.
la premiere nommée PLANNING contient tous les jours de l'annee (une
cellule
= 1 jour). Chaque cellule est construite sur la base d'une liste
deroulante
contenant la liste des codes à saisir
Par exemple :PC, P, GA, AS.
Cette liste est renseigné en fin de tableau comme cela
PC 1
P 1
GA 0.5
AS 0.5
S2 0
G2 0
A chaque code corespond une duree de travail exprimée en ½ journée, d'ou
l'utilité d'un tableau à 2 dimensions.
La deuxieme feuille de nom CALCUL est construite de façon identique à la
premiere, mais chaque cellule doit contenir non pas le code mais la duree
de
travail correspondante.
Par consequent, à la construction (par programmation) de cette deuxieme
feuille, j'ai besoin de connaitre la duree correspondante à chaque code.
pour cela je construis la formule à partir de mon tableau à deux
dimensions
contenant codes et valeurs en ½ journée, pour obtenir un truc du style,
par
exemple pour la cellule D12 de CALCUL
=SI(OU(PLANNING!D12="PC";D10="P");1;SI(OU(PLANNING!D12="S2";PLANNING!D12="G2");0,5))
en clair si (contenu = PC ou D10) compter 1 et si ( contenu = S2 ou G2)
compter 0.5 etc



Avatar
claude.vonknechten
"Fred" a écrit :

Dans : news:,
claude.vonknechten disait :

> J'ai un classeur contenant 2 feuilles.
> la premiere nommée PLANNING contient tous les jours de l'annee (une
> cellule = 1 jour). Chaque cellule est construite sur la base d'une
> liste deroulante contenant la liste des codes à saisir
> Par exemple :PC, P, GA, AS.
> Cette liste est renseigné en fin de tableau comme cela
> PC 1
> P 1
> GA 0.5
> AS 0.5
> S2 0
> G2 0
> A chaque code corespond une duree de travail exprimée en ½ journée,
> d'ou l'utilité d'un tableau à 2 dimensions.
> La deuxieme feuille de nom CALCUL est construite de façon identique à
> la premiere, mais chaque cellule doit contenir non pas le code mais
> la duree de travail correspondante.
> Par consequent, à la construction (par programmation) de cette
> deuxieme feuille, j'ai besoin de connaitre la duree correspondante à
> chaque code. pour cela je construis la formule à partir de mon
> tableau à deux dimensions contenant codes et valeurs en ½ journée,
> pour obtenir un truc du style, par exemple pour la cellule D12 de
> CALCUL
> =SI(OU(PLANNING!D12="PC";D10="P");1;SI(OU(PLANNING!D12="S2";PLANNING!D12="G2");0,5))
> en clair si (contenu = PC ou D10) compter 1 et si ( contenu = S2 ou
> G2) compter 0.5 etc

OK,
Je te propose une autre solution basée sur l'utilisation de la fonctione
RECHERCHEV.
En bref, il s'agit d'utiliser une plage de cellules dont la première
colonne contient les clés de recherche (PC, P, GA, etc ...)
Les colonnes suivantes contiennent les données associées.
Dans ton cas, cela se résume à deux colonnes, la seconde contenant les
durées.
Et je crois comprendre que ce tableau existe déjà dans ta feuille.

La fonction RECHERCHEV te retourne la valeur associée à la clé de
recherche.
Quelque chose du style :
=RECHERCHEV(clé;plage_de_données;2)
Où clé est donc une référence à une cellule de la page PLANNING (qui
contient un des codes)
plage_de_données est la plage de cellules à deux colonnes contenant les
clés et les valeurs.
2 est le numéro de la colonne (relativement à plage_de_données) qui
contient la valeur à renvoyer.

Ainsi, pour construire ta seconde feuille, la formules à insérer dans
les cellules est toujours la même. Et tu n'as pas besoin de construire
ce tableau problématique ;-)

Cela te convient-il ainsi ?

Oui super, c'est parfait pour traiter le cas!



Merci beaucoup,

Claude.

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT