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 :

Adressage relatif sur deux plage nommée en vue de faire des copier-coller


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2014
    Messages : 19
    Par défaut Adressage relatif sur deux plage nommée en vue de faire des copier-coller
    Bonjour,

    Existe-t-il un moyen simple pour qu'en cliquant sur une cellule de coordonnées (r,c) d'une plage nommée, elle se voit attribuer la valeurs de la cellule de coordonnées (r,c) d'une autre plage nommée. Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    target = Range("Plage2").Cells(r, c)
    ' où r et c sont respectivement la L-ième ligne et C-ième colonne de Plage1 et corresponde à
    ' la L-ième ligne et C-ième colonne de Plage2.

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Salut !

    Oui via l'évènement de feuille de calculs Worksheet_SelectionChange.

    Les évènements dans la feuille de calcul Excel


    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  3. #3
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.

    Pour trouver l'adresse relative :

    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    If Target.Count <> 1 Then Exit Sub
     
    If Intersect(Range("plage1"), Target) Is Nothing Then
     
    Else
     
     c = Target.Column - (Range("plage1").Column - 1) 'Adresse relative
     
     r = Target.Row - (Range("plage1").Row - 1) 'Adresse relative
     
     Target.Copy Range("plage2").Cells(r, c)
     
    End If
     
    End Sub

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 226
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La propriété Address d'un objet Range peut également renvoyer une adresse relative. Il suffit de mettre les valeurs des deux premiers arguments (facultatifs) à False.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MsgBox Target.Address(RowAbsolute:=False, ColumnAbsolute:=False)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Target.Address(False, False)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2014
    Messages : 19
    Par défaut
    Merci à vous trois de m'aider.

    Je me rends compte que j'ai mal formulé ma demande . Alors je la reformule .

    Existe-t-il une méthode ressemblant à LaMéthode(Target,Plage1, Plage2,[NbLigneSupp],[NbColonneSupp]) qui ferai :

    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
    Sub LaMéthode (ByVal target As Range, byref Plage1 as Variant, byval Plage2 as Variant, Optional byval NbLigneSupp as long = 0, Optional byval NbColonneSupp as long =0 )
      
      '
      '
      ' Déclaration, test et début de code
      '  
      '
      With Sheets("Feuille de la plage2")
        r = .Range(Plage2).Row - Range(Plage1).Row + target.Row                                   ' où ici Plage1 et Plage2 sont les noms de plages nommées dans la
        c = .Range(Plage2).Column - Range(Plage1).Column + target.Column                          ' collection Names du classeur actif
        plage = CStr(Range(Cells(r, c), Cells(r +NbLigneSupp, c + NbColonneSupp)).Address)
        .Range(plage).Copy target
      End With
       '
       ' Suite du code et traitement des errreurs
       '
    End Sub
    Par exemple, si Target pointe sur la cellule de la 2ième ligne et le la 3ième colonne de la plage 1 (nommée "Plage1" dans la collection Names du classeur), alors cette cellule prendra la valeur et la mise en forme de la cellule de la 2ième ligne et de la 3ième de la plage 2(nommée "Plage2" dans la collection Names du classeur). Les options étant omises.

    Ou quoique ce soit d'autre, pour alléger le code.

  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Voici une autre suggestion.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    Application.EnableEvents = False
     
    Call CopierVersSelection(Target)
     
    Application.EnableEvents = True
     
    End Sub
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    'Dans un module
     
    Sub CopierVersSelection(Target)
     
    nomDestine = "Plage1"
     
    nomOrigine = "Plage2"
     
    'ou si requis plus de precision
    ' nomOrigine = "[" & ThisWorkbook.Name & "]" & "Feuil2" & "!" & "Plage2"
     
    If Intersect(Target, Range(nomDestine)) Is Nothing Then
     
    Else
     
     Set Dest = Target
     
      Range(nomOrigine).Copy
     
     Set origin = Range(nomOrigine)
     
     lng_R = Dest.Row - (Range(nomDestine).Row - 1)
     lng_C = Dest.Column - (Range(nomDestine).Column - 1)
     
     Lignes_dans_Dest = Dest.Rows.Count
     Colonnes_dans_Dest = Dest.Columns.Count
     
     Call Copier(origin, lng_R, lng_C, Lignes_dans_Dest, Colonnes_dans_Dest, Dest)
     
    End If
     
    End Sub
     
    Sub Copier(origin, lng_R, lng_C, Lignes, Colonnes, Dest)
     
    origin.Cells(lng_R, lng_C).Resize(Lignes, Colonnes).Copy Dest.Cells(1, 1)
     
    End Sub

Discussions similaires

  1. STEP 7 : adressage indirect sur une plage de données
    Par ClownTriste dans le forum Automation
    Réponses: 6
    Dernier message: 14/09/2016, 12h15
  2. Réponses: 4
    Dernier message: 03/09/2015, 13h32
  3. Réponses: 1
    Dernier message: 14/06/2013, 00h07
  4. Faire un copier coller sur un JTextField
    Par Marie.B dans le forum Composants
    Réponses: 6
    Dernier message: 16/07/2009, 15h04
  5. Nombre de cellule Si 2 conditions sur deux plages
    Par CNANJO dans le forum Excel
    Réponses: 1
    Dernier message: 24/12/2008, 07h17

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