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 :

Piéger le coller en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 103
    Points : 58
    Points
    58
    Par défaut Piéger le coller en VBA
    Bonjour,

    J'ai placé du code dans la fonction Workbook_SheetChange pour piéger le coller d'Excel afin d'imposer le collage par valeurs pour ne pas endommager la mise en forme.
    Par contre, si l'origine du collage n'est pas Excel, ça ne marche pas.
    Je sais le faire manuellement, il suffit de ne copier que le texte mais je n'arrive pas à savoir l'origine du copié.
    J'ai cherché dans les forums mais je n'ai rien trouvé de probant.

    Une idée ?

    Cdt, NC

  2. #2
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    J'ai placé du code dans la fonction Workbook_SheetChange
    Merci de bien vouloir nous donner, ici, le code utilisé.

    Par contre, si l'origine du collage n'est pas Excel, ça ne marche pas.
    Peux tu nous décrire précisément la démarche utilisée pour coller qui ne fonctionne pas?

    Lorsque cela ne fonctionne pas, peux-tu annuler le "coller"? (via la barre d'outils ou par Ctrl+Z)
    Cordialement,
    Franck

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Ce n'est pas "l'origine du collé", qu'il t'appartient de déterminer, mais le contenu du presse-papier. Puis décider alors si ce contenu est acceptable ou non.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 103
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Pour être plus précis :

    Je cherche à contrôler la saisie des données dans la feuille.
    Je peux rencontrer plusieurs sortes :
    1 - la saisie au clavier
    Dans ce cas, les vérifications sont prises en charges par Excel par la validation des données des cellules,
    2 - la suppression d'une ou plusieurs cellules
    Ca, c'est OK.
    3 - le collage de données issues d'un collage Excel :
    Ca j'ai contourné par le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    If Application.CutCopyMode Then    
            ' Détournement de la commande coller pour ne coller que les valeurs
            With Application
                If .CutCopyMode Then      
                    .Calculation = xlManual  
                    .Undo                             
                    Selection.PasteSpecial xlPasteValues  
                    .OnUndo "", ""
                    .OnRepeat "", ""
                    .Calculation = xlAutomatic
                End If
            End With
    End If
    Mais si l'origine du copié est Word, Pdf ou autre la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CutCopyMode
    ne sert à rien.
    Pour le collé, il faudrait faire la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.PasteSpecial Format:="Texte"
    Après avoir récupéré le contenu du inséré puis effectué un Undo.
    Mais comment savoir que c'est le presse-papier qui a été collé et pas de la saisie de texte à la manu ?

    A moins de "détourner" le coller peut-être ?

    J'espère que c'est plus clair.

    Cdt, NC

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Re
    Je ne comprends toujours pas, puisque tu peux toujours rejeter une donnée "inacceptable", que ce soit par Undo ou autrement (en gardant par exemple en mémoire la donnée antérieure et en la remettant si la donnée nouvelle ne "convient" pas.
    Mais bon. Tu veux une solution plus que radicale ? --->> vide donc le presse-papier dans l'évènement Worksheet_SelectionChange. Tu forceras ainsi la saisie manuelle.

    Et pourquoi, d'ailleurs, ne pas être plus vicieux encore. Au lieu de vider le presse-papier, on lui met la valeur de la cellule dans laquelle on entre.
    Regarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim ouste As MSForms.DataObject
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If ouste Is Nothing Then Set ouste = New MSForms.DataObject
      ouste.SetText Target.Value
      ouste.PutInClipboard
    End Sub
    Voilà.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 103
    Points : 58
    Points
    58
    Par défaut
    Dsl mais ce n'est pas si simple.

    Je veux qu'ils puissent coller des données depuis un tableur mais pas à partir de Word ou autre.
    Il est possible qu'ils ne collent pas qu'une seule cellule mais qu'ils embarquent dans le presse-papier un ensemble de cellules.

    Ce que je ne comprends pas c'est comment vérifier les données du presse-papier ?
    Car quand je rentre dans la procédure, je ne sais pas si les données ont été saisies à la manu (une donnée dans une cellule) ou encore la sélection d'un ensemble de cellules et l'appui sur la touche Suppr ou bien un collé du presse-papier.

    Si ils ont saisi à la main, il ne faut pas invalider la saisie. Hors le presse-papier peut très bien contenir quelque chose.
    Donc comment différencier les 2 types ?

    Excel fait bien la différence puisque en fonction du copié, il ne propose pas les mêmes options de collage.
    Pour un copié à partir d'Excel il y a la boîte de collage spécial avec les choix valeurs, formats, ... tandis que pour un copié à partir de Word il propose une autre boîte de collage spécial précisant la source Microsoft Office Word ...


    Grr je tourne en rond.

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Je veux qu'ils puissent coller des données depuis un tableur mais pas à partir de Word ou autre
    Ce que tu demandes n'est pas réalisable.
    L'objet ClipBoard est un objet Windows et est unique et géré en mémoire système. Tu ne peux déterminer l'origine de ce qui y est mis.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 103
    Points : 58
    Points
    58
    Par défaut
    Snif je vais essayer de me consoler.

    Mais comment faire pour savoir si les données ont été saisies à la main ou par collé.
    Car je veux bien vider le presse-papier mais je ne dois pas faire un undo systématiquement.
    Seulement quand il y a eu collage.

    Sinon cela supprimera même les données entrées à la main :-(

  9. #9
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    en abordant sous un autre angle ta problématique, peux-tu nous expliquer concrètement pourquoi tu veux éviter le coller provenant de certaines autre applications en particulier (tu laisses entendre que ce n'est pas le cas de toutes) ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 103
    Points : 58
    Points
    58
    Par défaut
    Pour ne pas écraser les formats des cellules et les formules de validation.

    C'est possible en faisant copier / valeurs sous Excel ou copier Texte sans mise en forme.

    Je ne sais comment traiter le presse-papier venant d'une autre appli si je ne sais pas si les données introduites l'ont été à la main ou par collé.
    Je sais différencier le collé d'Excel grâce au code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Application.CutCopyMode Then
    .

    Peut-être la seule solution est d'invalider la fonction de collage d'Excel (mais je ne sais pas faire) et de faire une macro de collage contrôlée accessible avec un raccourci clavier (ça je sais faire).

  11. #11
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Peut-être qu'une approche consistant à les mémoriser pour ensuite les restituer si besoin serait plus efficace que de chercher à détecter les évènements (mise en presse papier) d'une application tierce via l'application Excel.

  12. #12
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Tu vas peut-être trouver ton bonheur dans cette lecture :
    http://www.vbaexpress.com/kb/getarticle.php?kb_id=957
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  13. #13
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Une fois que tu as collé, tu peux appliquer un style prédéfini à ta cellule
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  14. #14
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par unparia Voir le message
    Ce que tu demandes n'est pas réalisable.
    L'objet ClipBoard est un objet Windows et est unique et géré en mémoire système. Tu ne peux déterminer l'origine de ce qui y est mis.
    Ça m'a fait sourciller un petit peu. Dans son cas, il s'agit d'un objet Office. Je me rappelle d'une expérience où j'avais besoin de déterminer je ne sais plus quoi (Je fais trop de trous mémoires maintenant). Application.ClipboardFormat, (voir encore si j'ai pas mal orthographié) permet de façon basique d'examiner le type de contenu dans le presse papier Office et de deviner l'application source.

    Mais comme tout le monde l'a dit, je crois qu'il vaut mieux examiner la donnée sur la feuille et appliquer une mise en forme correspondante à la plage, si Ok.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour NVCfrm

    Mais comme tout le monde l'a dit, je crois qu'il vaut mieux examiner la donnée sur la feuille et appliquer une mise en forme correspondante à la plage, si Ok.
    Je crois avoir bien compris que sa préoccupation essentielle était plutôt l'existence d'une ou plusieurs si copie multiple, validation(s).
    Pour ne rien te cacher, je me penche également sur l'étude de la possibilité d'éviter un "forçage" de la méthode de collage (gênante, voire dangereuse en cas d'interruption brutale). J'ai vite abandonné toutes les approches par examen du contenu du presse-papier (complexe en cas de sélection multiple), pour favoriser une autre approche (plutôt scabreuse et qui pour l'instant se heurte à des gestions complexes d'évènements). Je ne sais pas si cette seconde approche sera fructueuse. Tout ce que je sais, c'est que mes démarches dans ce sens m'ont déjà fait planter plus d'une fois Excel ...
    Je tenterais à nouveau demain (lorsqu'une partie de pêche en surf-casting m'aura suffisamment "épuisé" pour m'obliger à prendre toutes les précautions).
    Amitiés
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  16. #16
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Que se passe-t-il lorsque l'utilisateur effectue une action de Collage (sauf par macro)?
    Quel que soit le type de collé : Collé, Collage spécial, etc..., cette action déclenche deux choses :
    > une modification dans la feuille (des données nouvelles y sont insérées)
    > un ajout dans la liste des actions possibles d'être annulées (Undo)

    Toute modification dans une feuille de calcul Excel déclenche l'événement Worksheet_Change. On peut donc intercepter le coller grâce à cet événement.

    Ce code utilise un événement du classeur. Il convient donc de le placer dans le module ThisWorkbook :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'Lors de tout changement dans les feuilles du classeur
    Dim C As String, I As Long
        'on vérifie dans la barre d'outils 
        With Application.CommandBars("Standard")
            I = .FindControl(ID:=128).Index
            'la dernière action qu'il est possible d'annuler
            C = .Controls(I).List(1)
        End With
        's'il s'agit d'un Coller ==> on lance notre procédure
        If C = "Coller" Then Call AnnuleColler
    End Sub
    Une fois intercepté le "collage", il ne nous reste qu'à l'annuler pour lancer une procédure de collage spécial et/ou de mise en forme des données dans un Range.
    Dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub AnnuleColler()
    'on annule le coller
        With Application
        'on désactive les événements sinon le Undo va déclencher à nouveau SheetChange
            .EnableEvents = False
            .Undo
        'réactivation des événements
            .EnableEvents = True
        End With
     
    'on appelle une procédure de collage et/ou de mise en forme d'un Range
        Call maMacroCollage
    End Sub
    A noter : comme on désactive le gestionnaire d'événement, il est possible qu'en cas de plantage ce dernier ne se réactive pas.
    Pour pallier à cela, il convient de placer dans un module standard cette macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Active_Evenements()
        Application.EnableEvents = True
    End Sub
    Cordialement,
    Franck

Discussions similaires

  1. Problème de copier coller en vba à partir d'excel
    Par Psycho185 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/06/2011, 13h47
  2. [WD-2003] copier/coller en VBA
    Par sellig60 dans le forum VBA Word
    Réponses: 7
    Dernier message: 02/04/2010, 10h27
  3. Problème de copier coller macro VBA
    Par Piernod dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/11/2009, 18h56
  4. Saturation du copier coller avec VBA
    Par frank26 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/11/2008, 09h25
  5. coller formules vba excel
    Par mapmip dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/08/2006, 16h00

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