Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1907 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Ecrire un tableau dans une feuille de calcul

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ecrire un tableau dans une feuille de calcul

n°2300174
Laska-
Posté le 04-05-2017 à 12:08:13  profilanswer
 

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
mood
Publicité
Posté le 04-05-2017 à 12:08:13  profilanswer
 

n°2300192
MaybeEijOr​Not
but someone at least
Posté le 04-05-2017 à 15:29:47  profilanswer
 

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.
n°2300193
Marc L
Posté le 04-05-2017 à 16:45:30  profilanswer
 

 
           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
n°2300207
Laska-
Posté le 04-05-2017 à 19:06:46  profilanswer
 

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
n°2300211
MaybeEijOr​Not
but someone at least
Posté le 04-05-2017 à 19:29:16  profilanswer
 

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.
n°2300214
Marc L
Posté le 04-05-2017 à 20:22:50  profilanswer
 

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

n°2300215
Laska-
Posté le 04-05-2017 à 20:52:45  profilanswer
 

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 !

n°2300217
Marc L
Posté le 05-05-2017 à 00:19:51  profilanswer
 

 
           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é …
 
           

n°2300245
MaybeEijOr​Not
but someone at least
Posté le 05-05-2017 à 12:21:49  profilanswer
 

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.
n°2300246
Marc L
Posté le 05-05-2017 à 12:38:15  profilanswer
 

 
           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 !
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Ecrire un tableau dans une feuille de calcul

 

Sujets relatifs
Je voudrais sélectionner une ligne du tableauselection ligne tableau pour requête
Écrire à une adresse précise dans la RAM (nasm)[PHP] Tableau automatique, mais des lignes sautent
Lire et écrire dans disque dur SATAfaire un return d'un tableau
Passer d'un tableau de byte en label une imageEcrire un fichier sur le serveur en Javascript
Regex Split tableauAnnuler une fusion et ré-écrire les données dans les cellules vides
Plus de sujets relatifs à : Ecrire un tableau dans une feuille de calcul


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR