OVH Cloud OVH Cloud

Tableau Array() en VBA

14 réponses
Avatar
bourby
bonjour,

j'ai du mal avec les tableaux en VBA.
Comment faire en sorte de récupérer dans Tableau1dim les valeurs de la
Plage A1:A10?
Et dans Tableau2dim, les valeurs de la plage A1:C10?
A noter: je souhaite que les 2 tableaux soient des variables String, pas
des variables Range.

D'avance merci pour votre aide.

Bourby

4 réponses

1 2
Avatar
Gaenonius
Comme je fais de nombreux traitements sur ces tableaux,
j'avais l'idée que cela irait plus vite avec les tableaux
qu'en travaillant directement dans les cellules du tableur (même avec
Screenupdating = false).
Après tout, est-ce vraiment le cas?


Il y a eu des tests à ce sujet par le passé entre contributeurs de ce forum (tu
devrais en trouver trace dans les archives) et, de mémoire, il en ressortait que
le travail avec des tableaux, entièrement exécuté en mémoire vive, est toujours
plus rapide que le travail avec les cellules des feuilles de calcul, même en
désactivant le rafraichissement de l'écran.
Maintenant, quand il s'agit de traiter 500 ou 1000 valeurs, le gain de temps,
surtout avec les machines actuelles, doit être de l'ordre de l'infinitésimal.

--
Gaenonius

LSteph wrote:

Bonjour Bourby,

Si la méthode (commedit Daniel)bourrin est
(comme dit Gaenonius) plus rapide, il vaut mieux
savoir le faire en boucle car la source ne sera pas
toujours une plage de cellule mais peut être des éléments
issus de contrôles, d'une collection ou générés dans le code
et le cas sera plus épineux si l'on doit utiliser un tableau à plus
de 2 dimensions.
L'utilisation de 0 to 9 est plus académique que 1 à 10.
En revanche, pas d'accord avec l'idée d'obligation du Variant qui est
plus généraliste mais plus lourd
un tableau peut tout à fait est déclaré comme un autre type de
variable en String ou Integer...

'lSteph





"bourby" a écrit dans le message de news:
%23Q6eiP$

bonjour,

j'ai du mal avec les tableaux en VBA.
Comment faire en sorte de récupérer dans Tableau1dim les valeurs de
la Plage A1:A10?
Et dans Tableau2dim, les valeurs de la plage A1:C10?
A noter: je souhaite que les 2 tableaux soient des variables String,
pas des variables Range.

D'avance merci pour votre aide.

Bourby





bonjour,


et grand merci à tous. Les uns après les autres,
vous avez répondu à plusieurs points que je
n'arrivais pas à maîtriser.
Il me reste juste à redimensionner le tableau
selon la taille de ma plage; je pense qu'un
redim montableau(maplage.rows.count,maplage.columns.count)
fera l'affaire.

Merci aussi pour cells(i,j).
(J'ai un assez grand nb de tableaux, donc il me semble plus
pratique de les nommer; cependant je pourrais nommer les plages, et leur
appliquer la propriété cells). mais j'ai une autre question:
Comme je fais de nombreux traitements sur ces tableaux,
j'avais l'idée que cela irait plus vite avec les tableaux
qu'en travaillant directement dans les cellules du tableur (même avec
Screenupdating = false).
Après tout, est-ce vraiment le cas?

A bientôt de vos nouvelles, éclairées...

Bourby





Avatar
LSteph
Bonsoir Bourby,
Array est une fonction qui appelle un variant, mais on peut faire un
tableau
sans l'utiliser et on peut déclarer celui-ci pour faciliter l'exécution du
code
(et utiliser l'option explicit pour repèrer les types ou variables qui ne
conviennent pas)

Rends toi compte par toi même, mets un timer ou now en début et fin de sub,
sur un petit tableau il n'y a guère de différence entre un tableau déclaré
string ou laissé variant toutefois va voir ce que dit l'aide d'excel sur les
déclarations de tableau ,
c'est assez éloquent surtout concernant l'occupation en octets!
Ensuite teste le remplissage d'un tableau VBA à 3D et d'une plage de cellule
4 feuilles 200 x200 cellules .
Avec ma bécane, il faut 5s pour remplir des feuilles et 10^-2 *0,5 s pour un
tableau déclaré et l'option explicit.

;-) à+

'lSteph





"bourby" a écrit dans le message de news:
%23Q6eiP$

bonjour,

j'ai du mal avec les tableaux en VBA.
Comment faire en sorte de récupérer dans Tableau1dim les valeurs de la
Plage A1:A10?
Et dans Tableau2dim, les valeurs de la plage A1:C10?
A noter: je souhaite que les 2 tableaux soient des variables String, pas
des variables Range.

D'avance merci pour votre aide.

Bourby




bonjour,


et grand merci à tous. Les uns après les autres,
vous avez répondu à plusieurs points que je
n'arrivais pas à maîtriser.
Il me reste juste à redimensionner le tableau
selon la taille de ma plage; je pense qu'un
redim montableau(maplage.rows.count,maplage.columns.count)
fera l'affaire.

Merci aussi pour cells(i,j).
(J'ai un assez grand nb de tableaux, donc il me semble plus
pratique de les nommer; cependant je pourrais nommer les plages, et leur
appliquer la propriété cells). mais j'ai une autre question:
Comme je fais de nombreux traitements sur ces tableaux,
j'avais l'idée que cela irait plus vite avec les tableaux
qu'en travaillant directement dans les cellules du tableur (même avec
Screenupdating = false).
Après tout, est-ce vraiment le cas?

A bientôt de vos nouvelles, éclairées...

Bourby





Avatar
LSteph
Bonsoir Garenonius,
Tout à fait d'accord , pas d'interprètation de ton propos mais une réponse
au souhait de Bourby qui demande comment remplir un tableau As String
Il me semble que l'on dit différemment la même chose.
Pour le remplir ainsi la méthode d'insertion par Array ou Range ne convient
pas
puisqu'il faudrait l'avoir déclaré variant. D'où l'alternative que je
propose.
.

Bonne soirée

lSteph



"Gaenonius" a écrit dans le message de news:

En revanche, pas d'accord avec l'idée d'obligation du Variant qui est
plus
généraliste mais plus lourd
un tableau peut tout à fait est déclaré comme un autre type de variable
en
String ou Integer...


Malheureusement, que tu sois d'accord ou non n'y change rien : pour
affecter les valeurs d'une plage "en bloc" à un tableau, celui-ci _doit_
être de type Variant sinon l'affectation échoue.
C'est une contrainte du langage, qui ne te laisse aucun choix sur ce point
!
Idem, comme noté par Michel Gaboly, lorsqu'on utilise Array (autre forme,
en fait, d'affectation directe).

Si cette contrainte ne te convient pas, ce qui est ton droit, tu peux t'en
tenir à des tableaux renseignés par des boucles, lesquels (comme noté
également par Michel) peuvent être déclarés avec le type de ton choix.

--
Gaenonius

Bonjour Bourby,

Si la méthode (commedit Daniel)bourrin est
(comme dit Gaenonius) plus rapide, il vaut mieux
savoir le faire en boucle car la source ne sera pas
toujours une plage de cellule mais peut être des éléments
issus de contrôles, d'une collection ou générés dans le code
et le cas sera plus épineux si l'on doit utiliser un tableau à plus de 2
dimensions.
L'utilisation de 0 to 9 est plus académique que 1 à 10.
En revanche, pas d'accord avec l'idée d'obligation du Variant qui est
plus généraliste mais plus lourd
un tableau peut tout à fait est déclaré comme un autre type de variable
en String ou Integer...

'lSteph





"bourby" a écrit dans le message de news:
%23Q6eiP$

bonjour,

j'ai du mal avec les tableaux en VBA.
Comment faire en sorte de récupérer dans Tableau1dim les valeurs de la
Plage A1:A10?
Et dans Tableau2dim, les valeurs de la plage A1:C10?
A noter: je souhaite que les 2 tableaux soient des variables String, pas
des variables Range.

D'avance merci pour votre aide.

Bourby








Avatar
Michel Gaboly
Re,

Voici un autre cas où l'affectation directe est pratique : je n'utilise
jamais RowSource (non disponible dans les versions Mac d'Excel) pour
alimenter un Listbox (ou un Combobox).

L'affectation directe :

Listbox1.List = Range("Toto").Value

a l'avantage de fonctionner indifféremment qu'on soit sur Mac ou sous
Windows.


NB - Bien que Value soit la propriété par défaut d'un objet Range, il
est impératif de l'indiquer de façon explicite ici.

Listbox1.List = Range("Toto")

ne fonctionne pas. C'est l'un des rares cas où cette indication
explicite est nécessaire.



En revanche, pas d'accord avec l'idée d'obligation du Variant qui est
plus

généraliste mais plus lourd
un tableau peut tout à fait est déclaré comme un autre type de
variable en

String ou Integer...


Malheureusement, que tu sois d'accord ou non n'y change rien : pour
affecter les valeurs d'une plage "en bloc" à un tableau, celui-ci _doit_
être de type Variant sinon l'affectation échoue.
C'est une contrainte du langage, qui ne te laisse aucun choix sur ce
point !
Idem, comme noté par Michel Gaboly, lorsqu'on utilise Array (autre
forme, en fait, d'affectation directe).

Si cette contrainte ne te convient pas, ce qui est ton droit, tu peux
t'en tenir à des tableaux renseignés par des boucles, lesquels (comme
noté également par Michel) peuvent être déclarés avec le type de ton choix.

--
Gaenonius


Bonjour Bourby,

Si la méthode (commedit Daniel)bourrin est
(comme dit Gaenonius) plus rapide, il vaut mieux
savoir le faire en boucle car la source ne sera pas
toujours une plage de cellule mais peut être des éléments
issus de contrôles, d'une collection ou générés dans le code
et le cas sera plus épineux si l'on doit utiliser un tableau à plus
de 2 dimensions.
L'utilisation de 0 to 9 est plus académique que 1 à 10.
En revanche, pas d'accord avec l'idée d'obligation du Variant qui est
plus généraliste mais plus lourd
un tableau peut tout à fait est déclaré comme un autre type de
variable en String ou Integer...

'lSteph





"bourby" a écrit dans le message de news:
%23Q6eiP$

bonjour,

j'ai du mal avec les tableaux en VBA.
Comment faire en sorte de récupérer dans Tableau1dim les valeurs de
la Plage A1:A10?
Et dans Tableau2dim, les valeurs de la plage A1:C10?
A noter: je souhaite que les 2 tableaux soient des variables String,
pas des variables Range.

D'avance merci pour votre aide.

Bourby









--
Cordialement,

Michel Gaboly
www.gaboly.com



1 2