IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

vba: Copier un tableau 1 dimension dans une feuille


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut vba: Copier un tableau 1 dimension dans une feuille
    Bonjour,

    j'ai un petit soucis pour copier un tableau d'une seule dimension dans une feuille Excel.
    Après plusieurs recheches sur le net, j'ai des formules comme

    Application.Range("A1:B9").Formula = tableau

    Mais cela fonctionne que avec un tableau à deux dimensions, si je l'adapte à une dimension comme par exemple:
    Application.Range("A1:A9").Formula = tableau

    cela ne fonctionne pas.


    Enfin j'aimerai faire un tableau à 2 (ou plus) dimensions mais à partir de deux dimensions j'ai le message erreur suivant "Memoire insuffisante", en effet c'est des tableaux à 14400 valeurs donc si je fais Dim tableau (14400,14400) as single j'ai un message d'erreur.

    Merci pour vos réponses

  2. #2
    Membre actif
    Inscrit en
    Août 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Août 2009
    Messages : 284
    Points : 283
    Points
    283
    Par défaut
    Bonjour,

    Pourrais tu préciser un petit peu ton probléme car ce n'est pas clair.
    Est ce que tu a un tableau sur feuille et tu veut le copier (tout ou partie) sur une autre?
    Est ce que tu veux créer un Array pour ensuite pouvoir faire:
    ??

    Essai de mettre un exemple peut etre

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je suis désolé, je vais mettre un exemple

    on va faire un petit tableau mais en vrai il est beaucoups plus grands

    Dim tableau (4) as single

    For i = 0 to 3
    tableau(i)="Nombre"+i
    Next i

    Application.Range("A1:A4").Formula=Tableau


    Voila un peu près, bon c'est un exemple bidon mais en vrai je fais une boucle de 1 a 14400 et donc a chaque boucle j'ajoute une valeur au tableau. A la fin de ma boucle, je veux copier toutes ces valeurs sur la feuille Excel pour pouvoir faire des graphiques.

    Je veux utiliser les tableaux car actuellement ce que je faisais c'est
    For i = 0 to 3
    cells(i,2).value=Nombre"+i
    Next i

    Or celà prend un temps monstre (14400 valeurs) donc je veux utiliser un tableau qui va 20 fois plus vite

    merci

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    En fait j'ai remarqué que si je fais:

    Application.Range("A11").formula=Tableau

    j'obtiens bien toutes les valeurs de mon tableau mais en ligne or j'aimerai qu'ils soient en colone , c'est a dire que je copie mon tableau sur A1 jusqu'a A14400 et si possible sans faire de boucle

    Et pour mon problème du tableau "tableau(14400,14400)" qui m'affiche le message d'erreur "Memoire insuffisante"?

  5. #5
    Membre actif
    Inscrit en
    Août 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Août 2009
    Messages : 284
    Points : 283
    Points
    283
    Par défaut
    Le fait d'ecrire les valeurs dans une feuille ne devrait pas prendre de temps, je viens de faire le test comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub ta()
     
    Application.ScreenUpdating = False
    For i = 1 To 14400
    Cells(i, 2).Value = i + (i / 2)
    Next i
    Application.ScreenUpdating = True
     
    End Sub
    Le temps d'execution de cette macro est inférieur à 2s.

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse, j'ai voulu verifier cela et j'ai fais 4 tests


    le premier:

    Private Sub CommandButton1_Click()
    Dim i As Single
    Dim temps As Single

    temps = Timer
    Application.ScreenUpdating = False
    For i = 1 To 14400
    Cells(i, 2).Value = i + (i / 2)
    Next i
    Application.ScreenUpdating = True
    temps = Timer - temps
    Range("E2") = temps
    End Sub

    me donne 6s (ma machine est moins puissante) mais c'est vrai que je n'avais pas pensé à arreter la mise a jour.

    Le deuxième test est le même que le premier sans Application.ScreenUpdating = False et je mets deux fois plus de temps

    Mon troisième test utilise les tableaux
    Private Sub CommandButton3_Click()
    Dim i As Single
    Dim temps As Single
    Dim monTableau(14400) As Single
    temps = Timer

    For i = 1 To 14400
    monTableau(i - 1) = i + (i / 2)
    Next i
    For i = 1 To 14400
    Cells(i, 3).Value = monTableau(i - 1)
    Next i
    temps = Timer - temps
    Range("E6") = temps
    End Sub

    et je mets 13secondes

    enfin mon dernier test est le même que le troisième sauf que j'ai un tableau à 2dimensions (toujours 0 pour la 2eme colonne) et je ne fais plus de boucle
    Private Sub CommandButton4_Click()
    Dim i As Single
    Dim temps As Single
    Dim monTableau(14400, 1) As Single
    temps = Timer

    For i = 1 To 14400
    monTableau(i - 1, 0) = i + (i / 2)
    Next i

    Range("F1:G14400") = monTableau

    temps = Timer - temps
    Range("E8") = temps
    End Sub

    et je mets 0.14s donc je vais utiliser cela mais l'inconveniant c'est que j'utilise une colonne de ma feuille en plus pour rien

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    mets donc option base 1 en tout début de programme (avant la fonction) et lance à nouveau
    Elle est pas belle la vie ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    merci mais ça ne fait pas avancer plus vite

  9. #9
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Points : 307
    Points
    307
    Par défaut Gestion des tableaux
    Bonjour ,

    J'ai pas mal travaillé sur les tableaux ces derniers temps. A mon avis c'est la méthode qui permet les meilleures performances en terme de rapidité.

    Tu peux consulter l'exellent tutotriel de ce site : "Utiliser les variables tableaux en VBA Excel".

    Lorsque l'on charge un tableau 'rapidement ' à partir d'une plage range , on a forcément untableau à 2 dimensions .
    Pour la ligne entière on a un tableau ( 1 , 1 to N) pour une colonne entière on aura un tableau ( 1to N , 1). ( J'espère que je me fais bien comprendre.

    Pour ramener à une seule dimension , on peut utiliser une structure du style :
    indice = 0
    for each cellule in selection.cells
    indice = indice + 1
    tableau ( indice) = cellule.value
    next
    Avec cette forme on perd déja un peu en terme de rapidité.

    Pour charger automatiquement à partir d'une plage , il faut utiliser la structure du type :

    tableau = range ( "XM:YN") ' rapidité maximum

    Pour traiter l'ensemble des cellules

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for A = ubound ( tableau ,1)  to lbound ( tableau ,1) 
      for B = ubound ( tableau ,2)  to lbound ( tableau ,2) 
    valeur =  tableau ( A , B)
     next 
    next

  10. #10
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Points : 307
    Points
    307
    Par défaut Manipulation de tableau
    Pour completer mes dire, voici un exemple que je te propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub tableau1()
    Dim tab_col1 As Variant
     Dim indice As Integer
     
     tab_col1 = Range("E1:E14400").Value
    indice = LBound(tab_col1, 1)
    For element = 1 To 14400
     tab_col1(element, indice) = tab_col1(element, indice) * (3 / 2)
    Next
     
     Range("E1:E14400") = tab_col1
     
    End Sub

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 114
    Points
    1 114
    Par défaut
    Bonjour,

    sans boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A2").resize(14400,1)=tableau
    si le tableau est à 2 dimensions
    éventuellement suivant l'ordonnancement du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A2").resize(14400,2)=application.transpose(tableau)
    Michel_M

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/08/2010, 08h27
  2. Comment passer un tableau à deux dimensions dans une fonction
    Par Niko_de_bordo dans le forum Débuter
    Réponses: 2
    Dernier message: 02/07/2009, 15h15
  3. Réponses: 1
    Dernier message: 19/02/2007, 19h18
  4. Passage de tableau à deux dimensions dans une session
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 28/11/2006, 18h42
  5. afficher un tableau 2 dimensions dans une fenetre
    Par igor24 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 29/04/2006, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo