Macro excel : protéger le copier/coller

Alexxx

XLDnaute Nouveau
Bonjour à tous,

J'ai codé un programme sous excel (donc en vba) qui fait pas mal de copier/coller pour générer des nouvelles worksheets.
J'ai un problème qui apparait de temps en temps (mais pas tout le temps), même sur le même jeu de données en entrée, à savoir que j'obtiens l'erreur 1004: La méthode 'Paste' de l'objet '_Worksheet' a échoué.

Du coup je soupçonne fortement l'utilisation abusive du presse papier, et plus particulièrement qu'un autre programme sur mon ordinateur utilise le presse papier en même temps (promis je ne touche à rien quand je teste mon programme vba).

Du coup j'ai cherché comment copier/coller en vba sans passer par le presse papier, mais il semble qu'on ne puisse faire ca que pour du texte dans des cellules ou des formules. Moi j'ai entre autre des graphes à dupliquer (copier/coller). Par exemple j'ai trouvé ce genre de ligne de code (qui de toutes facons manipule le presse papier, puisqu'une fois exécuté, le presse papier est vidé de son précédent contenu) :

ThisWorkbook.Sheets("Layout").Range("A1").Copy Destination:=ThisWorkbook.Sheets("Test").Range("A1")

Ou cette ligne de code:

ThisWorkbook.Sheets("Test").Range("A1") = ThisWorkbook.Sheets("Layout").Range("A1")



Bon du coup j'ai cherché à bloquer (lock/unlock) l'utilisation du presse papier pendant que mon programme vba l'utilisait.

Je suis tombé sur ce bout de code:

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long

Public Sub Lockk()
If OpenClipboard(0) = 0 Then
MsgBox "cannot open clipboard."
ElseIf EmptyClipboard() = 0 Then
MsgBox "cannot clear clipboard."
End If
End Sub

Public Sub Unlockk()
CloseClipboard
End Sub

Ca marche pas mal quand on manipule des cellules.
On peut locker le presse papier, vérifier sous notepad qu'on ne peut plus rien copier/coller, retourner sous excel, et copier/coller des cellules (à la main ou via du code vba); et ensuite unlocker le presse papier.

Par contre:

J'ai remarqué que copier/coller une cellule débloquait le presse papier (alors même que je n'appelle pas la fonction unlock).

Et mon gros problème, quand j'encapsule mon code vba qui copy/paste un graph avec les fonction lock/unlock; au moment d’exécuter la ligne qui colle le graphe (paste), j'obtiens la même erreur que précédemment (1004).

Est ce que quelqu'un saurait: soit comment copier/coller (dupliquer) des élements sans passer par le presse papier (et pas seulement du texte, aussi des graph).
Soit comment locker le presse papier, mais toujours pouvoir copier/coller des graph?

Merci :)
 

Alexxx

XLDnaute Nouveau
Re : Macro excel : protéger le copier/coller

Pour les cellules fusionnées, effectivement, on ne peut pas simplement utiliser une ligne vba du genre
ThisWorkbook.Sheets("Layout").Range("A1").Copy Destination:=ThisWorkbook.Sheets("Test").Range("A1 ")
Ca copie le contenu sans fusionner la destination.

Et surtout, j'ai des graph (chart object) à dupliquer (copier/coller), et là ca ne marche plus du tout.
Comme je dois avoir un autre programme qu'excel qui utilise le presse papier en même temps que mon code vba ne tourne, ca fout un peu la merde de temps en temps et je me retrouve avec des erreurs.

Du coup j'essaye de locker le presse papier. Mais une fois locké, je peux copier/coller des cellules, mais pas de chart object.

Voila mon probleme... peut être que locker le presse papier n'est pas la solution idéale, mais j'en vois pas d'autre pour l'instant.
 

youky(BJ)

XLDnaute Barbatruc
Re : Macro excel : protéger le copier/coller

Un truc comme ceci plante ??
Feuil1.ChartObjects("Graphique 1").Copy: Feuil2.Range("D5").PasteSpecial

Revoir le nom des feuilles et Graphique??

Je ne pense pas que cela vient du presse papier, mais bon!!!!
Peut être un apercu de la macro et là ou ça bug serai pas mal
Bruno
 

Alexxx

XLDnaute Nouveau
Re : Macro excel : protéger le copier/coller

La macro utilisé:

Utils_Clipboard.Lockk
ThisWorkbook.Sheets("Layout").ChartObjects("CHART_TEMPLATE").Copy
worksheet_p.Paste Destination:=where_p
Utils_Clipboard.Unlockk

Et ca bug à la ligne worksheet_p.Paste Destination:=where_p, puisqu'à priori le copy n'a pas marché.
Si j'enlève mon "Utils_Clipboard.Lockk", ca marche, sauf que... je dois avoir un autre programme sur mon ordinateur qui fait une utilisation abusive du clipboard et qui doit le locker quand il l'utilise et j'obtiens la même erreur.

Donc à mon avis la méthode Copy doit utiliser plus de chose que le presse papier en lui même, vue que si on le lock pour notre utilisation, ca n'arrive plus à copier.

A savoir: avec le même mécanisme, si je copie/colle une cellule et pas un chartobject, ca marche nickel!
 

Alexxx

XLDnaute Nouveau
Re : Macro excel : protéger le copier/coller

Oui oui je suis sur de mes variables.
Comme je l'ai dit, si j'enleve le lock du clipboard ca fonctione.
(mais pas tout le temps vu que je dois avoir un autre programme sur mon ordi qui fait aussi une utilisation abusive du clipboard et qui doit le locker ou je ne sais quoi)

Faire un pastespecial ne résoudra pas le problème, ca utilise aussi le clipboard (dès qu'on fait un machin.Copy, ca fou les données dans le presse papier).
 

Alexxx

XLDnaute Nouveau
Re : Macro excel : protéger le copier/coller

J'ai trouvé une solution partielle: Ce lien n'existe plus
--> Dupliquer mon chartobject (pour les celulles je peux toujours locker/unlocker durant la copy, ca ca pose pas de problème).

Par contre, dupliquer le chartobject ne fait que en créer un nouveau au dessus de l'ancien. Me reste à savoir comment déplacer ce nouveau chartobject sur la bonne worksheet au bon endroit; et toujours sans passer par le presse papier (donc sans utiliser les méthodes Cut/Paste).
 

Discussions similaires

Statistiques des forums

Discussions
311 724
Messages
2 081 936
Membres
101 844
dernier inscrit
pktla