Как в excel очищать буфер обмена vba

Работа с буфером обмена в VBA Excel: копирование и вставка ячеек, копирование текста из переменной, очистка буфера обмена. Объект DataObject. Примеры.

Копирование и вставка ячеек

Копирование содержимого и форматов ячеек (диапазона) в буфер обмена осуществляется методом Range.Copy, а вставка – методом Worksheet.Paste:

‘Копирование одной ячейки в буфер обмена

Range(«A10»).Copy

Cells(10, 1).Copy

‘Копирование диапазона ячеек в буфер обмена

Range(«B8:H12»).Copy

Range(Cells(8, 2), Cells(12, 8)).Copy

‘Вставка ячейки (диапазона) из буфера обмена на рабочий лист

ActiveSheet.Paste Range(«A20»)

ActiveSheet.Paste Cells(20, 1)

При вставке диапазона ячеек из буфера обмена на рабочий лист достаточно указать верхнюю левую ячейку места (диапазона) вставки.

Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, формулы, примечания и т.д.), а также применения к диапазону транспонирования или вычислений, используется метод Range.PasteSpecial (специальная вставка).

Буфер обмена и переменная

Передача текста между переменной и буфером обмена в VBA Excel осуществляется с помощью объекта DataObject. Стоит иметь в виду, что на некоторых компьютерах DataObject может некорректно работать при открытом окне проводника.

Объект DataObject

DataObject – это область временного хранения форматированных фрагментов текста, используемая в операциях переноса данных.

Подробнее об элементе DataObject вы можете прочитать на сайте разработчиков.

Методы объекта DataObject:

Метод Описание
GetFromClipboard Копирует данные из буфера обмена в DataObject
GetText Извлекает текстовую строку из объекта DataObject в указанном формате
PutInClipboard Перемещает данные из DataObject в буфер обмена
SetText Копирует текстовую строку в DataObject, используя указанный формат

Копирование текста из переменной в буфер обмена

Sub Primer2()

Dim s As String, myData As New DataObject

s = «Копирование текста из переменной в буфер обмена»

‘Копируем текст из переменной в DataObject

myData.SetText (s)

‘Перемещаем текст из DataObject в буфер обмена

myData.PutInClipboard

‘Проверяем содержимое буфера обмена

ActiveSheet.Paste Range(«A1»)

End Sub

Копирование текста из буфера обмена в переменную

Sub Primer3()

Dim s As String, myData As New DataObject

Range(«A1») = «Копирование текста из буфера обмена в переменную»

‘Копируем данные из ячейки в буфер обмена

Range(«A1»).Copy

‘Копируем данные из буфера обмена в DataObject

myData.GetFromClipboard

‘Извлекаем текст из объекта DataObject и присваиваем переменной s

s = myData.GetText

‘Проверяем содержимое переменной s

MsgBox s

End Sub

Очистка буфера обмена

Специального метода для очистки буфера обмена в VBA Excel нет. Для решения этой задачи можно использовать выход из режима вырезания-копирования:

Application.CutCopyMode = False

Следующий пример демонстрирует вставку скопированной ячейки "A1" в ячейки "A2" и "A3" и отсутствие вставки в ячейки "A4" и "A5" после строки Application.CutCopyMode = False:

Sub Primer4()

Range(«A1») = «Очистка буфера обмена»

Range(«A1»).Copy

ActiveSheet.Paste Range(«A2»)

ActiveSheet.Paste Range(«A3»)

Application.CutCopyMode = False

On Error Resume Next

ActiveSheet.Paste Range(«A4»)

ActiveSheet.Paste Range(«A5»)

End Sub

Оператор On Error Resume Next необходим для обработки (пропуска) ошибки, возникающей при вставке из пустого буфера обмена.

Функции для работы с буфером обмена

