Ecrire un tableau dans une feuille de calcul

Ecrire un tableau dans une feuille de calcul - VB/VBA/VBS - Programmation

Marsh Posté le 04-05-2017 à 12:08:13    

Bonjour

 

J'ai une problématique en apparence très très simple, mais avec le code que je fais tourner ça ne fonctionne pas du tout, je sollicite donc votre aide sur mon code.

 

J'aimerais tout simplement écrire un tableau dans une feuille excel, et le faire d'un seul coup parce que sinon le temps passé est beaucoup trop long :
D'abord, quand j'utilise le code basique :

Code :
  1. montab = Range("B7:B20" )
  2. Range(Cells(1, 1), Cells(UBound(montab), 1)) = montab


Tout fonctionne

 

Par contre, quand je passe sur mon vrai code, j'ai besoin d'utiliser un tableau de taille variable
J'utilise donc redim preserve.

 

Sur mon vrai code, excel m'écrit 17 000 fois le premier élément du tableau.

 

J'ai essayé de faire un code intermédiaire : simplifié mais avec le redim preserve, et là c'est encore mieux : le truc n'écrit rien du tout

Code :
  1. Dim contenucolonne() As String
  2. For i = 1 To 10
  3. ReDim Preserve contenucolonne(i)
  4. contenucolonne(i) = i
  5. Next i
  6. Range(Cells(1, 1), Cells(UBound(contenucolonne), 1)) = contenucolonne
 

A priori, ce truc devrait écrire entre A1 et A10 les valeurs 1, 2, 3, ... 10
en fait il ne m'écrit rien du tout

 

Comment faire pour résoudre ce problème ?

 

J'avais déjà écrit du code VBA qui faisait ça sans avoir tous ces problèmes, j'ai peut-être oublié un léger détail mais je ne vois pas lequel..

 

Merci!

 

Edit : j'ai remplacé le as string par "as single" dans mon code ci dessus, et maintenant ça écrit quelque chose : uniquement des 0. Alors que la valeur 0 est carrément absente de mon "contenucolonne". Je n'y comprends plus rien..


Message édité par Laska- le 04-05-2017 à 19:05:17
Reply

Marsh Posté le 04-05-2017 à 12:08:13   

Reply

Marsh Posté le 04-05-2017 à 15:29:47    

Bonjour,

 

Merci de baliser les parties de code afin d'améliorer la lisibilité du message.

 

De base les tableaux commencent à l'indice 0 et non 1. Il faut utiliser l'Option base afin de changer le comportement.
Tant qu'à déclarer les variables, autant déclarer i.
Et enfin, les valeurs d'un tableau s'accèdent grâce à l'indice. Votre dernière ligne ne veut donc rien dire...

 
Code :
  1. Option Explicit
  2. Option Base 1
  3. Sub Macro1()
  4. 'declaration des variables
  5. Dim contenucolonne() As Integer
  6. Dim i As Integer
  7. 'écriture du tableau
  8. For i = 1 To 10
  9.     ReDim Preserve contenucolonne(i)
  10.     contenucolonne(i) = i
  11. Next i
  12. 'lecture du tableau
  13. For i = 1 To UBound(contenucolonne)
  14.     Cells(i, 1).Value = contenucolonne(i)
  15. Next i
  16. End Sub

Message cité 1 fois
Message édité par MaybeEijOrNot le 04-05-2017 à 15:31:34

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 04-05-2017 à 16:45:30    

 
           Bonjour,
 
           p'tit rappel :  une variable tableau créée depuis un Range a forcément pour premier indice 1 …


Message édité par Marc L le 04-05-2017 à 16:46:09
Reply

Marsh Posté le 04-05-2017 à 19:06:46    

Option base 1 c'est parfait merci !

MaybeEijOrNot a écrit :


Et enfin, les valeurs d'un tableau s'accèdent grâce à l'indice. Votre dernière ligne ne veut donc rien dire...

 
Code :
  1. Option Explicit
  2. Option Base 1
  3. Sub Macro1()
  4. 'declaration des variables
  5. Dim contenucolonne() As Integer
  6. Dim i As Integer
  7. 'écriture du tableau
  8. For i = 1 To 10
  9.     ReDim Preserve contenucolonne(i)
  10.     contenucolonne(i) = i
  11. Next i
  12. 'lecture du tableau
  13. For i = 1 To UBound(contenucolonne)
  14.     Cells(i, 1).Value = contenucolonne(i)
  15. Next i
  16. End Sub



Là tu fais une boucle pour écrire le tableau dans la feuille
Mais en faisant une boucle on accède plein de fois à la feuille, ce qui prend plus de temps.
Le but c'est de dire :

Code :
  1. 'en pseudo code :
  2. Range(une colonne qui fait la taille du tableau, signalée par la fonction Cells) = le tableau tout entier
 

Le concept c'est de faire un code qui s'exécute super rapidement. Genre 100 fois plus rapidement.
Mais apparemment quelque chose cloche dans mon implémentation...


Message édité par Laska- le 04-05-2017 à 19:10:16
Reply

Marsh Posté le 04-05-2017 à 19:29:16    

Peut être en plaçant la boucle de lecture dans un With Worksheet. Je ne m'y connais pas assez mais doit surement y avoir quelque chose autour du With permettant de faire cela.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 04-05-2017 à 20:22:50    

 
           En VBA Excel :
 
          • Lecture :  Variable tableau = Range
 
          • Ecriture :  Range = Variable tableau …
 

Reply

Marsh Posté le 04-05-2017 à 20:52:45    

Marc L a écrit :

 
           En VBA Excel :
 
          • Lecture :  Variable tableau = Range
 
          • Ecriture :  Range = Variable tableau …
 


C'est ce que j'ai essayé de faire mais ça ne m'écrivait que le premier élément du tableau, et ça le répétait sur toutes les lignes !

Reply

Marsh Posté le 05-05-2017 à 00:19:51    

 
           C'est juste que la variable tableau ne correspond pas au Range !
 
           Compare dans l'autre sens avec une variable tableau alimentée par la même plage de cellules via la fenêtre des Variables locales
           Une plage de cellules correspondant à une matrice de deux dimensions, lignes par colonnes.
 
           Sinon poster le code exactement entrepris accompagné au moins d'une explication claire et complète quant à sa finalité …
 
           

Reply

Marsh Posté le 05-05-2017 à 12:21:49    

Du coup, quel est le moyen le plus adapté dans son cas? WorksheetFunction.Transpose?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 05-05-2017 à 12:38:15    

 
           Oui soit via  Application.Transpose  (mais limitée en nombre d'éléments)
                 soit tout simplement définir une variable tableau en deux dimensions comme un Range !
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed