Vider le presse papier à l'enregistrement.

Jeanbulle

XLDnaute Occasionnel
Bonjour,

Excusez moi de poster un sujet pour ce type de problème.
Effectivement, il y a pas mal de topic qui le traite déjà. :)

Seulement, toutes les solutions données ne fonctionnent pas. :'(
OU
Je les utilises mal.

Voici ce que j'ai essayé :
Code:
Application.CommandBars("Clipboard").Controls(4).Execute

Code:
Sub viderPressePapier()
'nécéssite d'activer la référence Microsoft Form 2.0 Object Library
Dim Cible As DataObject
Set Cible = New DataObject
Cible.SetText ""
Cible.PutInClipboard
Set Cible = Nothing
End Sub

Code:
 Application.Cutcopymode = False


Et encore deux trois autres codes oubliés.
Si quelqu'un peut m'expliquer comment cela fonctionne. :p
Visual basic version 6.3
Excel 2002 SP2

Grand merci
 

Jeanbulle

XLDnaute Occasionnel
Re : Vider le presse papier à l'enregistrement.

Bruno M45 bonjour, PierreJean Bonjour !

Merci pour votre aide.


BrunoM45 : J'ai déjà essayé aussi cette solution que j'avais trouvé par google ^^
Mais idem.... celle ci meme me génère une erreur sur la déclaration.


Et PierreJean : J'ai essayé de placer en début de code, puis en fin de code. Même chose.

Code:
[b]Application.CutCopyMode = False[/b]


'''creation de l'image fiche intervention
Dim ndf As String
Dim Source As Range, Gr As Object
    ndf = ActiveWorkbook.Path & "\" & tbox1.Value & " " & tbox3.Value & ".jpg"
    Set Source = Range("Fiche!B4:J50")
    Source.CopyPicture xlScreen, xlPicture
    Set Gr = Sheets(1).ChartObjects.Add(0, 0, Source.Width, Source.Height)
    Gr.Chart.Paste
    Gr.Chart.Export ndf, "JPG"
    Gr.Delete
    Set Gr = Nothing
    Set Source = Nothing

''' envoi de l'email
Dim objol As New Outlook.Application
Dim objmail As MailItem
Set objol = New Outlook.Application
Set objmail = objol.createitem(olmailitem)
With objmail
        .To = ""

        .Subject = util & "envoi la fiche de " & tbox3.Value
        .Body = "Bonjour," & vbLf & _
        " " & vbLf & _
        "Ceci est un message d’information d’avancement d’intervention concernant un client que nous avons en commun." & vbLf & _
        "Ci-joint, vous trouverez la fiche de ce client." & vbLf & _
        " " & vbLf & _
        " " & lebodydumessage & vbLf & _
        " " & vbLf & _
        " " & vbLf & _
        " Cordialement," & vbLf & _
        " Sarl xxxxx" & vbLf & _
        " Adresse " & vbLf & _
      "VILLE" & vbLf & _
        " tel fax : " & vbLf & _
        " Email : klsjflkdsf "
        
        .Attachments.Add ActiveWorkbook.Path & "\" & tbox1.Value & " " & tbox3.Value & ".jpg"
        .NoAging = True
        .display
End With
Set objmail = Nothing
Set objol = Nothing


Kill ActiveWorkbook.Path & "\" & tbox1.Value & " " & tbox3.Value & ".jpg"
[b]Application.CutCopyMode = False[/b]
 
Dernière édition:

Jeanbulle

XLDnaute Occasionnel
Re : Vider le presse papier à l'enregistrement.

BrunoM45 : J'ai essayé avec ton lien, et la déclaration doit être différente :p car ca as l'air de fonctionner. Par contre, le presse papier ne se vide pas si on le laisse ouvert. Normal ? :eek:


PierreJean : J'utilise mal application.cutcopymode ? :)


Je fais quelques essais comme ca, pendant quelques jours, avant de cloturer le post.
Merci beaucoup en tout cas, si ca fonctionne, je vous aime ::))
 

pierrejean

XLDnaute Barbatruc
Re : Vider le presse papier à l'enregistrement.

Re

a tester: (solution un poil bourrin !!!)

Code:
Sub videpressepapier()
 Application.CommandBars("Clipboard").Visible = True
 On Error Resume Next
   Application.CommandBars("Clipboard").Controls(4).Execute
 On Error GoTo 0
 Application.CommandBars("Clipboard").Visible = False
End Sub
 

Jeanbulle

XLDnaute Occasionnel
Re : Vider le presse papier à l'enregistrement.

Bonjour,
Je remonte le sujet pour donner des news
La solution :
Code:
Option Compare Database
Option Compare Database
Option Explicit
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
 
Private Sub Commande0_Click()
    OpenClipboard Me.hwnd
    EmptyClipboard
    CloseClipboard
End Sub

Ne fonctionne pas :p
Enfin, du moins, chez moi.
Donc peut être que cela provient d'autre chose que le presse papier excel. Je poursuis mes recherches, et vous tiens informé.

Merci pour votre aide



