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 :

Affectation de valeurs à une plage discontinue


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut Affectation de valeurs à une plage discontinue
    Bonsoir à tous,

    De la même manière qu'il est possible de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim monTab as Variant
    monTab = Application.Union(.Range("A1:A20"),.Range("D1:D20"),.Range("E1:E20")).Value
    qui renvoie bien un tableau 20 lignes *3 colonnes

    Pourquoi cela ne fonctionne pas dans l'autre sens?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim monTab() as Variant ' futur tableau 20 lignes *3 colonnes
    'Ensuite.on initialise le tableau correctement...
    Application.Union(.Range("A1:A20"),.Range("D1:D20"),.Range("E1:E20")).Value=monTab
    Merci d'avance

  2. #2
    Membre éclairé Avatar de nchal
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 512
    Par défaut
    Bonjour

    Je ne comprend pas vraiment ton problème.
    Tu veux remplir les cellules dans la range avec le tableau.
    Si oui, je te conseille de plutôt passer par des boucles parce que je ne vois pas comment VBA va "copier-coller" la tableau dans des cellules. Tu mets les valeurs de toin tableau une par une dans les cellules de la Range.
    Si non, je te conseille de revoir les bases de la programmation qui sont :
    variable = valeur, sa va dans ce sens la monTab <- maPlage

  3. #3
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    je ne vois pas comment VBA va "copier-coller" la tableau dans des cellules. Tu mets les valeurs de toin tableau une par une dans les cellules de la Range.
    Si non, je te conseille de revoir les bases de la programmation qui sont :
    variable = valeur, sa va dans ce sens la monTab <- maPlage
    Les bases de la programmation je te laisse les revoir. Le type Variant ça sera 1 première base!
    Bien sur que ce genre d'affection est possible et largement plus rapide qu'une boucle for. Documente toi avant d'affirmer n'importe quoi: http://silkyroad.developpez.com/vba/tableaux/#LI

  4. #4
    Membre éclairé Avatar de nchal
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 512
    Par défaut
    Bonjour

    Autant pour moi, je ne savais qu'il était possible de faire ce genre d'affectation. Je n'ai fait que 2 ans de VBA et je n'ai pas encore tout exploré loin de là.

    En suivant tes conseils, j'ai essayé un truc qui apparement marche donc je te laisse voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub test()
     
    Dim monTab As Variant
     
    Dim X1 As Range
    Dim X2 As Range
    Dim X3 As Range
    Dim X4 As Range
     
     
    Set X1 = Range("A1:A20")
     
    Set X2 = Range("D1:D20")
     
    Set X3 = Range("E1:E20")
     
    Set X4 = Union(X1, X2, X3)
     
    X4.Value = monTab
     
    End Sub

  5. #5
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Non ça ne fonctionne pas, de plus tu n'as rien affecté à ton tableau.

    Teste ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Option Base 1
     
    Sub test()
     
        Dim monTab() As Variant
        Dim X1 As Range, X2 As Range, X3 As Range, X4 As Range
     
        ReDim monTab(1 To 20, 1 To 3)
        For i = 1 To 20
            monTab(i, 1) = 1
            monTab(i, 2) = 2
            monTab(i, 3) = 3
        Next i
     
        Set X1 = Range("A1:A20")
        Set X2 = Range("D1:D20")
        Set X3 = Range("E1:E20")
        Set X4 = Union(X1, X2, X3)
     
        Debug.Print X4.Rows.Count
        Debug.Print X4.Columns.Count    'le problème se situe ici: renvoie 1 au lieu de 3
        X4.Value = monTab
     
    End Sub
    et regarde bien le résultat.

  6. #6
    Membre éclairé Avatar de nchal
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 512
    Par défaut
    Bonjour

    Citation Envoyé par issoram Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ReDim monTab(1 To 20, 1 To 3)
        For i = 1 To 20
            monTab(i, 1) = 1
            monTab(i, 1) = 2
            monTab(i, 1) = 3
        Next i
    Je pense que tu voulais plutôt faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ReDim monTab(1 To 20, 1 To 3)
        For i = 1 To 20
            monTab(i, 1) = 1
            monTab(i, 2) = 2
            monTab(i, 3) = 3
        Next i
    et chez moi sa ne marche pas, je pense que le Union n'est pas apprecié par le tableau
    Images attachées Images attachées  

  7. #7
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,

    N'ayant toujours pas résolu le problème, je relance la discussion (qui à priori ne passionne pas les foules)

    Bon we ensoleillé à tous!

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 99
    Par défaut
    Bonjour Issoram, le forum
    si le sujet est intéressant, mais n'ayant pas trop envie pour ma part de lire
    Documente toi avant d'affirmer n'importe quoi:
    surtout que Nicolas veux t'aider alors se faire rembarrer comme cela !!!
    Voilà donc pourquoi à mon sens tu de déchaînes pas les foules.
    Pour ta solution, je vais tout de même te mettre sur la voie!!!
    As-tu vérifier ce que contenait le tableau fait avec ton code, qui de plus, est faux puisque tu as oublié le with , car tu écris .range(etc) donc le with s'impose, mais bon passons là dessus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim monTab as Variant
    monTab = Application.Union(.Range("A1:A20"),.Range("D1:D20"),.Range("E1:E20")).Value
    Si tu vérifies, tu verras que tu n'as que la première colonne A dans ton tableau
    a+
    Papou

  9. #9
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour Paritec,
    surtout que Nicolas veux t'aider alors se faire rembarrer comme cela !!!
    Je te laisse relire l'ensemble de la discussion, mais pour info voilà ce que répondais Nicolas à mon premier post
    Si non, je te conseille de revoir les bases de la programmation qui sont :
    variable = valeur, sa va dans ce sens la monTab <- maPlage
    Enfin bref on ne va pas épiloguer la dessus. J'ai peut être été un peu virulent mais sa réponse n'était pas très constructive
    Si tu vérifies, tu verras que tu n'as que la première colonne A dans ton tableau
    Effectivement tu as raison je suis allé un peu vite en besogne et l'affectation dans le premier sens ne marche pas non plus quand les plages sont non contigües. Mais pourquoi? Cf. le code ci -dessous (avec les With )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Option base 1
     
    Sub test()
     
        Dim monTab As Variant
        Dim ws As Worksheet
     
        Set ws = ThisWorkbook.Worksheets(2)
        With ws
           monTab = Application.Union(.Range("C1:C20"), .Range("D1:D20"), .Range("E1:E20")).Value
        End With
     
        Debug.Print UBound(monTab, 1), UBound(monTab, 2) ' tableau 20 x 3: ok
     
        With ws
           monTab = Application.Union(.Range("A1:A20"), .Range("D1:D20"), .Range("E1:E20")).Value
        End With
     
        Debug.Print UBound(monTab, 1), UBound(monTab, 2) ' tableau 20 x 1???
     
    End Sub

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 99
    Par défaut
    Re issoram le forum
    Ok pas très constructif, mais l'intention elle était bonne et c'est cela qu'il faut retenir.
    Pour ton souci, moi j'ai déjà eu à le faire mais je passe par un boucle sur trois tableaux
    du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for each col in array(1,3,5) 
    aa=feuil1.range(feuil1.cells(1,col),feuil1.cells(25,col))
    feuil2.cells(1,col).resize(ubound(aa),ubound(aa,2))=aa
    next col
    ou alors tu colles l'application union dans une nouvelle feuille est là tu pourras récupérer le tableau complet, mais de toute façon à la recopie tu vas avoir le même problème.
    a+
    papou

  11. #11
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Merci Paritec,

    Oui du coup je m'en sors comme ça, mais j'aimerais comprendre pourquoi Excel sait faire une copie d'une plage non contigüe:
    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 test()
     
        Dim monTab As Variant
        Dim ws As Worksheet
        Dim i As Integer, j As Integer
        Dim affiche As String
     
        Set ws = ThisWorkbook.Worksheets(2)
     
        With ws
            Union(.Range("A1:A20"), .Range("D1:D20"), .Range("E1:E20")).Copy
            .Range("F1").PasteSpecial xlPasteValues 'fonctionne
        End With
    end sub
    mais ne comprend pas l'affectation à un variant de cette même plage...

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 99
    Par défaut
    Re Issoram le forum
    oui et là si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    montab=.range("F1:G20")
    tu auras bien ton tableau avec tes 3 colonnes mais à la recopie cela ne marche pas non plus!!!
    Application union en fait ne marche que dans le cas de copie sur une feuille et le pourquoi??
    alors la parade, non parfaite je te l'accorde, c'est une boucle sur trois tableaux
    a+
    Papou

  13. #13
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bon ben alors va pour la boucle, si pas d'autres solutions.

    Merci à tous.

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

Discussions similaires

  1. affectation de valeur à une constante
    Par Jcpan dans le forum Langage
    Réponses: 3
    Dernier message: 06/07/2010, 14h00
  2. Affecter le vide à une plage de cellule
    Par eclix3 dans le forum Excel
    Réponses: 3
    Dernier message: 10/01/2008, 17h46
  3. [VBA-E] affecter une valeur à une plage
    Par fmorretton dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/04/2007, 17h33
  4. [VBA-E] Affecter un tableau à une plage de cellules, serait-ce possible ?
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/02/2007, 13h59
  5. affecter un nom à une plage de cellule
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 22/11/2006, 11h37

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