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 :

Cliquer sur une cellule et copier/coller la valeur de cette cellule (source) dans une autre (cible) [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut Cliquer sur une cellule et copier/coller la valeur de cette cellule (source) dans une autre (cible)
    Bonjour,

    Voilà 2 jours que je tourne en rond.

    Je cherche, lorsque je clique (ou double-clique) sur une cellule, à copier/coller la valeur de cette cellule (source) dans une autre (cible).
    Par exemple si je clique sur la cellule C5, je souhaite que sa valeur soit copiée en I3.

    J'ai cherché sur le forum et je n'ai pas (ou pas su) trouver la solution.

    Donc je suis passé par des moyens détournés à partir d'un code de Menhir permettant de supprimer une ligne en la sélectionnant.

    Ligne 15, un InputBox permet d'indiquer la ligne à sélectionner (par exemple 5)
    Ligne 18 je croise avec la colonne C (qui est la colonne sur laquelle je dois effectuer ma sélection).

    Cela me donne la cellule C5 pour laquelle je souhaite copier/coller.

    Ce sont ces 2 lignes qui sont de la "bricole" et pour lesquelles je vous interpelle.

    Je vois déjà des et surtout des


    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
    39
    40
    41
    42
    43
    Sub Selection_Cellule1()
    ' Macro test réalisée à partir d'un code de Menhir qui sélectionne une ligne dont on indique le n° dans un InputBox pour la supprimer
     
    ' Efface la donnée en I3 pour partir sur cellule vide
    ' Selection de la ligne
    ' Sélectionne la cellule dans la colonne C croisée avec N° de ligne
    ' Copie/ colle la valeur en I3
    ' Message demandant confirmation (Tuto de Laurent OTT pages 7 et suivantes)
    ' Traitement de la réponse
     
    Dim Rep As String
     
    Range("I3").Delete
     
    Rep = InputBox("Quelle ligne voulez-vous sélectionner ?", "Sélection", Selection.Row)
        If Rep = "" Then Exit Sub
     
    Cells(CLng(Rep), 3).Select 'sélectionne la cellule dans la colonne C croisée avec N° de ligne
     
    Selection.Copy
     
        Range("I3").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
     
         Rep = MsgBox("Vous allez réaliser la facture : " & Range("I3"), _
         vbYesNo + vbQuestion + vbDefaultButton2, _
         "Demande de confirmation")  ' affiche un message OUI / NON (vbYesNo)+ Icone ?
                                     ' + active bouton Non par défaut, titre du MsgBox = Demande de confirmation
     
            If Rep = vbYes Then ' Teste si l'utilisateur a choisi le bouton Oui ?
            Range("I4").Value = "Bravo" ' Si oui, alimente la cellule I4
     
            ' C'est ici que je dois mettre la macro de création de la facture
            ' en ayant mis un dernier message de confirmation "Attention procédure irréversible ! Etes vous certain ?"
     
            Else ' Sinon
     
            'MsgBox "Non." ' Affiche : Non.
            Range("I4").Value = "Non" ' Si non, alimente la cellule I4
            End If
    End Sub
    Vous en conviendrait tout ceci n'est pas très "pro", nous ne sommes pas dimanche mais cela fait bricoleur tout de même, d'autant que cela ne réponds pas à mon souhait.
    Ce n'est qu'un ersatz.
    En revanche travailler sur cette macro m'a permis de découvrir de nouveaux horizons.

    Si une âme charitable pouvait solutionner mon problème...

    Par avance merci

    Philippe

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column = 3 Then
    If Target.Cells.Count = 1 Then Target.Copy Destination:=[I3]
    End If
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut
    Bonjour Patrick

    Merci pour ce code, mais cela ne fait que rendre actif la celle sur laquelle je double clique.
    Aucun collé en I3

    Philippe

  4. #4
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonsoir, J'ai essayé votre procédure, ça marche très bien.
    J'ai rajouté dans la partie code de la feuil1 le code ci dessous et ça semble marcher suivant vos désirs!!!

    Nom : Capture d’écran 2018-05-01 à 19.26.22.png
Affichages : 3520
Taille : 23,8 Ko

    Vous double-cliquez sur n'importe quelle cellule de la ligne trois ou autre et ça démarre

    Cordialement

  5. #5
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut
    Bonjour Messieurs,

    Transitoire,

    Merci pour le code.

    J'ai rajouté dans la partie code de la feuil1 le code ci dessous et ça semble marcher suivant vos désirs!!!

    Vous double-cliquez sur n'importe quelle cellule de la ligne trois ou autre et ça démarre
    Malheureusement j'ai un message d'erreur.

    Nom : Bug.jpg
Affichages : 3601
Taille : 87,8 Ko


    patricktoulon,

    La nuit portant conseil, au final votre code fonctionne.

    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
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'PatrickToulon
    Range("I3").ClearContents
    If Target.Column = 3 Then  'PatrickToulon
    If Target.Cells.Count = 1 Then Target.Copy Destination:=[I3]  'PatrickToulon
    End If
     
    Selection.Copy
     
        Range("I3").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
     
    Rep = MsgBox("Vous allez réaliser la facture : " & Range("I3"), _
         vbYesNo + vbQuestion + vbDefaultButton2, _
         "Demande de confirmation")  ' affiche un message OUI / NON (vbYesNo)+ Icone ?
                                     ' + active bouton Non par défaut, titre du MsgBox = Demande de confirmation
     
            If Rep = vbYes Then ' Teste si l'utilisateur a choisi le bouton Oui ?
            Range("I4").Value = "Bravo" ' Si oui, alimente la cellule I4
     
            ' C'est ici que je dois mettre la macro de création de la facture
            ' en ayant mis un dernier message de confirmation "Attention procédure irréversible ! Etes vous certain ?"
     
            Else ' Sinon
     
            'MsgBox "Non." ' Affiche : Non.
            Range("I4").Value = "Non" ' Si non, alimente la cellule I4
            End If
    End Sub
    Merci pour vos interventions.

    Philippe

  6. #6
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour,
    Je suis surpris que chez vous, excel dise que la sub: Selection_Cellule1 n'existe pas. peut-être lui avez vous donnez un autre nom? ou est elle en "Private"?
    Par ailleurs, vous dites que :
    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
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'PatrickToulon
    Range("I3").ClearContents
    If Target.Column = 3 Then  'PatrickToulon
    If Target.Cells.Count = 1 Then Target.Copy Destination:=[I3]  'PatrickToulon
    End If
     
    Range("I3").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
     
    Rep = MsgBox("Vous allez réaliser la facture : " & Range("I3"), _
         vbYesNo + vbQuestion + vbDefaultButton2, _
         "Demande de confirmation")  ' affiche un message OUI / NON (vbYesNo)+ Icone ?
                                     ' + active bouton Non par défaut, titre du MsgBox = Demande de confirmation
     
            If Rep = vbYes Then ' Teste si l'utilisateur a choisi le bouton Oui ?
            Range("I4").Value = "Bravo" ' Si oui, alimente la cellule I4
     
            ' C'est ici que je dois mettre la macro de création de la facture
            ' en ayant mis un dernier message de confirmation "Attention procédure irréversible ! Etes vous certain ?"
     
            Else ' Sinon
     
            'MsgBox "Non." ' Affiche : Non.
            Range("I4").Value = "Non" ' Si non, alimente la cellule I4
            End If
    End Sub
    Fonctionne, mais sur mon ordinateur, Excel me dit qu'il y a un If sans End IF et chez vous ça semble marcher?? si vous comptez, il y a trois If mais seulement deux End If

    Bizarre ces différences
    Cordialement

  7. #7
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut
    Transitoire,

    Je ne saurais expliquer le pourquoi du comment.
    Je me suis fait la même réflexion mais n'étant pas un pro je me suis dit qu'il devait y avoir une subtilité.

    Je suis donc parti de ce code :

    Citation Envoyé par patricktoulon Voir le message
    re
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column = 3 Then
    If Target.Cells.Count = 1 Then Target.Copy Destination:=[I3]
    End If
    End Sub
    dans lequel j'ai mis ma procédure Sub présentée dans mon premier message en l'élaguant des lignes 15 et 18 (qui étaient de la bricole pour contourner mon problème).
    J'ai même par inadvertance supprimé la ligne 11 Dim Rep As String. Je viens de m'en rendre compte en écrivant ce mesage.
    Et j'ai remplacé Range("I3").Delete par Range("I3").ClearContents

    Toujours est-il que cela fonctionne.
    Lorsque je clique sur la cellule C10 par exemple, je retrouve bien en I3 la valeur de la cellule C10 et le reste de la procédure se déroule correctement. Pour ce qui est des MsgBox et de leur traitement je suis parti du tuto vba-excel-tome-1 de Laurent OTT.
    Lorsque je clique sur la cellule C8 par exemple, je retrouve bien en I3 la valeur de la cellule C8 et le reste de la procédure se déroule correctement.

    Donc il faudrait que Patricktoulon nous explique la présence d'un seul end if dans son code.


    "Je suis surpris que chez vous, excel dise que la sub: Selection_Cellule1 n'existe pas. peut-être lui avez vous donnez un autre nom? ou est elle en "Private"?"
    En lisant votre remarque, je me rends compte que je n'avais rien compris., Je l'ai saisie comme cela.
    Donc, si je met par exemple Selection_C12 et si je double clique, c'est la cellule C12 qui sera traitée par la procédure,
    si je met par exemple Selection_C12 et si je double clique, c'est la cellule C2 qui sera traitée par la procédure.


    Merci

    Philippe

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    mon exemple traduit dans les commentaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column = 3 Then 'si la colonne de la cellule ((target)celle qui est double cliquée)est la 3eme donc"C" alors
    If Target.Cells.Count = 1 Then Target.Copy Destination:=[I3]'si la target contient qu'une seule cellule alors on la copie dans i3
     
    End If
    End Sub
    je dirais meme apres reflexion que la 2d condition n'est pas necessaire dans un doubleclick car un doubleclick ne selectionne qu'une seule cellule et jamais plus
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut
    Bonjour Patrick

    Citation Envoyé par patricktoulon Voir le message
    re
    mon exemple traduit dans les commentaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column = 3 Then 'si la colonne de la cellule ((target)celle qui est double cliquée)est la 3eme donc"C" alors
    If Target.Cells.Count = 1 Then Target.Copy Destination:=[I3]'si la target contient qu'une seule cellule alors on la copie dans i3
     
    End If
    End Sub
    je dirais meme apres reflexion que la 2d condition n'est pas necessaire dans un doubleclick car un doubleclick ne selectionne qu'une seule cellule et jamais plus
    Pour ce qui est de la seconde condition effectivement si je ne la mets pas cela fonctionne tout de même.

    En revanche à l'inverse de ce que je vous ai écrit ce matin, lorsque je clique sur n'importe quelle cellule de n'importe quelle colonne cela lance tout de même la procédure. Le If Target.Column = 3 Then ne marche pas pour ne sélectionner que la colonne C.

    Merci

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Phil333250 Voir le message
    [...]
    En revanche à l'inverse de ce que je vous ai écrit ce matin, lorsque je clique sur n'importe quelle cellule de n'importe quelle colonne cela lance tout de même la procédure. Le If Target.Column = 3 Then ne marche pas pour ne sélectionner que la colonne C.

    Merci
    La procédure est toujours lancée, dès le double click sur n'importe quelle cellule de la feuille. C'est pour cela que le premier IF est là, pour ne copier que si l'on a doublecliqué sur une cellule de la colonne 3, c'est-à-dire C. En résumé, tu entres toujours dans la proc mais tu ne copies en I3 que si tu es en C.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Août 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2019
    Messages : 5
    Par défaut double clic
    re
    bonjour
    je recherche la syntaxe pour copier en I3 non pas la valeur de la cellule mais le n° de la ligne où se situe la cellule

    Merci de votre aide

  12. #12
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x = ActiveCell.Row  ' Le numéro de ligne est dans la variable x
    Vous n'avez plus qu'a adapter a votre code
    Cordialement

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    L'énoncé n'est pas très clair. Je suppose que les cellules mentionnées (C5 et I3) ne le sont que pour exemple. Dès lors, mettre ces cellules en dur dans une procédure n'a pas beaucoup de sens, d'autant plus que le libellé initial du problème est de copier la cellule active (et pas seulement C5) via un clic ou double click.

    Il faudrait peut-être déterminer ce qui suit:
    • La plage dans laquelle le double-click doit opérer, sinon, ça va fonctionner pour toute la feuille ce qui n'est probablement pas le but recherché;
    • La destination: est-elle déductible par code (position relative à la cellule source, par exemple)? Faut-il une table de correspondance?


    De plus, ce n'est pas une bonne chose de mettre le code dans la procédure événementielle. Il est plus judicieux de déporter le traitement dans une autre procédure (du module de la feuille ou d'un module standard) de façon à isoler le code dont la responsabilité est de copier-coller la cellule active. Ca permet de tester le code isolément du reste, et cela rend plus clair le traitement du double-click au cas où d'autres actions sont à prévoir avant le double click sur la feuille pour d'autres plages de la feuille.

    Pour tester le code isolément, on pourra lancer la proc via la fenêtre d'exécution (CTRL+G si pas affichée dans le VBE) et passer la valeur FALSE ou TRUE à la procédure.

    Pour un copier-coller relatif, on pourrait utiliser ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub CopyActiveCellByDoubleClick(Cancel As Boolean)
      'copie relative 4 lignes plus bas et trois colonnes à droite)
      If Not Intersect(ActiveCell, Range("MaPlage")) Is Nothing Then
        ActiveCell.Copy Destination:=ActiveCell.Offset(4, 3)
        Cancel = True
      End If
    End Sub
    Si on souhaite sélectionner la plage d'arrivée, on peut utiliser ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub CopyActiveCellByDoubleClick(Cancel As Boolean)
      Dim Destination As Range
     
      If Not Intersect(ActiveCell, Range("MaPlage")) Is Nothing Then
        Set Destination = Application.InputBox(prompt:="Veuillez sélectionner la cible", Title:="Copier-coller", Type:=8)
        ActiveCell.Copy Destination:=Destination
        Cancel = True
      End If
    End Sub
    Dans tous les cas, la procédure sera appelée sur l'évènement DbleClick de la feuille, en passant Cancel à la procédure de copie pour désactiver le double clic.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      CopyActiveCellByDoubleClick Cancel
    End Sub
    Ces codes sont des exemples à adapter en fonction des réponses aux questions posées à l'entame de mon message
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut
    Bonjour Pierre,

    Merci de vous pencher sur mon problème.


    Je suppose que les cellules mentionnées (C5 et I3) ne le sont que pour exemple. Dès lors, mettre ces cellules en dur dans une procédure n'a pas beaucoup de sens, d'autant plus que le libellé initial du problème est de copier la cellule active (et pas seulement C5) via un clic ou double click.

    Il faudrait peut-être déterminer ce qui suit:
    • La plage dans laquelle le double-click doit opérer, sinon, ça va fonctionner pour toute la feuille ce qui n'est probablement pas le but recherché;
    • La destination: est-elle déductible par code (position relative à la cellule source, par exemple)? Faut-il une table de correspondance?
    Effectivement C5 est un exemple de cellule "sélectionnée"; En revanche I3 est en dur car c'est dans cette cellule et seulement dans celle-ci que doit être renvoyée le contenu de la cellule sur laquelle on clique.

    Quant à la plage dans laquelle le double-click doit opérer, il s'agit uniquement de la colonne C. Et oui, c'est en vous lisant (je ne m'en étais pas rendu compte, focalisé sur mes cellules C.. que j'étais) que j'ai découvert que cliquer sur une une autre cellule lançait tout de même la procédure.

    J'ai donc fait une réponse tronquée à Transitoire.

    Et je comprends le pourquoi de votre MP.


    De plus, ce n'est pas une bonne chose de mettre le code dans la procédure événementielle. Il est plus judicieux de déporter le traitement dans une autre procédure (du module de la feuille ou d'un module standard) de façon à isoler le code dont la responsabilité est de copier-coller la cellule active.
    Je construis mes codes dans les modules, petit bout par petit bout et je les teste donc au fur et à mesure. Lorsque chaque étape est validée, je les réunis dans un code unique, que je teste également. Ce qui doit faire que le code fonctionne bien. Et ce qui fait que mes codes sont atypiques.

    Si j'ai mis le code dans le Private Sub, c'est que je sais pas comment on appelle le code après avoir double cliqué. Solution de novice certainement

    et cela rend plus clair le traitement du double-click au cas où d'autres actions sont à prévoir avant le double click sur la feuille pour d'autres plages de la feuille.
    Il n'y a pas d'autre action de prévue avant.

    Pour les codes que vous m'avez donné, il va me falloir les disséquer pour arriver à les comprendre. Mais c'est bien comme cela que l'on progresse.

    Encore merci

    Philippe

  15. #15
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 281
    Par défaut
    Bonsoir Messieurs

    Euréka, j'y suis arrivé. Un grand merci.

    Patrick,

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)
    If Target.Column = 3 Then copie_target_on_I3 Target, cancel
    End Sub
    J'ai rajouté à votre code une ligne "cancel = True" après le If et ainsi cela bloque la sélection sur toute autre colonne que C.

    Sub copie_target_on_I3(CEL, cancel)
    CEL.Copy Destination:=[I3]
    cancel = True
    End Sub
    Pour la ligne CEL.Copy Destination:=[I3] j'ai mis des commentaires dans mon code suite à différents tests.


    Pierre,
    Citation Envoyé par Pierre Fauconnier Voir le message

    Pour un copier-coller relatif, on pourrait utiliser ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub CopyActiveCellByDoubleClick(Cancel As Boolean)
      'copie relative 4 lignes plus bas et trois colonnes à droite)
      If Not Intersect(ActiveCell, Range("MaPlage")) Is Nothing Then
        ActiveCell.Copy Destination:=ActiveCell.Offset(4, 3)
        Cancel = True
      End If
    End Sub
    je suis parti de la ligne 3 If Not Intersect(ActiveCell, Range("MaPlage")) Is Nothing Then
    que j'ai transformée en If Not Intersect(ActiveCell, Range("c:c")) Is Nothing Then copie_target_on_I3 Target, cancel

    Et cela fonctionne cela bloque la sélection sur toute autre colonne que C.

    Donc, de mon point de vue deux approches différentes pour le même résultat.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean) 'PatrickToulon
     
    'Range("I3").ClearContents 'fonctionne sans mais un 0 apparait furtivement
     
    'Dim Rep As String ' à priori macro fonctionne sans cette ligne
     
        'If Target.Column = 3 Then copie_target_on_I3 Target, cancel 'fonctionne et cela bloque la sélection sur toute autre colonne que C
     
        '******************* A partir d'une ligne de code de Pierre Fauconnier, cela lance la Sub et cela bloque la sélection sur toute autre colonne que C
        If Not Intersect(ActiveCell, Range("c:c")) Is Nothing Then copie_target_on_I3 Target, cancel
     
        'Voir pour mettre un MsgBox "Sélectionner un N° de commandes" + vbQuestion, , "OUPS"
        cancel = True 'bloque la sélection hors colonne C
    End Sub
    Sub copie_target_on_I3(CEL, cancel) 'PatrickToulon
    'CEL.Copy Destination:=[I3] '"renvoie que des 0 si les 4 lignes suivantes de Selection.Copy à Application.CutCopyMode = False
                                 'sont déselectionnées"
                                'Si je déselectionne CEL.Copy..... et que j'active les les 4 lignes suivantes de Selection.Copy à Application.CutCopyMode = False, la macro fonctionne
        Selection.Copy
     
        Range("I3").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
     
    Rep = MsgBox("Vous allez réaliser la facture pour la commande n° : " & Range("I3"), _
         vbYesNo + vbQuestion + vbDefaultButton2, _
         "                 Demande de confirmation")  ' affiche un message OUI / NON (vbYesNo)+ Icone ?
                                     ' + active bouton Non par défaut, titre du MsgBox = Demande de confirmation
     
        If Rep = vbYes Then ' Teste si l'utilisateur a choisi le bouton Oui ?
           Range("I4").Value = "Bravo" ' Si oui, alimente la cellule I4
     
            ' C'est ici que je dois mettre la macro de création de la facture
            ' en ayant mis un dernier message de confirmation "Attention procédure irréversible ! Etes vous certain ?"
     
        Else ' Sinon
     
            'MsgBox "Non." ' Affiche : Non.
            Range("I4").Value = "Non" ' Si non, alimente la cellule I4
     
        End If
     
    End Sub
    Aujourd'hui j'ai pris une bonne leçon.

    Encore merci pour votre aide, votre temps et votre pédagogie.

    A force, les ruisseaux feront des petites rivières, qui feront etc. etc.

    Philippe.

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Ok. Merci pour ces précisions.

    Dès lors, le code donné par Patrick est (presque) fonctionnel.

    Et si rien d'autre ne doit être réalisé sur le double click, pourquoi ne pas laisser le code là? Perso, je le déplacerais dans une procédure spécifique (voir mon exemple) mais bon, on ne va pas chicaner. (pour appeler une procédure sans arguments, il suffit de saisir son nom à l'endroit du code où on souhaite l'appeler).

    Par contre, j'ajouterais la ligne
    juste avant la ligne End If pour sortir du double clic (et j'indenterais mon code )
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/04/2017, 14h58
  2. Copier coller image d'un graphique avec stockage dans une variable
    Par antonysansh dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/02/2017, 16h00
  3. [XL-2007] Dupliquer un graphique dans une feuille sans copier/coller
    Par petitchti dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/08/2016, 19h59
  4. [XL-2007] Réaliser une recherche dans une colonne et copier coller les lignes
    Par Georges50 dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 13/11/2013, 15h39
  5. Insérer une image dans un cellule par copier coller
    Par jalseth dans le forum VBA Word
    Réponses: 2
    Dernier message: 13/08/2008, 18h19

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