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 :

N'autoriser que le copier-coller par valeur sur un onglet


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut N'autoriser que le copier-coller par valeur sur un onglet
    Bonjour à tous
    Dans un onglet Sheet excel protégé où des cellules sont verrouillées et d'autres pas, j'aimerai que les cellules non verrouillées, qui ont une mise en forme prédéfinies (format, couleur, formats conditionnels, validation, etc), conservent leur mise en forme et que seule leurs valeurs puissent être modifiables soit par saisie directe ou soit par copier-coller par valeur.
    La solution doit fonctionner quel que soit le paramétrage d'excel de l'utilisateur.

    Je joins un fichier test pour mieux me faire comprendre. Voir mon 3ème post (3ème version)
    Je n'ai réussi qu'à empêcher tous les copier-coller sur la feuille Dest.

    Comment n'autoriser que le copier-coller valeur afin de conserver la mise en forme, et les tests de Domaine de valeurs ?

    Merci pour votre aide
    Bien cordialement
    Lionel

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Personne pour me répondre ?

    Grace à Kiki29 qui répondait à une question similaire le 18/06/2008 sur un autre forum

    Je croyais avoir trouvé pour partie réponse à mon propre problème ce Samedi 01/11/2008 à 16 heures
    Voir pièce jointe mais cela ne fonctionne pas ou pas bien.

    Mais j'aurai besoin de votre aide pour trouver l'erreur et résoudre les points suivants à moins que vous n'ayez une autre idée.

    Merci à celui ou ceux qui voudront bien s'y intéresser.

    1) Il faut soit inhiber le clic droit soit gérer le copier et le coller à l'aide du bouton droit de la souris
    2) Dans le menu Edition, il reste à gérer le choix Recopier ou alors l'interdire
    3) Enfin, comment faire pour vérifier que le collage respecte bien le domaine de valeur ?
    Si la valeur d'une des zones en copie, ne respecte pas le domaine de valeur défini dans Validation, alors
    il ne faut pas coller mais afficher un message indiquant la zone concernée

    Merci beaucoup pour votre aide.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    J'avance mais malheureusement tout seul.
    Cela fonctionne mais uniquement si l'utilisateur utilise les raccourcis Ctrl C et Ctrl V. S'il passe par le menu, le copie coller par valeur n'est pas forcé.

    Il me reste 3 choses à trouver. Si quelqu'un a une idée , je suis preneur.
    1) Comment faire en sorte que les Coller du menu Edition ou clic droit exécutent le code associé au Onkey ?

    2) ou alors comment ne pas afficher le menu à la limite ?


    3) Au niveau du Copier Coller par Valeur, est-il possible avant de coller de vérifier que la valeur respecte le domaine de valeur ?
    Et ce pour chaque cellule … Si au moins 1 cellule du copier/coller valeur est hors du domaine alors ne pas copier et afficher une boîte de dialogue
    indiquant les désaccords .

  4. #4
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Ceci devrait te permettre de voir le bout du tunnel

    • A insérer 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
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      Sub coller_off()
      With CommandBars(1).Controls("Edition")
          .Controls("Coller").Enabled = False
          .Controls("Collage spécial...").Enabled = False
      End With
      With CommandBars("Cell")
          .Controls("Coller").Enabled = False
          .Controls("Collage spécial...").Enabled = False
          On Error Resume Next
          With .Controls.Add(msoControlButton, , , 3, True)
              .Caption = "Coller la valeur"
              .OnAction = "Col_valeur"
          End With
      End With
      End Sub
       
      Sub coller_on()
      With CommandBars(1).Controls("Edition")
          .Controls("Coller").Enabled = True
          .Controls("Collage spécial...").Enabled = True
      End With
      With CommandBars("Cell")
          .Controls("Coller").Enabled = True
          .Controls("Collage spécial...").Enabled = True
          On Error Resume Next
          .Controls("Coller la valeur").Delete
      End With
      End Sub
       
      Sub Col_valeur()
          On Error Resume Next
          Selection.PasteSpecial Paste:=xlPasteValues
          Application.CutCopyMode = False
      End Sub
    • A insérer dans le module ThisWorkbook
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      Private Sub Workbook_BeforeClose(Cancel As Boolean)
      coller_on
      End Sub
       
      Private Sub Workbook_Open()
      coller_off
      End Sub


    Les boutons "Coller" ou "Collage spécial" du menu Edition et du menu contextuel sont désactivés. Un nouveau bouton "Coller valeur" est créé dans le menu contextuel (clic droit)

    Cdlt
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup Fring . Je découvre votre réponse alors que je viens de terminer ma version 3 qui fonctionne.

    Reste cependant 2 choses à faire : en fait 1 à 19h ce dimanche

    1) Gérer le menu contextuel (clic droit) pour inhiber et ajouter mes propres menus pour Copier, Coller, Couper comme je l'ai fait dans le menu Edition qui en interne s'appelle "Edit"
    Je suppose que dans votre réponse, le menu contextuel de la commande barre s'appelle "Cell" ? Est-ce bien cela ? Je vais tester. Car il suffit alors de rajouter quelques lignes pour résoudre ce point 1. C'était bien ça. J'ai donc ajouté quelques lignes dans le fichier joint. Le point 1 est donc résolu Merci Fling pour le nom Cell : cela m'a évité de rechercher parmi tous les menus !
    Et "Edition" c'est "Edit" ? les 2 sont acceptés ?

    2) Au niveau de mon Copier Coller par Valeur, est-il possible avant de coller de vérifier que la valeur respecte le domaine de valeur ?
    Et ce pour chaque cellule … Si au moins 1 cellule du copier/coller valeur est hors du domaine alors ne pas copier et afficher une boîte de dialogue
    indiquant les désaccords . --> peut-être par Sendkey ? Enter

    Avez-vous une idée pour ce 2ème point ?
    Voir fichier joint

    Je pense que cela pourra intéresser d'autres personnes de pouvoir gérer les copier coller tout en respectant la mise en forme et les domaines de valeur.

    A bientôt de vous lire pour le point 2 qui reste à résoudre.

  6. #6
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonsoir,
    Le plus propre serait de faire un hook sur la notification d'évènements et les traiter en fonction des circonstances.
    Il existe un exemple sur allapi : adapter le code avec WM_CHANGECBCHAIN à la place de WM_DRAWCLIPBOARD

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci Darkvader
    mais pouvez-vous me dire où se trouve allapi pour trouver l'exemple
    et ce qu'est un hook ?

    Cordialement

    Il me semble que le test de valeur (comparaison avec ce qui est dans Validation) doit se faire dans cette routine :

    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
    Public Sub DoPaste()
        Debug.Print "DoPaste Ctrl V"
        On Error Resume Next
     
     
        If Application.CutCopyMode And Not mRngSource Is Nothing Then
            Selection.PasteSpecial xlValues
     
            Debug.Print mRngSource.Address ' Adresses départ Source ex : $F$15:$G$16
            Debug.Print Selection.Address  ' Adresses destination   ex : $H$19:I$20
            ' Comment vérifier que les données respectent le domaine de valeurs ?
            'Range(Selection.Address).Select
            'SendKeys "{ENTER}", True
     
            If mbCut Then mRngSource.ClearContents
     
            Application.CutCopyMode = False
     
        Else
            ActiveSheet.Paste
        End If
    End Sub

  8. #8
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par LentilleLocale Voir le message
    Merci Darkvader
    mais pouvez-vous me dire où se trouve allapi pour trouver l'exemple .../...
    http://allapi.mentalis.org/apilist/SetClipboardViewer.shtml#
    Google ou ma signature vous en aurait dit autant.

    Citation Envoyé par LentilleLocale Voir le message
    et ce qu'est un hook ?
    Le subclassing consiste à intercepter les messages système émis par Windows afin de les retraiter.
    Dans le cas qui nous intéresse il s'agit d'intercepter la notification de modification de la chaine texte du clipboard (WM_CHANGECBCHAIN).

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci. Je vais aller suivre ce lien pour comprendre.

    En attendant, j'ai terminé ce que je voulais faire en ajoutant du code là où je pensais que la chose devait se passer pour tester le respect du domaine de valeurs de la ou les cellules collées. Le code est le suivant et le fichier définitif est en pièce jointe de ce post. Je clôture ce sujet de discussion.
    Mais si vous avez des remarques, des améliorations à apporter, des erreurs détectées, merci de me le faire savoir.
    Bonne soirée à tout le Forum
    Lionel

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Public Sub DoPaste()
        Debug.Print "DoPaste Ctrl V"
        On Error Resume Next
     
     
        If Application.CutCopyMode And Not mRngSource Is Nothing Then
            Selection.PasteSpecial xlValues
     
            Debug.Print mRngSource.Address ' Adresses départ Source ex : $F$15:$G$16
            Debug.Print Selection.Address  ' Adresses destination   ex : $H$19:$I$20
            Debug.Print Selection.Row
            Debug.Print Selection.Column
            ' Comment vérifier que les données respectent le domaine de valeurs ?
            MonAdresse = Selection.Address
            Pos1 = InStr(1, MonAdresse, "$")
            Pos2 = InStr(Pos1 + 1, MonAdresse, "$")
            ColDebDest = Lettre2NumCol(Mid(MonAdresse, Pos1 + 1, Pos2 - Pos1 - 1))
            LigneDebDest = Mid(MonAdresse, Pos2 + 1)
     
            Pos3 = InStr(Pos2 + 1, MonAdresse, ":")
            If Pos3 = 0 Then
                ' 1 seule cellule
                LigneDebDest = Mid(MonAdresse, Pos2 + 1)
                ColFinDest = ColDebDest
                LigneFinDest = LigneDebDest
            Else
                ' Plusieurs cellules dans la Sélection
                Pos4 = InStr(Pos2 + 1, MonAdresse, "$")
                Pos5 = InStr(Pos4 + 1, MonAdresse, "$")
                ColFinDest = Lettre2NumCol(Mid(MonAdresse, Pos4 + 1, Pos5 - Pos4 - 1))
                LigneDebDest = Mid(MonAdresse, Pos2 + 1, Pos4 - Pos2 - 2)
                LigneFinDest = Mid(MonAdresse, Pos5 + 1)
            End If
            OK = True
            For MaCol = ColDebDest To ColFinDest
                For MaLig = LigneDebDest To LigneFinDest
                    If Cells(MaLig, MaCol).Validation.Value = False And Cells(MaLig, MaCol).Validation.AlertStyle = xlValidAlertStop Then
                        MonTitre = Cells(MaLig, MaCol).Validation.ErrorTitle
                        MonMessage = "Le contenu cellule " & NumCol2Lettre(MaCol) & MaLig & " n'est pas conforme au domaine de valeurs."
                        MonMessage = MonMessage & vbCrLf & "Merci de corriger maintenant." & vbCrLf & vbCrLf
                        MonMessage = MonMessage & Cells(MaLig, MaCol).Validation.ErrorMessage
                        Rep = InputBox(MonMessage, MonTitre)
                        Cells(MaLig, MaCol) = Rep
                        MaCol = ColDebDest     ' on boucle tant que ce n'est pas bon
                        MaLig = LigneDebDest - 1
                    End If
                Next MaLig
            Next MaCol
     
            'Range(Selection.Address).Select
            'SendKeys "{ENTER}", True
     
            If mbCut Then mRngSource.ClearContents
     
            Application.CutCopyMode = False
     
        Else
            ActiveSheet.Paste
        End If
    End Sub
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [XL-2010] Copier/Coller des valeurs d'un onglet a l'autre
    Par chuck95 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/02/2012, 17h52
  2. [AC-2002] copier coller la valeur du control par double clic
    Par itzik92 dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/01/2011, 22h33
  3. N'autoriser que le copier-coller par valeur sur un onglet
    Par LentilleLocale dans le forum Excel
    Réponses: 3
    Dernier message: 02/11/2008, 13h31
  4. Copier/coller par automatisation photoshop ?
    Par isa150183 dans le forum Imagerie
    Réponses: 3
    Dernier message: 11/02/2007, 20h55
  5. Comment faire Copier/Coller par code VBA sur INTERNET...
    Par GESCOM2000 dans le forum Access
    Réponses: 5
    Dernier message: 02/01/2006, 13h19

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