Как очистить буфер обмена vba word

How would you clear the Microsoft Office Clipboard using VBA, specifically Word VBA?

I am copying a lot of data at time into the clipboard and don’t want excessive data kept in the Clipboard.

asked Sep 23, 2015 at 10:19

Jean-Pierre Oosthuizen's user avatar

1

Would a simple

Application.CutCopyMode = False

work for your situation, or is this option not viable?

answered Sep 23, 2015 at 12:53

jtchase08's user avatar

jtchase08jtchase08

6124 silver badges12 bronze badges

3

Saw this on another post, and I have tested it with Word VBA.

'Clearing the Office Clipboard

    Dim oData   As New DataObject 'object to use the clipboard

    oData.SetText text:=Empty 'Clear
    oData.PutInClipboard 'take in the clipboard to empty it

Just copy and paste into your code where ever you need to clear the Clipboard.

Another thing I noticed is that when I .Quit a program, say Excel, it keeps asking me if I want to keep the data is the Clipboard. A work around is to clear the clipboard using the above stated code. See below:

'Clearing the Office Clipboard

    Dim oData   As New DataObject 'object to use the clipboard

    oData.SetText text:=Empty 'Clear
    oData.PutInClipboard 'take in the clipboard to empty it


'You can also just remove the Alert Messages from the Excel Program while    
'the code is running
'Remove alert Messages from the Excel Program when closing
ExcelProgram.DisplayAlerts = False   

'Quiting the Excel Application
ExcelProgram.Quit

I used the above example in a VBA code to import data from an Excel File. See here

Community's user avatar

answered Sep 23, 2015 at 10:19

Jean-Pierre Oosthuizen's user avatar

1

Here’s a solution that worked for me. This is based on a post by by Zack Barresse on VBAexpress.com:

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

Public Sub ClearClipboard()
    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard
End Sub

After copying this function to your VBA project, use ClearClipboard to clear it.

answered Nov 14, 2017 at 2:31

ChrisB's user avatar

ChrisBChrisB

2,8845 gold badges31 silver badges58 bronze badges

1

A quick and easy solution I’ve just used is

MyDoc.Range.Characters(1).Copy

Where «MyDoc» is the name of the document you are using.

It doesn’t technically empty the clipboard, it just makes it one character long (assuming your document starts with characters), which stops Word from popping up with annoying questions.

The purists may not like it, but heyho, it’s dead easy :)

answered Apr 28, 2021 at 10:39

David Flavell's user avatar

This functionality is held within the library «Microsoft Forms 2.0 Object Library». To link to that library go to the VBA editor, then Tools, References and pick it out from the list if it’s not already ticked.

You can do more funky stuff with a bunch of WinAPI calls, but I generally prefer avoiding those unless absolutely necessary.

Also, don’t forget about the DisplayAlerts property, which will suppress dialog boxes — although I’m not sure if it would always produce the desired result.

answered Sep 23, 2015 at 11:17

NeepNeepNeep's user avatar

3

If you are getting the error while closing the workbook, Use code something like this

wbk.close False
Application.CutCopyMode = False 

answered Aug 26, 2021 at 16:11

madhwaraj gururaj's user avatar

natalie

1

Как очистить буфер обмена?

17.11.2010, 10:01. Показов 53222. Ответов 16


Студворк — интернет-сервис помощи студентам

вот собственно и весь вопрос
Заранее спасибо

0 / 0 / 3

Регистрация: 28.01.2010

Сообщений: 279

17.11.2010, 10:13

2

Clipboard.Clear



0



natalie

17.11.2010, 10:49

3

Спасибо

natalie

17.11.2010, 16:14

4

не работает
Help!

Comanche

17.11.2010, 17:06

5

Объект ClipBoard не поддерживается в VBA (в отличие от VB). Делай так:

