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

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

10 réponses

1 2
Avatar
Daniel
Bonjour.
Voici la solution pour Tableau1dim :
Sub Test()
Dim Tableau1Dim(10) As String
For Each c In Range("a1:a10")
TableauDim1(c.Row - 1) = c.Value
Next c
For i = 0 To 9
MsgBox Tableau1Dim(i)
Next i
End Sub
Il en va de même pour l'autre plage.
Cordialement.
Daniel

"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
LSteph
Bonsoir Bourby,
Si bien compris (pas sûr) exemples:
'************
Dim montab(10) As String
Dim grotab(10, 3) As String
'***
Sub rempmontab()

For i = 1 To Range("a1:a10").Cells.Count
montab(i) = Range("a1:a10").Cells(i)
Next
MsgBox montab(7)
End Sub
'***
Sub rempgrotab()

For j = 1 To Range("a1:c10").columns.count
For i = 1 To Range("a1:c10").rows.count

grotab(i, j) = Range("a1:c10").Cells(i, j)
Next i
Next j
MsgBox grotab(7, 1) & " , " & grotab(7, 2) _
& " , " & grotab(7, 3)
End Sub

'************

'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
Christian
Bonjour.
Voici la solution pour Tableau1dim :
Sub Test()
Dim Tableau1Dim(10) As String
For Each c In Range("a1:a10")
TableauDim1(c.Row - 1) = c.Value
Next c
For i = 0 To 9
MsgBox Tableau1Dim(i)
Next i
End Sub


Je n'ai pas XL sous la main pour tester mais il me semble que
"la manière bourrin" fonctionne sous VBA:
TableauDim1=range("a1:a10").value

Avatar
LSteph
.....sauf qu'on peut faire 0 to 9 soit mettre count-1 et cells(i+1)...
et appeler 0 pour 1
dans mon ex le 0 n'est pas utilisé
pas très orthodoxe mais me semble plus clair pour les num de cellules.

"LSteph" a écrit dans le message de news:
%23csbfi$
Bonsoir Bourby,
Si bien compris (pas sûr) exemples:
'************
Dim montab(10) As String
Dim grotab(10, 3) As String
'***
Sub rempmontab()

For i = 1 To Range("a1:a10").Cells.Count
montab(i) = Range("a1:a10").Cells(i)
Next
MsgBox montab(7)
End Sub
'***
Sub rempgrotab()

For j = 1 To Range("a1:c10").columns.count
For i = 1 To Range("a1:c10").rows.count

grotab(i, j) = Range("a1:c10").Cells(i, j)
Next i
Next j
MsgBox grotab(7, 1) & " , " & grotab(7, 2) _
& " , " & grotab(7, 3)
End Sub

'************

'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
Daniel
Bonsoir.
Ça coince sur "Tableau1Dim; j'obtiens :
"erreur de compilation", "impossible d'affecter à un tableau".
Cordialement.
Daniel
"Christian" a écrit dans le message de news:
41f81eee$0$18254$
Bonjour.
Voici la solution pour Tableau1dim :
Sub Test()
Dim Tableau1Dim(10) As String
For Each c In Range("a1:a10")
TableauDim1(c.Row - 1) = c.Value
Next c
For i = 0 To 9
MsgBox Tableau1Dim(i)
Next i
End Sub


Je n'ai pas XL sous la main pour tester mais il me semble que
"la manière bourrin" fonctionne sous VBA:
TableauDim1=range("a1:a10").value




Avatar
Gaenonius
La méthode par affectation directe est la plus rapide. N'oublie pas que
- les tableaux doivent être déclarés en Variant (ou déclarés sans type ce qui
revient au même) pour pouvoir recevoir les valeurs d'une plage de cellules par
affectation directe, quel que soit par ailleurs le type des données contenues
dans la plage (texte ou autre)
- les tableaux renseignés par affectation directe d'une plage de cellules sont
des tableaux à _2_ dimensions, et de base 1

au cas zoù :
- la propriété Cells d'Excel est un tableau disponible en standard et qui se
manipule exactement de la même manière...

''''''''''''''
Sub essai()
Dim Tablo1, Tablo2
Tablo1 = Range("A1:A10").Value
Tablo2 = Range("A1:C10").Value
MsgBox Tablo1(10, 1)
MsgBox Tablo2(10, 3)
'tu aurais le même résultat avec la propriété Cells
'disponible en standard et sans effort..
MsgBox Cells(10, 1)
MsgBox Cells(10, 3)
End Sub
''''''''''''''

--
Gaenonius

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
LSteph
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
Bonjour LeSteph,

En fait, il y a une ambiguïté dans le titre de la ficelle :
un tableau n'est pas nécessairement de type Variant, en effet, mais
Variant est obligatoire si on crée le tableau avec Array :

Sub Tableau1()
Dim T As Integer
T = Array(1, 2, 3)
End Sub

entraîne une erreur 13, à cause du type Integer, incompatible avec Array()

Sub Tableau2()
Dim T
T = Array(1, 2, 3)
End Sub

passe très bien, car T est ici un Variant (type par défaut)

Si on crée un tableau sasn utiliser Array, un autre type que Variant est
tout à fait possible. En voici un exemple.

Sub Tableau3()
Dim Mat() As Integer, i As Integer
ReDim Mat(2)
For i = 0 To 2
Mat(i) = 1 ^ 2
Next
End Sub

Quand aux boucles, il vaut mieux savoir les utiliser pour remplir un
tableau, bien sûr, mais chaque fois que c'est possible d'éviter une
boucle, en général, c'est une meilleure option en matière de vitesse
d'exécution.


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


Avatar
bourby
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
Gaenonius
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







1 2