В некоторых системах, начиная с Windows 8, метод DataObject.PutInClipboard не работает правильно: если открыт хотя бы один экземпляр Проводника (папка), в буфер обмена записываются два квадратика. Следующие функции должны решить эту проблему:

‘Функция записи текста в буфер обмена

Function SetClipBoardText(ByVal Text As Variant) As Boolean

    SetClipBoardText = CreateObject(«htmlfile»).parentWindow.clipboardData.SetData(«Text», Text)

End Function

‘Функция вставки текста из буфера обмена

Function GetClipBoardText() As String

    On Error Resume Next

    GetClipBoardText = CreateObject(«htmlfile»).parentWindow.clipboardData.GetData(«Text»)

End Function

‘Функция очистки буфера обмена

Function ClearClipBoardText() As Boolean

    ClearClipBoardText = CreateObject(«htmlfile»).parentWindow.clipboardData.clearData(«Text»)

End Function

Пример использования функций для работы с буфером обмена:

Sub Primer()

Dim s As String

    s = «Копирование текста из переменной в буфер обмена»

    ‘Копируем текст в буфер обмена

    SetClipBoardText (s)

    ‘Вставляем текс из буфера обмена в ячейку «A1»

    Range(«A1») = GetClipBoardText

    ‘Очищаем буфер обмена, если это необходимо

    ClearClipBoardText

End Sub


natalie

1

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

17.11.2010, 10:01. Показов 53211. Ответов 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



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

Return to VBA Code Examples

Excel VBA Clear Clipboard

Clearing the clipboard in Excel VBA only requires a single line of code:

Application.CutCopyMode = False

vba clear clipboard

However, this is different from the standard Windows clipboard.  To clear the Windows clipboard you can use the EmptyClipboard Function.  Copy and paste the code below into a code module and run Sub TestClipboardClear to clear the Windows clipboard.

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 Function ClearClipboard()
  OpenClipboard (0&)
  EmptyClipboard
  CloseClipboard
End Function

Sub TestClipboardClear()
  Call ClearClipboard
End Sub

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

vba-free-addin

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(No installation required!)

Free Download

Результат чтения текста из буфера обмена

Функции для работы с буфером обмена

(очистка буфера обмена, запись в буфер обмена, чтение из буфера обмена)

ВНИМАНИЕ: для работы функций требуется установка ссылки на библиотеку Microsoft Forms 2.0 Object Library:

Public Sub SetClipboard(Obj As Variant)
    Dim MyDataObj As New DataObject
    MyDataObj.SetText Format(Obj)
    MyDataObj.PutInClipboard
End Sub
 
Public Sub SetTextIntoClipboard(ByVal txt As String)
    Dim MyDataObj As New DataObject
    MyDataObj.SetText txt
    MyDataObj.PutInClipboard
End Sub
 
Public Function GetClipboard() As Variant
    GetClipboard = "": On Error Resume Next
    Dim MyDataObj As New DataObject
    MyDataObj.GetFromClipboard: GetClipboard = MyDataObj.GetText()
End Function
 
Public Sub ClearClipboard()
    Dim MyDataObj As New DataObject
    MyDataObj.SetText "": MyDataObj.PutInClipboard
End Sub

Аналогичная функция ClipboardText (чтение текста из буфера обмена), но не требующая подключения библиотеки:

Sub ПримерИспользования()
    txt = ClipboardText
    MsgBox txt, vbInformation, "Содержимое буфера обмена Windows"
End Sub
 
Function ClipboardText() ' чтение из буфера обмена
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        ClipboardText = .GetText
    End With
End Function
 
Sub SetClipboardText(ByVal txt$) ' запись в буфер обмена
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText txt$
        .PutInClipboard
    End With
End Sub
  • 68191 просмотр

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

Like this post? Please share to your friends:
  • Как в excel очистить ячейки без формул
  • Как в excel очистить клетки
  • Как в excel очистить имя ячейки
  • Как в excel оформить титульный лист
  • Как в excel оформить содержание