Tableau à 3 dimensions ? Cherche solution(s)

Bonjour,

Voici mon problème. (Casse tête pour moi)

C'est un programme qui simule une machine . Je récupère un fichier de la machine (CSV) là pas de problème ..Merci à GMB pour son aide.

Dans un array j'ai mis ceci :

X=Array("K36:K38", "D36:D38", "I36:I38", "B36:B38", "K32:K34", "D32:D34", "I32:I34" ......

Dans un autre j'ai mis ceci

Y=Array("I36:I38", "K36:K38","D36:D38","I32:I34","I32:I34", "D32:D34", "B36:B38" ......

Bon ce ne sont que des extraits ..

Si vous regardez les deux array de prés vous allez remarquer que ce sont les mêmes mais pas dans le même ordre ... BIGREE

Maintenant pour les utiliser il me faut deux choix, soit une réponse "1" soit une réponse "2" et bien sur un chiffre via une boucle qui va chercher mes valeurs dans le array ..

If machinChose ="1" then .... Pour lee Array X
If machinChose ="2" then .... Pour le le Array Y

Ma demande :

Je ne sais pas si c'est faisable mais est-il possible de faire un truc du genre ?

MaVaribla=Array(1,("K36:K38", "I36:I38"),2("D36:D38","K36:K38") etc ....

Mon but étant d'aller chercher la réponse

Choix 1 =

1= K36:K38

2=D36:D38

Choix 2 =

1=I36:I38

2=K36:K38

Etc ....

Si vous avez des idées ...

Merci pour votre aide.

Bonjour,

tu as le droit de faire un array d'arrays :

x = Array("K36:K38", "D36:D38", "I36:I38", "B36:B38", "K32:K34", "D32:D34", "I32:I34")
y = Array("I36:I38", "K36:K38", "D36:D38", "I32:I34", "I32:I34", "D32:D34", "B36:B38")
Z = Array(x, y)
MsgBox Z(0)(3)

tu pourrais le déclarer en une ligne mais c'est plus clair en le déclarant ainsi.
eric

Merci Eric, je vais tester ça demain (Mercredi)

Ok si je comprends bien

MsgBox Z(0)(3) est égal à B36:B38

MsgBox Z(1)(5) est égal à D32:D34

Pas mal du tout ....

Merci

Oui, les index commencent à 0

Tu veux l'item (3) de l'array (0)
eric

suite...

si tu veux un vrai tableau 2D avec indices commençant à 1 tu dois boucler :

Dim x(1 To 2), z(), i As Long, j As Long
x(1) = Array("K36:K38", "D36:D38", "I36:I38", "B36:B38", "K32:K34", "D32:D34", "I32:I34")
x(2) = Array("I36:I38", "K36:K38", "D36:D38", "I32:I34", "I32:I34", "D32:D34", "B36:B38")
ReDim z(1 To UBound(x), 1 To UBound(x(1)) + 1)
For i = 1 To UBound(x)
    For j = 0 To UBound(x(1))
        z(i, j + 1) = x(i)(j)
    Next j
Next i
MsgBox z(1, 1)

mais à ta place, je sélectionnerai mes plages multiples et les nommerais.
Dans la macro tu travailles avec ces noms, qui seront mis à jour si tu insères/supprimes des colonnnes, déplaces ces triplets de cellules. Plus de modif de macro pour ça
Un ajout/suppression se faisant dans le nom

Merci Eric, c'est magique tout ça :)

Que veux tu dires ? quand tu écris :

je sélectionnerai mes plages multiples et les nommerais

Voici ma construction

Il s'agit d'une machine qui vient serrer des vis (les O)

Le rouge c'est une vis qui avait été mal serré , et c'est ça que je veux afficher (les vis mal serrées)

Nous avons deux types

Le premier il y a 9 bloques (de K36 à B4) C'est le grand model

Le second il y a 7 bloques (de K36 à B12)

Les bloques sont : (Ligne 1 (1er bloque) , ligne 2 (2ème bloque), ligne 3 (3ème bloque) etc..)

Jusque que là tout va bien .. là où ça se complique c'est que le serrage de l'un et de l'autres ne commence pas de la même manière

Pour le Grand on commence par le bloque : 5=>6=>4=>3=>2=>1=>7=>8=>9

Et pour le second 5=>6=>4=>3=>2=>1=>7=>8=>9

Voilà

En tout cas merci pour ton aide, deux jours que je suis dessus et il y a de la fumée qui sort de ma tête :) Mais comme j'adore programmer :) Le problème c'est à 59 ans nous n'arrivons plus à se concentrer comme à 20 ans :)

Bonne journée

Bonjour,

ça n'ira pas dans ton cas car j'avais oublié que tu avais des ordres particuliers.
Et dans une plage nommées les areas (sous-plages) sont ordonnées.

eric

Mon test fonctionne à merveille

Pour l'essai en W3 je mets une valeur et lance ma macro ci dessous

Sub TableauxArray()
Dim Vd(1 To 2), z(), i As Long, j As Long
Vd(1) = Array("K24", "D24", "I24", "B24", "K20", "D20", "I20", "B20", "K28", "D28", "I28", "B28", "K32", "D32", "I32", "B32", "K36", "D36", "I36", "B36", "K16", "D16", "I16", "B16", "K12", "D12", "I12", "B12")
Vd(2) = Array("J24", "E24", "H24", "C24", "J20", "E20", "H20", "C20", "J28", "E28", "H28", "C28", "J32", "E32", "H32", "C32", "J36", "E36", "H36", "C36", "J16", "E16", "H16", "C16", "J12", "E12", "H12", "C12")

ReDim z(1 To UBound(Vd), 1 To UBound(Vd(1)) + 1)
For i = 1 To UBound(Vd)
    For j = 0 To UBound(Vd(1))
        z(i, j + 1) = Vd(i)(j)
    Next j
Next i

If Sheets("Graph").Range("W3").Value > 36 Or Sheets("Graph").Range("W3").Value < 1 Then Sheets("Graph").Range("W3").Value = 1
Sheets("Graph").Select
Allumer = RGB(255, 128, 128)

Sheets("Graph").Range(z(1, Range("W3").Value)).Interior.Color = Allumer
Sheets("Graph").Range(z(2, Range("W3").Value)).Value = Range("W3").Value

End Sub

Par contre j'ai une petite question, Peut on monter au delà des 2 : Vd(1) , Vd(2), Vd(3), Vd(4) ????

Car il me faudra aussi 2 autres array ...

suite...

si tu veux un vrai tableau 2D avec indices commençant à 1 tu dois boucler :

Dim x(1 To 2), z(), i As Long, j As Long
x(1) = Array("K36:K38", "D36:D38", "I36:I38", "B36:B38", "K32:K34", "D32:D34", "I32:I34")
x(2) = Array("I36:I38", "K36:K38", "D36:D38", "I32:I34", "I32:I34", "D32:D34", "B36:B38")
ReDim z(1 To UBound(x), 1 To UBound(x(1)) + 1)
For i = 1 To UBound(x)
    For j = 0 To UBound(x(1))
        z(i, j + 1) = x(i)(j)
    Next j
Next i
MsgBox z(1, 1)

mais à ta place, je sélectionnerai mes plages multiples et les nommerais.
Dans la macro tu travailles avec ces noms, qui seront mis à jour si tu insères/supprimes des colonnnes, déplaces ces triplets de cellules. Plus de modif de macro pour ça
Un ajout/suppression se faisant dans le nom

bonsoir a tous..

@eric si tu veux que les arrays commence à 1 tu n'es pas obligé de faire une boucle..

Sauf erreur de ma part.. j'avais vue cette instruction à placer avant la déclaration

Option base 1 

https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/option-base-state...

pour que les tableaux et je suppose les arrays commencent à 1...

Fred

Bonjour à tous,

fred : la boucle est là surtout pour pouvoir créer un tableau 2D, pas pour l'indice de début ;-)
Et je n'utilise jamais option base. Je préfère déclarer l'indice de début dans le dim ou un redim, c'est plus clair pour tout le monde.

Du coup j'ai vu une question de Jefekoi que j'ai zappée...
Oui, tu peux mettre autant de vd que tu veux.
Tu as juste à changer la borne sup de Vd(1 To 2)
eric

Merci Messieurs

Bon désolé je suis loin de parler "technique" je ne connais pour tous les termes ...

Je viens d'avoir un petit BUG

Heureusement j'ai trouvé la réponse (J'suis trop fort :) )