Visual Basic
1
2
3
4
5
6
7
8
9
Private Declare Function OpenClipboard Lib 'user32' (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib 'user32' () As Long
Private Declare Function CloseClipboard Lib 'user32' () As Long
'
Sub ClearClip()
    OpenClipboard Me.hWnd ' << если вызов не из формы, то ставь 0&
    EmptyClipboard
    CloseClipboard
End Sub

natalie

17.11.2010, 17:34

6

круто
БОЛЬШОЕ СПАСИБО

14 / 14 / 2

Регистрация: 23.03.2010

Сообщений: 635

17.11.2010, 21:29

7

2Comanche: и опять те же ‘грабли’…

From: comanche
http://relib.com/forums/topic.asp?pg=100&id=827382

Дело в том, что вышепривед╦нные два примера (как и мой из другого топика) — для форм VB, а не VBA. Формы VBA не имеют свойства hWnd. И даже не имеют свойства hDC, по которому можно было бы восстановить хэндл…



0



1 / 1 / 1

Регистрация: 18.06.2008

Сообщений: 329

18.11.2010, 04:30

8

если в ёкселе, то
Application.CutCopyMode = False



0



1 / 1 / 0

Регистрация: 03.07.2009

Сообщений: 112

18.11.2010, 06:01

9

В Excel точно работает
Application.Calculate



0



Comanche

18.11.2010, 12:10

10

2 vlth: блин, ну точно — те же грабли! )
2 Natalie: поскольку ‘Me.hWnd’ бессмысленно в VBA (как уже бывало, я перепутался с VB), то пиши вместо этого там ‘0&’ ВСЕГДА (а не только при вызове из модуля).

vladpros

0 / 0 / 0

Регистрация: 18.12.2015

Сообщений: 1

15.06.2016, 07:52

11

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim objClpb As New DataObject, sStr As String
 
'Так отправляем в буфер обмена необходимый текст/значениев VBA MS Excel
sStr = "наш текст"
objClpb.SetText sStr
objClpb.PutInClipboard
 
 
'Так очищаем, вернее, просто делаем пустую запись в буфер обмена в VBA MS Excel
sStr = ""
objClpb.SetText sStr
objClpb.PutInClipboard



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

15.06.2016, 08:22

12

vladpros, не работает!
Да и зачем так сложно, написали ведь выше уже для Экселя

Visual Basic
1
Application.CutCopyMode = False

Ну а что там у ТС — известно только ему…



0



2 / 2 / 0

Регистрация: 08.06.2017

Сообщений: 10

04.06.2019, 11:19

13

А в Ворде???



0



ArtNord

370 / 268 / 93

Регистрация: 18.11.2015

Сообщений: 990

04.06.2019, 11:36

14

_SVP_,

Visual Basic
1
Clipboard.Clear

очищает буфер обмена. Он не привязан к Word или Excel. Это буфер обмена Windows и поэтому будет одинаково работать в любом приложении где используется VBA.
Application.CutCopyMode = False — Это область для копирования вырезки для excel



1



370 / 268 / 93

Регистрация: 18.11.2015

Сообщений: 990

06.06.2019, 09:43

15

Блин, извиняюсь, затупил.
Clipboard.Clear — это в VB
Application.CutCopyMode = False
Это в VBA



1



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

06.06.2019, 10:13

16

Тоже не всегда срабатывает. Нашел один работающий вариант

Visual Basic
1
2
3
4
5
Public Sub ClearClipboard()
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .SetText Empty: .PutInClipboard
    End With
End Sub

Добавлено через 3 минуты

Application.CutCopyMode = False

не факт, то в памяти данные из Application
У меня данные брались из PDF методом Ctr+A Ctr+C



1



I’m working with VBA on ms Word.It run the word document copy the content to paste other document then process.After the finished process when closing the document display «large amount of text» warning.How do i over come this help me
any one.

ActiveDocument.Save
Application.ScreenUpdating = False
Application.DisplayAlerts = False
ActiveDocument.Close
Application.Quit

asked Feb 24, 2016 at 8:26

kumaran's user avatar

3

Use this to clear the clipboard and stop the clipboard message.

Application.CutCopyMode = False

answered Feb 24, 2016 at 10:02

Brendan Gooden's user avatar

Brendan GoodenBrendan Gooden

1,4602 gold badges20 silver badges40 bronze badges

gacol писал(а):Я имел введу именно событие Application.Calculation, при этом происходит и очистка буфера обмена.

Не-а, не происходит, и при Appication.Calculate не происходит, и при Application.CutCopyMode=False тоже не происходит, хотя я вчера сам в MSDN’е видел пример, где рядом с этой строкой стоит комментарий «Clear the Clipboard».

Убедиться достаточно легко — в Excele нажать Ctrl-C-C, чтобы открылся буфер обмена, и увидеть, что он ни фига не очищается. Единственный способ — нажать на кнопочку «Очистить все».

