Connaitre la plage de cellule copiée dans le presse-papiers

Bonjour,

je souhaiterai mémoriser (en VBA) la plage de cellule copiée dans le presse-papiers.

J'explique la but final de ma question :

Sur une feuille j'ai des évènements déclenchés sur modification de cellules.

Les actions réalisées me font perdre le contenu du presse-papiers.

Je souhaiterai à la fin de ma procédure évènementielle remettre dans le presse-papier son contenu,

spécialement quand il s'agit de cellules qui viennent d'être copiées.

Est-ce possible ?

Je me suis bien entendu penché sur le sujet,

j'arrive à ce code :

Private Sub Worksheet_Change(ByVal Target As Range)

'--- Déclaration des variables
Dim Memo_Clipboard As Range

'--- Test si le contenu du presse-papiers est une plage de cellules
'--- et enregistre la plage
If CountClipboardFormats = 29 Then
    Set Memo_Clipboard = Selection
End If

'--- Code de l'évènement
Application.CutCopyMode = False

'--- Restaure le contenu du presse-papiers
If Not Memo_Clipboard Is Nothing Then
    Memo_Clipboard.Copy
End If

End Sub

Il faut aussi mettre dans un module :

Declare Function CountClipboardFormats Lib "user32" () As Long

Ce code fonctionne, mais avec comme "bidouille" la ligne "Set Memo_Clipboard = Selection" :

Je mémorise la sélection actuelle, donc la sélection correspondante à la zone "collée",

qui n'est pas forcément la même que le zone "copiée".

Je recherche donc à mémorisée la zone copiée...

Merci d'avance de vous pencher sur mon cas !

Bonjour

Je suppose que tu parles de la première plage copiée ??

Si j'ai bien compris, essaie plutôt de déclarer ta variable avant d'exécuter ton code.

Pour t'expliquer par rapport à ton code mets ceci plutôt que ce que tu as fait

'--- Déclaration des variables
Dim Memo_Clipboard As Range
Private Sub Worksheet_Change(ByVal Target As Range)

End sub[/code]

Amicalement

J'avoue ne pas avoir bien compris ta réponse...

Je suppose que tu parles de la première plage copiée ??

Je souhaite garder dans le presse-papiers la plage de données présentes au moment ou l'évènement est déclenché par la modification d'une cellule de la feuille (qui correspond donc à une action de "Coller")

re,

As-tu essayé ce que je t'ai proposé ?

si ce que tu proposais était de remonter la déclaration de la variable avant l'évènement,

alors oui je l'ai fait, mais ça ne change rien.

Re,

Peux-tu me mettre ton fichier ou un fichier exemple avec le code afin que je vois ce que tu fais

A te relire

Bonjour Dan, le forum

En voulant créer un fichier exemple,

je me suis rendu compte que le code que j'ai donné dans mon premier post,

