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 :

Mettre une variable dans Range()


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Par défaut Mettre une variable dans Range()
    Bonjour,

    Je bloque sur fonction VBA, qui est "censée" me permettre après la saisie d'une condition sur un formulaire, de copier un ensemble de lignes d'une feuille puis de le coller sur une autre feuille.

    L'idée est de boucler sur les lignes qui m’intéressent de la feuille2 pour tester si la valeur de sélectionnée sur le formulaire correspond à celle de la première cellule de la ligne.
    Lorsque la valeur de la ligne correspond à ma condition je souhaite copier cette ligne sur la feuille1.
    C'est à cet endroit où je bloque. Je ne sais pas ce qu'il faut mettre dans "Range" pour que la ligne soit copiée.

    Voici mon code :

    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
    25
    Private Sub CommandButton1_Click()
     
    Dim a, b As Range
    Dim test As Integer
    Dim address1 As String
    Dim formattedAddress As String
     
    Set a = Sheets("Feuil2").Range("C6:E25")
     
    For Each b In a.Rows
        test = b.Cells(a.Row, 1).Value
        SelectedValue = ComboBox1.Value
        address1 = b.Address
        'formattedAddress = Chr(34) & address1 & Chr(34)
     
        If test = SelectedValue Then
            'Sheets("Feuil1").Range(b.Address) = Sheets("Feuil2").Range(b.Adress)
            'Sheets("Feuil2").Range("$C$6:$E$6").Copy
            'Sheets("Feuil1").Range("$C$6:$E$6").Paste
            Sheets("Feuil1").Range(formattedAddress).Value = Sheets("Feuil2").Range(formattedAddress).Value
        End If
     
    Next
     
    End Sub
    J'ai mis l'adresse en dur et ça fonctionne sans problèmes.. pour une ligne
    J'ai essayé de mettre l'adresse du rang en question en tant que string dans range mais ça ne semble pas fonctionner. D'après ce que j'ai compris les doubles quotes sont nécessaires.

    Avez-vous une solution ou une idée ?

    Merci

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub CommandButton1_Click()
        Dim b As Range
        For Each b In Sheets("Feuil2").Range("A6:A25")
            If b.Value = Range(ComboBox1.Value) Then b.Offset(0, 2).Resize(1, 3).Copy Sheets("Feuil1").Range("C6")
        Next b
    End Sub
    Tu devras peut-être modifier le Range("C6") car tu ne dis pas clairement à quel endroit de Feuil1 tu veux placer ta copie.

  3. #3
    Membre chevronné Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Par défaut
    Salut, merci pour ta réponse. J'ai modifié un peu la boucle que tu m'a donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    i = 6
    k = ComboBox1.Value
     
     
    For Each b In Sheets("Feuil2").Range("C6:C25")
        If b.Value = k Then
            b.Resize(1, 3).Copy Sheets("Feuil1").Range("C" & i)
            i = i + 1
        End If
    Next b
    Petit soucis de typage dans la condition du If, j'ai mis ComboBox1.Value dans la variable k en tant que int.
    J'ai ajouté un int i incrémenté de 1 après chaque if vérifié pour passer à la ligne suivante lorsque la copie est réalisée (J'ai constaté qu'en laissant C6 la ligne était écrasée par la nouvelle à chaque If verifié).

    Le code fonctionne correctement, par contre j'aimerais bien comprendre dans ton exemple la succession du offset et du resize.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b.Offset(0, 2).Resize(1, 3).Copy
    Peux tu me confirmer que via le offset tu étends la sélection à + 2 cellules par rapport à l'initiale et via le Resize tu ajoutes une ligne + 3 cellules ce qui rendrait l'incrémentation du i inutile dans mon dernier exemple ?

    Merci

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Julien698 Voir le message
    j'ai mis ComboBox1.Value dans la variable k en tant que int.
    Je ne vois pas trop l'intérêt.
    Si tu voulais transformer le texte en entier, autant utiliser la fonction CInt().

    J'ai ajouté un int i incrémenté de 1 après chaque if vérifié pour passer à la ligne suivante lorsque la copie est réalisée (J'ai constaté qu'en laissant C6 la ligne était écrasée par la nouvelle à chaque If verifié).
    Je t'avais prévenu. La destination n'étant pas indiquée dans ta demande, je n'avais pas d'autre référence que ce qui se trouvait dans ton code précédent.

    j'aimerais bien comprendre dans ton exemple la succession du offset et du resize.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b.Offset(0, 2).Resize(1, 3).Copy
    Peux tu me confirmer que via le offset tu étends la sélection à + 2 cellules par rapport à l'initiale et via le Resize tu ajoutes une ligne + 3 cellules ce qui rendrait l'incrémentation du i inutile dans mon dernier exemple ?
    Offset déplace la référence de deux colonne vers la droite et Resize la passe à 3 colonnes.
    Dans ta demande, tu indiques que tu voulais tester "la première cellule de la ligne". Pour moi, la première cellule, c'est la colonne A. Raison pour laquelle mon For Each tournait sur la colonne A.
    Comme tu voulais copier les colonnes C à E, il fallait transformer A en C:E, d'où ces deux propriétés.

  5. #5
    Membre chevronné Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Par défaut
    Offset déplace la référence de deux colonne vers la droite et Resize la passe à 3 colonnes.
    Dans ta demande, tu indiques que tu voulais tester "la première cellule de la ligne". Pour moi, la première cellule, c'est la colonne A. Raison pour laquelle mon For Each tournait sur la colonne A.
    Comme tu voulais copier les colonnes C à E, il fallait transformer A en C:E, d'où ces deux propriétés.
    J'ai bien compris ! Merci

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

Discussions similaires

  1. [XL-2007] Peut-on mettre une variable dans une plage range
    Par scoubi77 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/09/2014, 18h54
  2. Mettre une variable dans un range
    Par guismoman33 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/11/2007, 14h05
  3. mettre une variable dans Target.Address
    Par lilemy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/06/2007, 15h47
  4. Réponses: 2
    Dernier message: 10/04/2007, 23h43
  5. [Excel]Mettre une variable dans une fonction
    Par soad029 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/04/2006, 12h00

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