Работа с буфером обмена в 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 |
не работает |
Comanche |
||||
17.11.2010, 17:06 |
5 |
|||
Объект ClipBoard не поддерживается в VBA (в отличие от VB). Делай так:
|
natalie |
|
17.11.2010, 17:34 |
6 |
круто |
14 / 14 / 2 Регистрация: 23.03.2010 Сообщений: 635 |
|
17.11.2010, 21:29 |
7 |
2Comanche: и опять те же ‘грабли’… From: comanche Дело в том, что вышепривед╦нные два примера (как и мой из другого топика) — для форм VB, а не VBA. Формы VBA не имеют свойства hWnd. И даже не имеют свойства hDC, по которому можно было бы восстановить хэндл…
0 |
1 / 1 / 1 Регистрация: 18.06.2008 Сообщений: 329 |
|
18.11.2010, 04:30 |
8 |
если в ёкселе, то
0 |
1 / 1 / 0 Регистрация: 03.07.2009 Сообщений: 112 |
|
18.11.2010, 06:01 |
9 |
В Excel точно работает
0 |
Comanche |
|
18.11.2010, 12:10 |
10 |
2 vlth: блин, ну точно — те же грабли! ) |
vladpros 0 / 0 / 0 Регистрация: 18.12.2015 Сообщений: 1 |
||||
15.06.2016, 07:52 |
11 |
|||
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
15.06.2016, 08:22 |
12 |
|||
vladpros, не работает!
Ну а что там у ТС — известно только ему…
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_,
очищает буфер обмена. Он не привязан к Word или Excel. Это буфер обмена Windows и поэтому будет одинаково работать в любом приложении где используется VBA.
1 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
06.06.2019, 09:43 |
15 |
Блин, извиняюсь, затупил.
1 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
||||
06.06.2019, 10:13 |
16 |
|||
Тоже не всегда срабатывает. Нашел один работающий вариант
Добавлено через 3 минуты Application.CutCopyMode = False не факт, то в памяти данные из Application
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
1
Would a simple
Application.CutCopyMode = False
work for your situation, or is this option not viable?
answered Sep 23, 2015 at 12:53
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
answered Sep 23, 2015 at 10:19
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
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
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
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
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
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!
Learn More!
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 просмотр
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.