Tableaux VBA : report des données

Bonsoir,

Dans le fichier ci-joint, par la macro Sub Tableau_1(), je charge un tableau à deux dimensions et j’en reporte les données sur ma feuille à l’aide de l’instruction Range("B3:K1002") = Tableau_Z.

Par la macro Sub Tableau_2(), je voudrais en faire de même avec un tableau à 1 dimension, mais l’instruction Range("C2:C2001") = Tableau_X ne fonctionne pas correctement (seule la première valeur est reportée sur toute la plage concernée) alors que ça passe avec l’instruction Range("C2:C2001") = Application.Transpose(Tableau_X).

Avez-vous une idée pourquoi ?

Bonnes salutations.

15demo-tableau-ter.xlsm (109.01 Ko)

Eh Yvouille,

va falloir arrêter le champagne, garçon!

Ton tableau 'Dim Tableau_X' est un tableau virtuel à un e dimension et si tu veux le passer en colonne dans Excel, il faut le transposer en un tableau à deux dimensions dont une, fictive, sera, très justement, transposée en ligne ou colonne, selon ton choix d'affichage.

Ici, en colonne, le transposage, si j'ose dire, crée une dimension ligne, la dimension DIM étant la colonne!

Avec ta commande Range=Tableau, tu tronques l'affichage à la première valeur du tableau (=3) qui se répercute, toute seule, dans toute la colonne.

La même commande, en ligne et en mentionnant la bonne colonne d'arrivée, aurait été parfaite!

A ta santé, l'ami!

Et arrête Excel pour cette nuit!

A+

Hum...

Je l'aurai pas dit comme curulis et...

Pour reformuler et percer tes vapeurs alcoolisées j'allume mes antibrouillards :

Sub Tableau_2()
Dim Tableau_X%(1999, 0), k As Long
Sheets("1 dimension").Activate
Call Effacer_Colonne_C
For k = 0 To 1999
    Tableau_X(k, 0) = (k + 1) * 3
Next k
Range("C2:C2001") = Tableau_X
ActiveWindow.ScrollRow = 1990
End Sub

Ça te va mieux comme ça ?

A+

Ok, je retiens de vos explications que je dois dans tous les cas créer une deuxième dimension fictive, soit par l’instruction Transpose si j’ai un tableau à une dimension, soit en ajoutant cette deuxième dimension de grandeur 0 dans la déclaration du tableau.

Merci beaucoup à tous deux pour votre aide et très bonne année 2017

Bonjour, et meilleurs voeux...

J'ai eu un peu de mal à vous suivre, sachant quand même ce qu'il en est ! La période qui veut ça !

Pour avoir longtemps oeuvré de façon empirique en la matière, je vais m'essayer à un résumé théorique :

Lors de l'affectation d'un tableau à une plage :

  • dans un tableau à 2 dimensions, la 1re s'identifie aux lignes, la 2nde aux colonnes, affectation directe
  • si constitué à partir d'un tableau dynamique dont le nombre de lignes était indéterminé, on a dû placer les lignes en 2e dimension pour pouvoir les augmenter au fur et à mesure, le tableau résultant devra donc être transposé lors de l'affectation
  • un tableau à une dimension se comporte comme un tableau à une seule ligne et autant de colonnes que d'éléments (j'ai toujours trouvé ça illogique, mais...), pas de problème si on l'affecte sur une ligne,
  • pour l'affecter sur une colonne, il faut le transposer.

Lors de l'affectation d'une plage (valeurs) à un tableau :

  • le résultat est toujours un tableau à deux dimensions, même si la plage est à une seule ligne ou une seule colonne
  • l'indice minimal débute toujours à 1.

Cordialement.

Salut MFerrand,

Merci pour ton intervention. Bon, je n’ai pas tout compris, la preuve, je ne m’en sors pas avec un nouvel essai.

Dans le fichier ci-joint, j’ai déclaré Option Base 1 en début de module.

Mon tableau semble correctement chargé, puisque je peux l’utiliser pour le retour sur la feuille à l’aide d’une boucle For/Next (voir le passage marqué ‘Retour A’ dans ma macro). Mais je n’arrive pas à comprendre pourquoi mon passage ‘Retour B’ ne fonctionne pas.

Quelqu’un à une idée ?

Cordialement.

bonjour

essayez de déclarer le tableau comme variant

Dim Tableau_B(10, 5) As Variant, i As Byte, j As Byte

ou

Dim Tableau_B(10, 5) , i As Byte, j As Byte

et pour

Dans le fichier ci-joint, j’ai déclaré Option Base 1 en début de module.

vous n êtes pas obligé de déclarer Option Base 1 sauf si ça vous facilite les taches

C'était autre chose ! Amir a répondu. [Salut en ce début d'année]

Merci à vous deux pour vos interventions.

Effectivement qu’en déclarant les variables différemment, ça va mieux. Dim Tableau_B(10, 5) As Integer passe aussi.

Yvouille a écrit :

vous n êtes pas obligé de déclarer Option Base 1 sauf si ça vous facilite les taches

Effectivement, mais là je fais divers essais et si l’on a plusieurs tableaux dans le module, ça peut être très utile.

Très bonne continuation.

Rechercher des sujets similaires à "tableaux vba report donnees"