qui fonctionnait "presque" (il mémorise et restitue la dernière plage sélectionnée lors d'une modif, au lieu de restituer la plage copiée),

ne marche plus si j'enregistre le fichier !!

Si je crée un nouveau classeur, que je copie/colle le code et que je teste, ça fonctionne,

par contre une fois le fichier enregistré, plus rien ne se passe...

Bref, afin que vous compreniez mieux mon problème,

je joins à ce message un fichier exemple contenant 2 feuilles.

la première sans code de "mémorisation de cellule copiée",

et la 2° avec le code (qui ne fonctionne pas donc).

Le but de ce fichier est de repérer toutes les lignes modifiées d'un tableau, en indiquant "Modifié" dans la colonne J.

Le problème (que j'essaie de résoudre dans ce post grâce à votre aide), c'est que le contenu du presse-papiers n'est plus disponible après exécution de ce code.

Ce qui est dérangeant car dans l'utilisation finale du fichier, un grand nombre de lignes ont besoin d'être copié-collé,

je souhaiterai donc conserver la plage copiée dans le presse-papier comme lors d'un copier-coller "normal", sans évènement.

Re

Bon j'essaie de voir comment tu utilises ce fichier.

Je suis en feuille 1, là mettons que je modifie la cellule A4 en mettre la lettre D, cela met bien "Modifié" en colonne J

Ensuite dis moi ce que tu fais ou donne un exemple

Sinon essaie en enlevant les deux instructions --> "Application.EnableEvents = ....."

J'ai essayé en enlevant "Application.EnableEvents = .....",

mais ça ne change rien. Pour info, dans cet évènement, c'est la protection de la feuille par macro qui dévalide le presse papier.

Alors je donne un exemple, admettons qu'on veuille copier la ligne 10 du tableau à plusieurs autres endroits, sur les lignes 15, 20, et 25 :

  • Tu sélectionnes la plage A10:I10
  • Tu Copies
  • Tu sélectionne la plage A15:I15
  • Tu Colles

Sur une feuille sans évènement, pour coller cette ligne en ligne 20 et 25,

il suffirait de sélectionner la plage A20:I20, coller, puis sélectionner la plage A25:I25, puis coller.

Mais actuellement, à cause de l'évènement qui dévalide/vide le presse-papiers,

il faut resélectionner la plage A10:I10, copier, puis sélectionner la plage A20:I20, coller,

resélectionner la plage A10:I10, copier, puis sélectionner la plage A25:I25, puis coller.

Est-ce plus clair ?

En fait, ma question est plus large que cet exemple précis, je souhaiterai mémoriser l'adresse d'une plage copiée,

pour "restaurer" la copie en fin d'évènement.

re

Alors je donne un exemple, admettons qu'on veuille copier la ligne 10 du tableau à plusieurs autres endroits, sur les lignes 15, 20, et 25 :

  • Tu sélectionnes la plage A10:I10
  • Tu Copies
  • Tu sélectionne la plage A15:I15
  • Tu Colles
Dans ce cas, tu n'es pas obligé de sélectionner A15:I15 mais simplement A15 puis coller

Sinon une fois collé ce que tu as copier, lanouvelle plage collée est sélectionnée sur ta feuille. Dès lors pourquoi ne te sers-tu pas de cette plage pour l'enregistrer dans le presse-papier ? Cela revient au même que d'utiliser la première plage puisque les données sont identiques.

Pour le faire tu pourrais mettre

Set Memo_Clipboard = Selection

juste après

Set tableau = Range("A10:I100")

Au fait l'instruction Set Plage_a_traiter = Nothing ne sert pas dans ton cas.

A te relire

Dan a écrit :

Dans ce cas, tu n'es pas obligé de sélectionner A15:I15 mais simplement A15 puis coller

Oui bien sur, j'ai simplement voulu éviter toute confusion, alors j'ai mentionné la même longueur de plage.

Dan a écrit :

Sinon une fois collé ce que tu as copier, lanouvelle plage collée est sélectionnée sur ta feuille. Dès lors pourquoi ne te sers-tu pas de cette plage pour l'enregistrer dans le presse-papier ? Cela revient au même que d'utiliser la première plage puisque les données sont identiques.

C'est en faite la seule solution que j'ai actuellement trouvé, mais c'est justement cette ligne "Set Memo_Clipboard = Selection" que je souhaiterai améliorer, pour 3 raisons :

- Déjà, je ne sais pour quelle raison, mais ça ne fonctionne pas, la sélection n'est pas copiée... (bizarrement, chez moi (Excel 2007) ça fonctionne si je crée un nouveau classeur et que je colle le code, mais dès lors que j'ai enregistré le fichier, ça ne fonctionne plus... Mystère)

- Avec cette méthode, à chaque changement sur la feuille, on va copier la sélection, alors que bien entendu chaque changement ne veut pas dire qu'on effectue un copier coller. C'est pour cette raison que j'avais utiliser le code suivant pour conditionner la mémorisation.:

'--- Test si le contenu du presse-papiers est une plage de cellules
'--- et enregistre la plage
If CountClipboardFormats = 29 Then
    Set Memo_Clipboard = Selection
End If

- Dernier point, je ne suis pas d'accord avec toi quand tu dis que cela revient au même que d'utiliser la première plage puisque les données sont identiques. Si on sélectionne Une cellule et qu'on la colle dans 10 cellules, on va donc se retrouver avec 10 cellules dans le presse-papiers, alors qu'on a initialement copier une seule cellule.

C'est pour toutes ces raisons, que j'ai essayer de bien préciser que ma question était plus large que ce cas précis dans ce classeur,

ce que je souhaite c'est "Mémoriser l'adresse de la plage de cellule copiée dans le presse-papiers, si plage de cellule il y a".

Merci d'essayer d'avancer en tout cas !

re

Dernier point, je ne suis pas d'accord avec toi quand tu dis que cela revient au même que d'utiliser la première plage puisque les données sont identiques. Si on sélectionne Une cellule et qu'on la colle dans 10 cellules, on va donc se retrouver avec 10 cellules dans le presse-papiers, alors qu'on a initialement copier une seule cellule.

Juste, je n'avais pas imaginé ce cas lorsque je te lisais.

Juste un truc à tester :

  • sélectionne une plage de cellule
  • exécute le code ci-dessous
Sub test()
MsgBox CountClipboardFormats
End Sub

Chez moi cela me renvoie 30. Si aussi chez toi tu devrais peut être changer le 29 par 30.

Sinon, je trouve qu'il aurait été sympa de me dire que tu t'adressais ailleurs sur la même question.

A te relire

Salut,

Dan a écrit :

Juste un truc à tester :

  • sélectionne une plage de cellule
  • exécute le code ci-dessous
Sub test()
MsgBox CountClipboardFormats
End Sub

Chez moi cela me renvoie 30. Si aussi chez toi tu devrais peut être changer le 29 par 30.

Et bien j'avais mis 29 parce que justement ce petit code me renvoyait 29 lorsque j'avais des cellules copiées dans le presse-papiers.

Mais en retestant suite à ta demande, j'ai maintenant 30...

Là j'avoue que ça me dépasse, mais au moins je sais maintenant pourquoi la copie de la sélection ne se faisait plus.

Dan a écrit :

Sinon, je trouve qu'il aurait été sympa de me dire que tu t'adressais ailleurs sur la même question.

Alors je ne savais pas que tu étais sur XLD, puis j'ai posté ce message hier sur cet autre forum pour avoir d'autres points de vue et parce qu'il m'a semblait qu'on calait un petit peu !

Je ne pensais pas mal faire en faisant ça, mais si c'est quelquechose qui ne se fait pas, alors dis-le moi et ça ne se reproduira pas !

Pour revenir à mon problème, puisque "CountClipboardFormats" sait reconnaitre un format "cellule" dans le presse-papier,

je me suis dis depuis le début que du coup il doit être possible de récupérer l'adresse de la plage copiée, mais je ne trouve pas d'aide à ce sujet là, même sur le net.

re,

Alors je ne savais pas que tu étais sur XLD, puis j'ai posté ce message hier sur cet autre forum pour avoir d'autres points de vue et parce qu'il m'a semblait qu'on calait un petit peu ! Je ne pensais pas mal faire en faisant ça, mais si c'est quelquechose qui ne se fait pas, alors dis-le moi et ça ne se reproduira pas !

Il est de bonne habitude de ne pas poster sur un autre forum lorsque tu demandes de l'aide sur un forum. Cela évite notamment de passer du temps sur une demande dont la solution est déjà trouvée ailleurs. Mais bon c'est le forumeur qui décide "in fine". Pour ma part, je trouve que c'est mieux de prévenir que tu demandes ailleurs.

Pour le cas présent j'ai bien compris ta démarche par rapport au sujet un particulier qui nous préoccupe.

Pour revenir à mon problème, puisque "CountClipboardFormats" sait reconnaitre un format "cellule" dans le presse-papier,

je me suis dis depuis le début que du coup il doit être possible de récupérer l'adresse de la plage copiée,

Tout se passe sur la protection de la feuille.

Je pense que ton souci devrait trouver une solution en utilisant un module de classe car l'déal est d'enregistrer la plage sélectionnée avant l'exécution du code worksheet_change

A te relire

Salut,

Dan a écrit :

Je pense que ton souci devrait trouver une solution en utilisant un module de classe car l'déal est d'enregistrer la plage sélectionnée avant l'exécution du code worksheet_change

Humm, y'a t'il une piste éventuelle derrière cette phrase ? Si oui, je ne l'ai pas capté !

Salut Dan, Piratman et le Forum

Peut-être en regardant sur le site de : Chip Pearson

L'utilisation de la méthode Storing Multiple Items In The Clipboard semble une piste.

Mytå

Bonjour Myta,

j'ai lu le contenu du lien que tu as donné,

mais je ne vois pas comment la méthode "Storing Multiple Items In The Clipboard" pourrait être la piste à suivre pour mon problème.

J'ai du louper une subtilité car il me semble que cette méthode sert pour stocker des String.

J'ai voulu m'intéressé plutôt à "RangeToClipboardString", mais je dois avouer que ce genre de fonctions dépassent largement mes compétences, je n'ai même pas réussi à l’exécuter, alors de là à l'adapter à mon cas, il y a un grand fossé !

Rechercher des sujets similaires à "connaitre plage copiee presse papiers"