Edit : "Dans le code présenté ci haut, j'ai ajouté USERFORM.HIDE pour voir ce qui se passe au niveau du clipboard, en pas à pas. Le clipboard ne s'ouvre même pas, avec toutes les solutions ci dessus. Par contre, si je remplace clipboard par taskpane. Là, visuellement, la commande Application.CommandBars("task pane").Visible = True ouvre le presse papier. Seulement, la suite ne le vide pas... ca peut vous aider à m'aider ? :p"
 
Dernière édition:

Jeanbulle

XLDnaute Occasionnel
Re : Vider le presse papier à l'enregistrement.

...

Vraiment je suis désespéré.
Es ce que ca peut être la version d'excel qui est en cause ?
Es ce que visuellement le presse papier se vide ?

Je vous joint un fichier vide, sur lequel j'ai recopié le code :
Code:
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
 
Private Sub Commande0_Click()
    OpenClipboard 0
    EmptyClipboard
    CloseClipboard
End Sub

Private Sub CommandButton1_Click()
Commande0_Click

End Sub

Chez moi, ca ne marche pas... et chez vous ?
Merci encore :p
 

Pièces jointes

  • exemple.xls
    24 KB · Affichages: 79
  • exemple.xls
    24 KB · Affichages: 81
  • exemple.xls
    24 KB · Affichages: 87
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : Vider le presse papier à l'enregistrement.

Bonjour à tous,
Salut PJ,

Ce code fonctionne parfaitement sous XL 2003.

Code:
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
 
Private Sub CommandButton1_Click()
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub
Merci de renseigner ta version XL dans ton Profil

A+

Edition : C'était implicite mais le code de PJ fonctionne aussi sous XL 2003...
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : Vider le presse papier à l'enregistrement.

Bonjour à tous

une autre solution :

Code:
Option Explicit
Sub test()
'activer la reference Microsoft Forms 2.0 Object Library
Dim x As New DataObject
x.SetText ""
x.PutInClipboard
End Sub

bon après midi
@+

Aarf : déjà essayé par JeanBulle... désolé...
 
Dernière édition:

Jeanbulle

XLDnaute Occasionnel
Re : Vider le presse papier à l'enregistrement.

Bonjour,

Je donne un petit suivi de mes recherches (et mes conneries probablement ^^).

J'ai utilisé ce code :
Code:
Sub Nettoie() 'Laurent Longre mpfe, mise en forme GeeDee

Dim Sht As Worksheet, DCell As Range, Calc As Long, Rien As String, Avant As Double, plage As Range
On Error Resume Next
Calc = Application.Calculation ' ---- mémorisation de l'état de
'recalcul
'------------------------------------------------------------
MsgBox "Pour le classeur actif : " _
& Chr(10) & ActiveWorkbook.FullName _
& Chr(10) & "dans chaque feuille de calcul" _
& Chr(10) & "recherche la zone contenant des données," _
& Chr(10) & "réinitialise la dernière cellule utilisée" _
& Chr(10) & "et optimise la taille du fichier Excel", _
vbInformation, _
"d'après LL par GeeDee@m6net.fr"
'-------------------------------------------------------------
MsgBox "Taille initiale de ce classeur en octets" _
& Chr(10) & FileLen(ActiveWorkbook.FullName), _
vbInformation, ActiveWorkbook.FullName
'------------------------------------------------------------
With Application
.Calculation = xlCalculationManual
.StatusBar = "Nettoyage en cours..."
.EnableCancelKey = xlErrorHandler
.ScreenUpdating = True
End With
'-------------------- le traitement
For Each Sht In Worksheets
Avant = Sht.UsedRange.Cells.Count
Application.StatusBar = Sht.Name & "-" & Sht.UsedRange.Address
'-------------------Traitement de la zone trouvée
If Sht.UsedRange.Address <> "$A$1" Or Not IsEmpty(Sht.[A1]) Then
Set DCell = Sht.Cells.Find("*", , , , xlByRows, xlPrevious)(2)
'----------------Suppression des lignes inutilisées
If Not DCell Is Nothing Then
Sht.Range(DCell, Sht.Cells([A:A].Count, 1)).EntireRow.Delete
Set DCell = Nothing
Set DCell = Sht.Cells.Find("*", , , , xlByColumns, xlPrevious)(, 2)
'----------------Suppression des colonnes inutilisées
If Not DCell Is Nothing Then Sht.Range(DCell, Sht.[IV1]).EntireColumn.Delete
End If
Rien = Sht.UsedRange.Address
End If
ActiveWorkbook.Save
'---------------------Message pour la feuille traitée
MsgBox "Nom de la feuille de calcul :" _
& Chr(10) & Sht.Name _
& Chr(10) & Format(Sht.UsedRange.Cells.Count / Avant, "0.00%") & _
" de la taille initiale", vbInformation, ActiveWorkbook.FullName
Next Sht
'--------------------Message fin de traitement
MsgBox "Taille optimisée de ce classeur en octets " & Chr(10) & _
FileLen(ActiveWorkbook.FullName), _
vbInformation, _
ActiveWorkbook.FullNameActive
'--------------------
Application.StatusBar = False
Application.Calculation = Calc
End Sub

