Peut-on rendre une variable…VARIABLE ? ?

BenHarber

XLDnaute Occasionnel
Bonjour le Forum,
Je ne sais pas comment résoudre le cas suivant :
Soit un tableau qui s’étend de A1 à B100.
La 1ère colonne contient 3 types de valeur (disons 'toto', 'tata' ou 'tutu' disposés aléatoirement)
Je souhaite récupérer dans une « variable variable » (maVar1 puis maVar2…etc…jusqu’à maVari…la valeur qui se trouve en colonne B, disons à côté du mot 'tutu'.

J’ai donc déclaré maVar puis écrit le code suivant :
Set maZone = ActiveSheet.Range(« A1 :A100 »)
i=1
For Each c In maZone
If c.value = « tutu »Then
maVar(i) = c.Offset(0, 1)
i = i + 1
End If
Next c

Cette macro ne plante pas…mais lorsque je souhaite utiliser maVar(i) tout est à vide !

Quelqu’un aurait-t-il un conseil à me donner ?

Merci d’avance

BenHarber
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Bonjour

Essaies ainsi

Dim Mavar() as string

Set maZone = ActiveSheet.Range(« A1 :A100 »)
i=1
For Each c In maZone
If c.value = « tutu »Then
redim preserve mavar(1 to i)
maVar(i) = c.Offset(0, 1)
i = i + 1
End If
Next c

Bon courage
 

BenHarber

XLDnaute Occasionnel
Pascal,
Merci pour la rapidité de ta réponse : je vais essayer de me documenter sur les commandes Redim et Preserve dont j'ignore actuellement l'emploi.
J'ai essayé ta solution en introduisant ''MsgBox Mavar(i)'' pour voir ce que la variable prenait comme valeur : chose que je ne m'explique pas, c'est que le message m'est bien retourné lorsque je suis à l'intérieur de la boucle...mais dès que j'en sors, la macro plante (''erreur d'exécution 9 - Indice en dehors de la plage'')...

Y a-t-il une solution pour utiliser les variables après le passage de cette boucle ?

Merci d'avance pour ta réponse et/ou conseil.

BenHarber
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Re

essaies comme ceci

Dim Mavar() as string

Set maZone = ActiveSheet.Range(« A1 :A100 »)
i=1
For Each c In maZone
If c.value = « tutu »Then
redim preserve mavar(1 to i)
maVar(i) = c.Offset(0, 1)
i = i + 1
End If
Next c

for i = 1 to ubound(mavar)
msgbox mavar(i)
next

Sinon cela doit être normal car comme tu rajoutes 1 à ta valuer de i enf in de boucle ton var(i) n'existe pas

il faudrait faire ainsi sinon

Dim Mavar() as string

Set maZone = ActiveSheet.Range(« A1 :A100 »)
i=0
For Each c In maZone
If c.value = « tutu »Then
i = i + 1
redim preserve mavar(1 to i)
maVar(i) = c.Offset(0, 1)
End If
Next c
 

Hervé

XLDnaute Barbatruc
Bonjour benHarber, pascal :)

Ma contribution au fil.

Si tu veux retrourner tes valeurs de toto, tata, tutu dans un tableau en une seule boucle, tu peux tester ceci :

Sub Bouton7_QuandClic()
Dim c As Range
Dim maVar() As String
Dim x As Byte, ligne As Byte
Dim i As Byte, j As Byte, colonne As Byte

ReDim maVar(1 To 3, 1 To 1)
x = 2

'complete les entetes du tablo
maVar(1, 1) = 'tutu'
maVar(2, 1) = 'tata'
maVar(3, 1) = 'toto'

'boucle sur chaque ligne de la colonne A
For Each c In Range('a1:a' & Range('a65536').End(xlUp).Row)
        x = x + 1
        'affecte la variable colonne suivant le nom
        Select Case c
                Case 'tutu': colonne = 1
                Case 'tata': colonne = 2
                Case 'toto': colonne = 3
                Case Else: colonne = 0
        End Select
       
        'remplit le tableau dynamique
&nbsp; &nbsp; &nbsp; &nbsp; If colonne <> 0 Then 'si colonne=0 c'est que c n'est ni tata, tutu ou toto
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ReDim Preserve maVar(1 To 3, 1 To x)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; maVar(colonne, x) = c.Offset(0, 1)
&nbsp; &nbsp; &nbsp; &nbsp; End If
Next c

'renvoi les données
For i = 1 To UBound(maVar) 'les lignes
&nbsp; &nbsp; &nbsp; &nbsp; ligne = 1
&nbsp; &nbsp; &nbsp; &nbsp; For j = 1 To UBound(maVar, 2) 'les colonnes
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If maVar(i, j) <> '' Then 'exclut les lignes vides
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cells(ligne, i + 4) = maVar(i, j) 'renvoi à partir de la colonne E
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ligne = ligne + 1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If
&nbsp; &nbsp; &nbsp; &nbsp; Next j
Next i
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End Sub


exemple en pièce jointe.

salut
[file name=Classeur3_20051121142750.zip size=8048]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Classeur3_20051121142750.zip[/file]
 

Pièces jointes

  • Classeur3_20051121142750.zip
    7.9 KB · Affichages: 19

BenHarber

XLDnaute Occasionnel
Merci RV.
Avec ça, je vais essayer d'aborder la technique des 'tableaux' que j'ai souvent eu l'occasion de lire mais jamais de faire...
PS : d'ailleurs, si vous connaissez une bonne littérature sur le sujet (ouvrages, sites), je suis preneur !

@+

BenHarber
 

Jam

XLDnaute Accro
Salut BenHarber, Pascal, Hervé,

Ben, je n'ai pas bien compris ce que tu veux faire de tes données, mais ma petite contrib toute simpliste mais fonctionnelle:

Sub Test2()
Dim myArray As Variant
Dim i As Integer
Feuil1.Range('A1').CurrentRegion.Select
myArray = Selection.Value
For i = 1 To UBound(myArray, 1)
&nbsp; &nbsp; &nbsp; &nbsp;
If myArray(i, 1) = 'tutu' Then Debug.Print myArray(i, 2)
Next
End Sub

2 avantages à cette façon de procéder:
- C'est beaucoup, beaucoup, mais alors beaucoup plus rapide si ton tableau est grand (ici, s'il n'y a que 3 cas, cela peut se discuter..quoique :)).
- Si ton range est variable en largeur il faut juste y rajouter le nombre de colonne pour tester correctement le tableau.
Le tableau peut, évidement être Public pour être accédé en dehors de la procédure. Attention dans ces cas là à son utilisation (cf Preserve, ReDim)

Bon courage
 

BenHarber

XLDnaute Occasionnel
Ben alors là...
Je n'ai aucun avis sur le sujet étant novice en matière de tableau...
Mais vous m'avez donné là matière à travailler pour 2 mois au moins !!
Je regarderai tout ça après avoir gobé et digéré les 'Array', 'Redim' et autres 'Ubound'...

@+

BenHarber
 

Jam

XLDnaute Accro
Salut Hervé, BenHarber,

En fait...euh...aucune :lol: :lol: :lol:
Nan, en fait il y a une raison, c'est que j'ai extrait cela d'un vieux bout de code et que j'ai pas recodé cette ligne.
On peux effectivement l'écrire comme cela:
myArray = Feuil1.Range('A1').CurrentRegion.Value
F

Merci de la remarque ;)

Ben, désolé pour le mal de crâne :whistle: :whistle: :lol:
 

Statistiques des forums

Discussions
312 378
Messages
2 087 760
Membres
103 661
dernier inscrit
fcleves