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

Créer variables à la volée

6 réponses
Avatar
josephb
Bonsoir à tous,

dans le cas où on ne connaît pas à l'avance les dimensions d'un tableau
à traiter, quelle est la syntaxe pour créer dans une boucle autant de
variables que de valeurs à stocker ?
genre :

for i = 1 to nbColonnes
temp & i = cells(1,i).value
next

qui retournerait A1 dans temp1, A2 dans temp2, etc.
évidemment ça ne marche pas, mais j'imagine qu'il existe une manière de
le faire ?

Merci de vos lumières


--
J. B.

6 réponses

Avatar
Daniel.C
Bonsoir.
Non, mais tu peux utiliser une variable de type tableau :

temp = Application.Transpose(Range("A1", _
Cells(1, nbColonnes)))

et utiliser temp(1) pour A1, temp(2) pour B1...
Cordialement.
Daniel

Bonsoir à tous,

dans le cas où on ne connaît pas à l'avance les dimensions d'un tableau
à traiter, quelle est la syntaxe pour créer dans une boucle autant de
variables que de valeurs à stocker ?
genre :

for i = 1 to nbColonnes
temp & i = cells(1,i).value
next

qui retournerait A1 dans temp1, A2 dans temp2, etc.
évidemment ça ne marche pas, mais j'imagine qu'il existe une manière de
le faire ?

Merci de vos lumières


Avatar
michdenis
Bonjour Joseph,

2 façons de travailler avec des tableaux (array) et
des plages de cellules :

'---------------------------------------------
Sub test()

'Cela crée un tableau a 2 dimensions de base 1
'le premier élément du tableau est :
'y = x(1,1)

Dim X As Variant
Dim A As Integer, B As Integer
With Worksheets("Feuil1")
X = .Range("A1:C5")
End With

For A = 1 To UBound(X, 1) ' Lignes
For B = 1 To UBound(X, 2) 'Colonnes
MsgBox X(A, B)
Next
Next

End Sub
'------------------------------------

Sub Test1()

'Le tableau sera de base 0, c'est à dire que le premier
'élément du tableau aura comme index 0
' y = temp(0)

Dim Temp(), A As Integer, C As Range
With Worksheets("Feuil1")
For Each c In .Range("A1:C5")
'Le tableau est redimensionné sans perdre ce
'qu'il y a dedans déjà !
ReDim Preserve Temp(A)
Temp(A) = c.Value
A = A + 1
Next
End With
End Sub
'------------------------------------



"Joseph B." a écrit dans le message de groupe de discussion :
1j67mtu.3zancjk0s1gN%
Bonsoir à tous,

dans le cas où on ne connaît pas à l'avance les dimensions d'un tableau
à traiter, quelle est la syntaxe pour créer dans une boucle autant de
variables que de valeurs à stocker ?
genre :

for i = 1 to nbColonnes
temp & i = cells(1,i).value
next

qui retournerait A1 dans temp1, A2 dans temp2, etc.
évidemment ça ne marche pas, mais j'imagine qu'il existe une manière de
le faire ?

Merci de vos lumières


--
J. B.
Avatar
josephb
Bonsoir Daniel,

Daniel.C wrote:


Non, mais tu peux utiliser une variable de type tableau :

temp = Application.Transpose(Range("A1", _
Cells(1, nbColonnes)))

et utiliser temp(1) pour A1, temp(2) pour B1...



Hum, peux-tu me donner un exemple plus scolaire, parce que je ne sais
pas si c'est l'heure avancée de la nuit, mais j'ai les neurones
embrumés : je ne vois pas comment mettre en ½uvre temp(1)... temp(n)
pour leur attribuer la valeur de A1... N1
Et là on reste en dimension 1, n'est-ce pas ?

Merci

Cordialement,
--
J. B.
Avatar
josephb
Bonjour (nuit) MichDenis

michdenis wrote:

2 façons de travailler avec des tableaux (array) et
des plages de cellules :

'---------------------------------------------
Sub test()

'Cela crée un tableau a 2 dimensions de base 1
'le premier élément du tableau est :
'y = x(1,1)

Dim X As Variant
Dim A As Integer, B As Integer
With Worksheets("Feuil1")
X = .Range("A1:C5")
End With

For A = 1 To UBound(X, 1) ' Lignes
For B = 1 To UBound(X, 2) 'Colonnes
MsgBox X(A, B)
Next
Next

End Sub
'------------------------------------



je vais tâcher de tirer parti de cette méthode qui, ne répond que
partiellement à l'idée que j'avais en tête.
L'explorateur d'objet de mon Excel 98 ignore la fonction UBound() dont
je n'ai pas la description ni la syntaxe, mais le principal est que ça
fonctionne.

Sub Test1()

'Le tableau sera de base 0, c'est à dire que le premier
'élément du tableau aura comme index 0
' y = temp(0)

Dim Temp(), A As Integer, C As Range
With Worksheets("Feuil1")
For Each c In .Range("A1:C5")
'Le tableau est redimensionné sans perdre ce
'qu'il y a dedans déjà !
ReDim Preserve Temp(A)
Temp(A) = c.Value
A = A + 1
Next
End With
End Sub
'------------------------------------



Oui, ça marche mais tout le traitement doit se faire dans la boucle,
et sa dimension 1 oblige à un traitement incrémental très contraignant.

Merci de ton aide
Cordialement
--
J. B.
Avatar
michdenis
| Hum, peux-tu me donner un exemple plus scolaire

Seulement si tu définis quelle est la nature du problème
que tu tentes de solutionner en utilisant la notion de
"Tableau". Je ne veux pas t'écrire tout un chapitre de
volume sur le sujet ici.
Avatar
josephb
Bonsoir Michdenis

michdenis wrote:

Seulement si tu définis quelle est la nature du problème
que tu tentes de solutionner en utilisant la notion de
"Tableau". Je ne veux pas t'écrire tout un chapitre de
volume sur le sujet ici.



Merci de ta proposition mais pour l'instant ce ne sera pas la peine.
Il s'agissait de regrouper par "famille" au sein de cellules uniques (et
dans une autre feuille), les contenus de cellules multiples, depuis un
tableau saisi chronologiquement (je ne sais pas si je suis très
clair...). Avec pour contrainte accessoire que Le tableau original soit
rendu intact à la fin.
Pas très à l'aise avec ce que tu m'avais indiqué comme méthode, je me
suis résolu à appliquer classiquement deux boucles imbriquées (lignes x
colonnes) pour récupérer/associer/transférer les données et ça a marché.
Mais cette histoire d'Array, il va bien falloir que je m'y penche un
jour ;-)

Cordialement
--
J. B.