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-E] Affecter un tableau à une plage de cellules, serait-ce possible ?


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut [VBA-E] Affecter un tableau à une plage de cellules, serait-ce possible ?
    Comme VBA nous cache plein de choses, j'ai pensé qu'il existait peut-être un fonction cachée...

    J'ai un tableau renseigné, Tableau(25)
    J'ai une plage Range("A1:A25) ou Range($A$1;$A$2;$A$3;$A$4;$A$5;$A$6;$A$7;$A$8;$A$9;$A$10;$A$11;$A$12;$A$13;$A$14;$A$15;$A$16;$A$17;$A$18;$A$19;$A$20;$A$21;$A$22;$A$23;$A$24;$A$25")
    Est-il possible de renseigner toute la plage à l'aide d'une seule ligne de commande ?
    Un truc dans le genre
    Range(Plage) = Tableau
    qui bien sûr ne fonctionne pas...
    Merci de vos nombreuses réponses

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut

    Il y'a ceci dans la FAQ
    http://vb.developpez.com/faqvba/?page=3.4.4#TabVariant

    Je pense que cette partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Montab As Variant, cmpt1 As Long, cmpt2 As Long
    Montab = Range("A1:J65535").Value
    For cmpt1 = LBound(Montab, 1) To UBound(Montab, 1)
        For cmpt2 = LBound(Montab, 2) To UBound(Montab, 2)
            Montab(cmpt1, cmpt2) = Montab(cmpt1, cmpt2) * 2 + 3
        Next cmpt2
    Next cmpt1
    Range("A1:J65535").Value = Montab
    peut t'aider

    Starec

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Merci de ta réponse, Starec. Elle aurait pu m'aider récemment pour répondre à une autre question

    Je vais être plus clair quant à ma question.
    RowSource permet de placer une plage de données dans une liste.
    Avec RowSource, une liste n'est autre qu'un tableau de données solidaire de la plage.
    Je prends "seulement" le problème à l'envers.
    Imagine une liste dont on pourrait modifier les données entraînant la mise à jour de la plage de cellules liée.
    Seulement, ma question porte sur un simple tableau dont la modification entraînerait la mise à jour d'une plage.
    Range(Cells(1, 1), cells(1, Ubound(LeTableau))) = LeTableau (*)
    Un exemple valant mieux qu'un long discours...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Tableau
    Tableau = Array("", "JAN", "FEV", "MAR", "AVR", "MAI", "JUN", "JUL", "AOU", "SEP", "OCT", "NOV", "DEC")
    Set Plage = Range("A1:L1")
    For Each Cel In Plage
         Cel.Value = Tableau(Cel.Column)
    Next
    Ce code écrit Tableau dans la plage A1:L1
    Si je change Tableau(7) = "JUI", je suis contraint de relancer la boucle.
    Je "voudrais" une fonction qui fasse ça sur une seule ligne sans me préoccuper de l'index.
    En outre, ça faciliterait la réponse à bon nombre de questions récurrentes
    Mais je suppose que quelqu'un y a pensé et qu'une dll doit bien exister "quelque part". Non ?


    (*) Pour les pinailleurs LeTableau(0) ne contiendrait pas de valeur

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    une partie de la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub Ousk()
    Dim Tableau
    Dim plage As Range
    Tableau = Array("JAN", "FEV", "MAR", "AVR", "MAI", "JUN", "JUL", "AOU", "SEP", "OCT", "NOV", "DEC")
    Set plage = Range("A1:L1")
    plage.Value = Tableau
    MsgBox "Avant ... " & Range("G1")
    Tableau(7 - 1) = "JUI"
    plage = Tableau
    MsgBox "Apres ...." & Range("G1")
    End Sub

  5. #5
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    En fait, tu voudrais une fonction replace sur un Tableau en quelquesorte ?

    Je crois que j'avais déja vu une réponse, je crois de Alain sur un truc de ce genre, mais faudrait qu eje retrouve le post

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re

    Ton problème est très interressant, voici une idée, peut-être loufoque.

    1 - Création d'une routine avec comme argument
    - ton tableau
    - ta valeur à remplacer
    - où la remplacer

    et cette routine te met ta plage à jour quant tu l'as lancé.
    Ainsi quant tu lances ta sub, tu met tes valeurs en paramètres et cela lance le remplissage de ta plage

    Starec

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Non, Illight, mais c'est toujours intéressant, je compte sur toi
    Je ne veux pas remplacer une donnée dans mon tableau, le but n'est pas celui-ci. Il est d'affecter un tableau à une plage de cellule.
    Mais toute idée est bonne à prendre.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Re

    Pour la transportabilité de cette routine tu pourrais rajouter en paramètres, la feuille et la plage de cellule (où le début de ta plage)

    Quand au DLL ?

    Starec

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par ouskel'n'or
    Non, Illight, mais c'est toujours intéressant, je compte sur toi
    Je ne veux pas remplacer une donnée dans mon tableau, le but n'est pas celui-ci. Il est d'affecter un tableau à une plage de cellule.
    Mais toute idée est bonne à prendre.
    soit je suis bouché ... où tu n'as pas essayé mon code ..

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Désolé, bbil, j'ai encore lu en diagonale.
    Tu as raison, la réponse tient en une ligne : C'est le value qui change tout. Je me confonds en excuses.
    Si je posais la question, au départ, c'est qu'il me semblait bien avoir vu "quelque chose" qui faisait ça sur le forum mais je n'avais pas la syntaxe. Là je ne l'oublierai plus
    Un gros merci bbil ... et à tous les autres.

    Question subsidiaire : si ma plage n'est pas homogène, A1;C1;G1... cette solution fonctionne-t-elle ? Je vais m'empresser de tester ça.

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je viens de tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim plage As Range
    Set plage = Range("$A$1,$C$1,$E$1,$G$1,$A$11,$A$13,$A$17,$A$19,$A$23,$A$29,$A$31,$A$37")
    Dim Tableau
    Tableau = Array("JAN", "FEV", "MAR", "AVR", "MAI", "JUN", "JUL", "AOU", "SEP", "OCT", "NOV", "DEC")
    plage.Value = Tableau
    Pour chaque cellule j'obtiens Tableau(0)
    Peut-être cela a-t-il une utilité (!) mais là je ne vois pas.

    Edit
    Si, on peut faire un calendrier !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim plage As Range
    Dim Tableau
    Dim adresses as string
    Range("A1:Z1").Delete
    Tableau = Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche")
    Adresses = Range("A1:G1,H1:N1,M1:S1").Address
    Set plage = Range(Adresses) 
    plage.Value = Tableau
    ...............................

    NB - Et pendant ce temps là il y en a qui travaillent...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/06/2015, 14h42
  2. Réponses: 3
    Dernier message: 20/07/2009, 12h37
  3. Affecter le vide à une plage de cellule
    Par eclix3 dans le forum Excel
    Réponses: 3
    Dernier message: 10/01/2008, 16h46
  4. affecter un nom à une plage de cellule
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 22/11/2006, 10h37
  5. [VBA-E] [Excel] Protection d'une plage de cellules
    Par fikou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/11/2002, 11h28

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