en Fait j'ai 4 Array Vd(1) Vd(2) Vd(3) Vd(4)

Le 1 et le 2 ont moins d'informations que les autres

Le problème était ici :

ReDim z(1 To UBound(Vd), 1 To UBound(Vd(2)) + 1)
For i = 1 To UBound(Vd)
    For j = 0 To UBound(Vd(2))
        z(i, j + 1) = Vd(i)(j)
    Next j
Next i

Si j'ai bien compris , il tient en compte le nombre d'infos qu'il y a dans le premier et garde cette quantité pour les 3 autres array (le premier à 28 infos) donc z(1,28) <==MAX

Et c'est là où était le bug , j'avais besoin de z(3,29) et POUFFF le BUG ...

Pour résoudre le problème j'ai ajouter ceci dans les 2 premiers array "","","",""

Bonjour,

Ah oui, tous doivent avoir la même dimension pour pouvoir aller dans un tableau 2D.
La 2nde dimension n'est pas élastique
eric

Je crois avoir terminé ma Macro

J'suis trop fière , me suis bien débrouillé sauf pour deux trucs, un grand merci à vous pour votre aide. :) Et plus particulièrement à Eric et Gmb pour avoir pris du temps pour m'aider :)

Vive la macro, Vive Excel

Eric

Bonsoir

Dans ce cas...

Fred

Rechercher des sujets similaires à "tableau dimensions cherche solution"