Вопрос с очисткой — на самом деле очень интересный. Я покопался в интернете, пока нашел немного.

Последняя запись в Буфере обмена Office совпадает с обычным Windows’ским Clipboard’ом. При использовании EmptyClipboard очищается именно Windows’ский, после этого через простую вставку ничего вставить нельзя, но очистки Буфера Офиса при этом не происходит!

Ну, что, будут у кого-нибудь какие-нибудь идеи? Самому уже интересно, хотя для меня, по крайней мере, вопрос практического смысла не имеет.

ЗЫ Кто-нибудь что-нибудь знает про DataObjects? Например, про них есть топик «What is the difference between the DataObject and the Clipboard?» в справке VBA…

Я использую Office 365 под Windows 10, 64-разрядная версия. Я пытаюсь очистить буфер обмена макросом Word. Регистратор макросов просто производит пустой саб.

Следующие попытки в основном собраны из Как очистить буфер обмена Office с помощью VBA:

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

Public Sub ClearClipboardA()
    Application.CutCopyMode = False
End Sub

Public Sub ClearClipBoardB()
    ' Source: http://www.vbaexpress.com/kb/getarticle.php?kb_id=462
    Dim oData As New DataObject
    oData.SetText Text:=Empty ' Clear
    oData.PutInClipboard ' Putting empty text into the clipboard to empty it
End Sub

Public Sub ClearClipboardC()
    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard
End Sub

Версия A: метод или элемент данных не найден

Версия B: работает без очистки буфера обмена. Вскоре появится небольшое желтое окно состояния: «7 из 24 — Буфер обмена | Элемент не извлечен» (переведено на английский)

Версия C: Похоже, ничего не происходит.

В приведенном выше справочнике пользователь iamstrained пишет: «Спустя годы, но если кто-то ищет, как это сделать в Office 365 под 64-разрядной версией, теперь вам нужно использовать модификации для обратной совместимости, чтобы эта работа работала: Private Declare PtrSafe и LongPtr. поскольку два ваших изменения этих значений решат проблемы и позволят ему по-прежнему работать «.

Я нашел ссылку на страницу Microsoft, где, возможно, это было сделано:

https://docs.microsoft.com/da-dk/office/vba/access/Concepts/Windows-API/send-information-to-the-clipboard

Используя показанные здесь подпрограммы, я могу вставлять текст в буфер обмена и извлекать из него текст. Но не понятно.

Если кому-нибудь удастся найти подпрограмму, которая фактически полностью очищает буфер обмена, я был бы очень признателен за ее публикацию здесь!

2020-09-25 17:38

5

ответов

Чтобы очистить буфер обмена офиса (из Excel):

#If VBA7 Then
    Private Declare PtrSafe Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
    ByVal iChildStart As Long, ByVal cChildren As Long, _
    ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 1
#Else
    Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
                                                              ByVal iChildStart As Long, ByVal cChildren As Long, _
                                                              ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
    Public Const myVBA7 As Long = 0
#End If

Public Sub EvRClearOfficeClipBoard()
    Dim cmnB, IsVis As Boolean, j As Long, Arr As Variant
    Arr = Array(4, 7, 2, 0)                      '4 and 2 for 32 bit, 7 and 0 for 64 bit
    Set cmnB = Application.CommandBars("Office Clipboard")
    IsVis = cmnB.Visible
    If Not IsVis Then
        cmnB.Visible = True
        DoEvents
    End If

    For j = 1 To Arr(0 + myVBA7)
        AccessibleChildren cmnB, Choose(j, 0, 3, 0, 3, 0, 3, 1), 1, cmnB, 1
    Next
        
    cmnB.accDoDefaultAction CLng(Arr(2 + myVBA7))

    Application.CommandBars("Office Clipboard").Visible = IsVis

End Sub

2020-11-21 22:03

Я могу подтвердить, что приведенный ниже код очищает буфер обмена Windows.

#If Win64 Then
Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
#Else
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
#End If

Public Sub ClearClipboard()
   OpenClipboard (0&)
   EmptyClipboard
   CloseClipboard
End Sub

Вы можете скачать безопасные объявления указателя со https://www.microsoft.com/en-us/download/confirmation.aspx?id=9970.

2020-09-25 18:02