Résultat : Pas de différence de taille à quelques octets près..

Pourtant, celui ci m'avait trouvé 6 feuilles qui ont été reprise à 0,5 % de leur taille initiale. D'autres à 2,5%, d'autres à 17%.
Ces feuilles là étant vide quasiment (de visuel), je dois donc comprendre qu'elles ne l'étaient pas ?
Ces feuilles sont utilisées pour stockées des données le temps d'une impression, puis les données sont effacées.

Feuille concernée : Une feuille créé un tableau de remise de chèque.
Colonne 1 Compte comptable
Colonne 2 Désignation
Colonne 3 prix
jusqu'à colonne F. A noter, qu'une donnée est stockée dans la colonne AE

Le code créé le tableau suivant les chèques saisis.
Puis, le code imprime,
Code:
''' j'imprime
Worksheets("REMISECHEQUEWAWAN").Range("A1:F23").Select
Selection.PrintOut Copies:=1, Collate:=True

puis efface avec la méthode :

Code:
Worksheets("REMISECHEQUEWAWAN").Range("A2:AE23").Select
Selection.ClearContents

Avec ceci, excel continu à garder les données en mémoire ?



Autre feuille concernée : une feuille qui sert de mis à jour.
Sur celle ci, les informations sont traitées et effacées ligne par ligne (le code tourne en boucle tant qu'une valeur est présente dans cette feuille).
Code:
''' effacer celle de la feuille maj                                                      wsperimee.Rows(ligperimee).ClearContents
wsperimee.Rows(ligperimee).Delete


Avec ceci, excel continu à garder les données en mémoire ?





Donc ensuite, désespéré, J'ai lancé ce code :
Code:
Sub Reconstruit(daalog) 'Frédéric Sigonneau, MPFE
'le projet du classeur ne doit pas être protégé
Dim Wbk As Workbook, Chemin$, tmpNom$, Nom$
Dim Projet, i&, Module$

On Error Resume Next
Set Wbk = Workbooks("daalog.xls")
On Error GoTo 0
If Wbk Is Nothing Then
MsgBox "Le classeur à reconstruire doit être ouvert..."
Exit Sub
End If

'dossier temporaire pour l'exportation des modules de code
Chemin = Wbk.Path & "\ empExport"
MkDir Chemin: Chemin = Chemin & "\\\"

'export des modules
Set Projet = Wbk.VBProject
With Projet
For i = 1 To .VBComponents.Count
Select Case .VBComponents(i).Type
Case 1:
.VBComponents(i).Export Chemin & .VBComponents(i).Name & ".bas"
Case 2:
.VBComponents(i).Export Chemin & .VBComponents(i).Name & ".cls"
Case 3:
.VBComponents(i).Export Chemin & .VBComponents(i).Name & ".frm"
End Select
Next
End With

'export des feuilles dans un nouveau classeur
tmpNom = Left(NomClasseur, Len(NomClasseur) - 4) & "_Refait.xls"
Wbk.Sheets.Copy
ActiveWorkbook.SaveAs Wbk.Path & "\\\" & tmpNom

'réimport des modules dans le nouveau classeur
Module = Dir(Chemin & "*.*")
Do While (Len(Module) > 0)
On Error Resume Next
Workbooks(tmpNom).VBProject.VBComponents _
.Import(Chemin & Module).Name = Module
On Error GoTo 0
Kill Chemin & Module
Module = Dir()
Loop

'enregistrement et nettoyage
Workbooks(tmpNom).Close True
RmDir Chemin

'remplacement de l'ancien fichier par le nouveau
If MsgBox("Donner au fichier reconstruit le nom du fichier " & _
"d'origine et détruire ce dernier ?", vbYesNo) = vbYes Then
Chemin = Wbk.Path & "\\\": Nom = Wbk.Name
Wbk.Close False
Kill Chemin & Nom
Name Chemin & tmpNom As Chemin & Nom
End If

End Sub




Mon fichier est passé de 28 MO à seulement 5 MO. :))
Quelqu'un saurait expliqué en détail le travail automatisé qu'effectue ce code ?
Et quel est l'erreur qui fait que mon fichier accumule autant de poids ?

Merci encore pour votre précieuse aide :p
 

Jeanbulle

XLDnaute Occasionnel
Re : Vider le presse papier à l'enregistrement.

Bonjour,

Je remonte le sujet car je viens d'acquérir le pack office 2003.
Snif = Même problème.

Alors, j'ai peut être une autre question à poser du coup.
Es ce que visuellement, votre presse papier se vide ?

Essai :
Je copie le contenu d'une case "blablabla"
"blablabla" apparait dans le presse papier
Je le colle ou je veux.
Je lance un des codes pour vider le presse papier
Le presse papier ne se vide pas visuellement, mais je ne peux plus coller "blablabla"
donc quelque part, il s'est vidé... mais pas visuellement.

Grand merci encore

(NB : Vos réponses vont engendrer d'autres questions je sens :p)

Bonne journée, et bonne année ;)
 

Statistiques des forums

Discussions
312 452
Messages
2 088 538
Membres
103 879
dernier inscrit
JJB2