У меня, вероятно, есть 8 часов на поиск VBA, чтобы очистить буфер обмена Office (а не Windows) в 64-битном Office 365. Все другие сообщения, которые я нашел, либо давали код, который выполнялся, но не очищал буфер обмена, либо говорили, что это невозможно сделать.

Если это помогает другим, #If, #Else, #End if дали мне ошибки, поэтому я выбрал 4 строки после #if для своих заявлений объявления.

Кстати, я запускаю это в MS Word VBA.

СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2021-05-06 02:16

Макрос EvR для очистки буфера обмена Office очень умен. (См . выше .) Он работает в Excel с моей 64-разрядной версией Microsoft (Office) 365 и Windows 10.

VBA7 был представлен вместе с Office 2010; это должно быть у всех сейчас. Директива vba7 не различает 64-битные; директива win64 делает это, если это необходимо. Итак, вот моя версия макроса EvR:

      Declare PtrSafe Function AccessibleChildren Lib "oleacc" ( _
    ByVal paccContainer As Office.IAccessible, _
    ByVal iChildStart As Long, ByVal cChildren As Long, _
    ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
Sub ClearOfficeClipboard()
    Dim A() As Variant, CB As Variant, n As Variant, i As Integer
    With Application
        If Not .DisplayClipboardWindow Then
            ClearClipboard
            .DisplayClipboardWindow = True
            ClearOfficeClipboard ' recurse
            Exit Sub
        End If
        On Error GoTo ErrHandler
        Set CB = .CommandBars("Office Clipboard")
        A = Array(0, 3, 0, 3, 0, 3, 1)
        For i = 0 To UBound(A)
            AccessibleChildren CB, A(i), 1, CB, n
        Next i
        CB.accDoDefaultAction CLng(0)
    End With
ErrHandler:: Set CB = Nothing
End Sub

Макрос ClearClipboard предоставлен Чипом Пирсоном, http://www.cpearson.com/Excel/Clipboard.aspx . (См. Тимоти Рилатт выше , но вместо win64 замените vba7.)

Я не понимаю цикл For, который вызывает AccessibleChildren. Может кто-нибудь объяснить, как это работает? Обратите внимание, что CB должен быть Variant, а не CommandBar или Object.

2022-03-02 16:42

I’ve used this above code snippet and it worked well until recent software updates that prevented me to clear the office clipboard without opening clipboard window. My solution it’s very simple: Add just this to the code:#If VBA7 ThenPrivate Declare PtrSafe Function AccessibleChildren Lib «oleacc» (ByVal paccContainer As Office.IAccessible, _ByVal iChildStart As Long, ByVal cChildren As Long, _ByRef rgvarChildren As Any, ByRef pcObtained As Long) As LongPublic Const myVBA7 As Long = 1#ElsePrivate Declare Function AccessibleChildren Lib «oleacc» (ByVal paccContainer As Office.IAccessible, _ByVal iChildStart As Long, ByVal cChildren As Long, _ByRef rgvarChildren As Any, ByRef pcObtained As Long) As LongPublic Const myVBA7 As Long = 0#End If

Public Sub EvRClearOfficeClipBoard()Dim cmnB, IsVis As Boolean, j As Long, Arr As VariantArr = Array(4, 7, 2, 0) ‘4 and 2 for 32 bit, 7 and 0 for 64 bitSet cmnB = Application.CommandBars(«Office Clipboard»)

‘Just add here…First’———————
With Application.DisplayClipboardWindow = True End With

      IsVis = cmnB.Visible 

If Not IsVis Then
    cmnB.Visible = True
    DoEvents
End If

For j = 1 To Arr(0 + myVBA7)
    AccessibleChildren cmnB, Choose(j, 0, 3, 0, 3, 0, 3, 1), 1, cmnB, 1
Next
    
cmnB.accDoDefaultAction CLng(Arr(2 + myVBA7))

Application.CommandBars("Office Clipboard").Visible = IsVis

‘And finish with this ‘——————— With Application .DisplayClipboardWindow = False End With

End Sub


24 авг ’21 в 23:09
2021-08-24 23:09

2021-08-24 23:09

Понравилась статья? Поделить с друзьями:
  • Как оформлять оглавление word
  • Как очистить word 2007 от всех документов
  • Как оформлять накладные в excel
  • Как очистить excel от символов
  • Как очистить excel от связей