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

Работа с буфером обмена в 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. Показов 53175. Ответов 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



{quote}{login=Hugo}{date=16.11.2010 09:53}{thema=}{post}Быстро и без лишней информации (и без буфера) можно копировать через массив.  
Только здесь вероятно или через много массивов, или через один много раз.  
Что-то вроде  

  Sub tt()  
Dim a  
a = [a1:b10]
[e1:f10] = a
End Sub{/post}{/quote}  

  Как этоприменить к моему макросу, если поможите сократить — буду оч. признателен    
Вот полный код:    
Sub KPI_9()  
‘ KPI_9 Макрос  
‘ Расходы_департамента безопастности  
Application.ScreenUpdating = False  
Application.StatusBar = «Подождите, выполняется обновление данных…»  
‘ Путь  
   Workbooks.Open Filename:= _  
       «http://srv-portal/sites/fin/budg/PL/Безопасность%20и%20Фрод/Расходы_ДБ.xlsx», _  
       UpdateLinks:=0  

  ‘ УРАЛ (УРАЛ)со строки 3 (7 строк ) конец 9 строка  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«УРАЛ»).Select  
   Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Visible = True  
‘Отобразить лист  
   Sheets(«9»).Select  
   Range(«A3»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ Екатеринбург (ЕКБ)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«ЕКБ»).Select  
   Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A13»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ Челябинск (ЧЛБ)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«ЧЛБ»).Select  
    Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A23»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ Курган (КУРГ)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«КУРГ»).Select  
   Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A33»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ ХМАО (ХМАО)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«ХМАО»).Select  
   Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A43»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ ЯНАО (ЯНАО)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«ЯНАО»).Select  
    Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A53»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ Пермь (ПРМ)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«ПРМ»).Select  
   Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A63»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ Тюмень (ТМН)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«ТМН»).Select  
    Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A73»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ КОМИ (КОМИ)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«КОМИ»).Select  
   Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A83»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ Удмуртия (УДМ)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«УДМ»).Select  
   Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A93»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
‘ Киров (КИР)  
   Windows(«Расходы_ДБ.xlsx»).Activate  
   Sheets(«КИР»).Select  
   Range(«A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14»).Select  
   Selection.Copy  
   Windows(«Base of PL.xlsm»).Activate  
   Sheets(«9»).Select  
   Range(«A103»).Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  

          Cells.SpecialCells(xlCellTypeLastCell)(2).Copy  
‘ скопировать пустую ячейку  

     ActiveWindow.SelectedSheets.Visible = False  
‘ Скрыть лист  
Windows(«Расходы_ДБ.xlsx»).Activate  
ActiveWindow.Close False  
‘ Закрыт без сохранения (если закрыть с сохранением то ActiveWorkbook.Saved = True)  
Windows(«Base of PL.xlsm»).Activate  
Sheets(«Главная»).Select  
Application.ScreenUpdating = True  
Application.StatusBar = False  
MsgBox «Данные обновлены!»  

  End Sub

Много лет эксплуатирую а-а-а-агромную задачу типа бюджетирования на крупном предприятии (но конкретная задача — это лирическое отступление).

Суть проблемы вот в чем.

Допустим копирую 1000000 (миллион) формул.
Естественно не одним оператором, в цикле на разных листах.
Допустим 50листов Excel соответствуют 50подразделениям предприятия.
В цикле первые 30 обрабатываются нормально, а на 31-ом ошибка (и останов) в программе с сообщением что-то типа не хватает выделенной памяти.
Обрабатываю эту ситуацию так:
— сохраняю файл;
— перезагружаю комп;
— запускаю дальнейшую обработку начиная с 31-го подразделения.

Такая технология не есть правильная, на экономистов ее не перепихнешь (что желательно), приходится самому эксплуатацией заниматься.

???
Может быть в VBA есть (да есть наверняка) возможность освободить захламленную прежними копированиями буферную память.

Присоветуйте, кто знает.


Попробуйте в тот же цикл вставить после вставки:

[a1].copy'(любую, можно пустую ячейку)
Doevents' дадим системе время самой о себе позаботиться

Еще пример:

Sub Макрос1()
'очищает ClipBoard (буфер обмена).
'для работы примера должна быть подключена библиотека
'Microsoft Forms 2.0 Object Library в Tools - References...
'(или нужна любая пользовательская форма в проекте)
   Dim MyData As DataObject, MyTest$
   Set MyData = New DataObject
   'копируем в буфер обмена
   MyData.SetText "Test of copying and pasting to/from Clipboard!"
   MyData.PutInClipboard
   MyData.GetFromClipboard    'вставляем из буфер обмена
   MyTest = MyData.GetText(1)
   MsgBox MyTest
   MyData.Clear    ' чистим буфер
End Sub

И с помощью API:

Private Declare Function EmptyClipboard Lib "user32" () As Long

Я, как всегда, чертовски адекватен… Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771


Здравствуйте KuklP, уже давно я тему основал   
Как очистить системные буфера средствами VBA
« : 25 Август 2011, 06:53:19 »
Был только один Ваш ответ.

Пробовал воспользоваться Вашими советами, но как-то не очень получается

Пример

[a1].copy'(любую, можно пустую ячейку)
Doevents’ дадим системе время самой о себе позаботиться

что-то эффекта не дал

Пример

Sub Макрос1()
‘очищает ClipBoard (буфер обмена).
‘для работы примера должна быть подключена библиотека
‘Microsoft Forms 2.0 Object Library в Tools — References…
‘(или нужна любая пользовательская форма в проекте)
   Dim MyData As DataObject, MyTest$
   Set MyData = New DataObject
   ‘копируем в буфер обмена
   MyData.SetText «Test of copying and pasting to/from Clipboard!»
   MyData.PutInClipboard
   MyData.GetFromClipboard    ‘вставляем из буфер обмена
   MyTest = MyData.GetText(1)
   MsgBox MyTest
   MyData.Clear    ‘ чистим буфер
End Sub

В принципе, то что нужно.

Но у меня не получилось его адаптировать
Вот мне нужно тупо скопировать 10миллионов ячеек (только числа)
из одной книги Excel в другую
Копирую программно со 100листов 36диапазонов по 25000ячеек
(итого 90миллионов ячеек) — это в идеале, реально могу сократиться до 10миллионов ячеек.
Полтора-два миллиона пролетают за 10секунд, а потом все… На копирование каждого блока 25000ячеек уходит до минуты.

Можно ли подкорректировать Ваш пример (у меня не получилось) «очищает_буфер_обмена» так, чтобы в MyData заглатывать диапазон ячеек, затем из MyData вставлять ячейки на новом месте (в другой книгеExcel), а потом делать MyData.Clear    

Заранее благодарен,
С.Казменко (dimikust)


Как Вы копируете? Через буфер обмена, т.е.

range1.Copy
range2.Paste

? Так, конечно, не надо делать. Если копируете ячейки целиком, с форматированием, используйте

range1.Copy range2В качестве range2 можно указать одну первую ячейку диапазона.

Если копируете формулы (Допустим копирую 1000000 (миллион) формул), используйте

range2.Formula = range1.FormulaЕсли копируете значения (Вот мне нужно тупо скопировать 10миллионов ячеек (только числа)), используйте

range2.Value = range1.ValueВ двух последних случаях диапазоны range1 и range2 должны иметь одинаковый размер, иначе можно получить ошибку или неожиданный результат.

Работает на порядок быстрее и не занимает буфер обмена.


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

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

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

ВНИМАНИЕ: для работы функций требуется установка ссылки на библиотеку 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
  • 68159 просмотров

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

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

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

VBA: копирование массива в буфер обмена

​Смотрите также​​ в обратной последовательности,​ буфер обмена в​ даже не имеют​ поддерживается в VBA​
​или вам важен​ объем данных?​ копировал свои объекты​ объект при вставке.​ на каждый текстбокс.​ 8 ячеек ниже.​: Реально сделать на​ буфер обмена очищался​

​ состав «Microsoft Forms​ приложение это и​

​End With​
​ буфером обмена​
​Darkman​
​ т.е. первая скопированная​
​ VBA MS Excel​

​ свойства hDC, по​ (в отличие от​

​ не результат, а​​Sasha_Smirnov​

​ у меня в​​Sub My() Dim​ И один скрин​Pana-Win​ AutoIt — делал.​ и производил копирование​ 2.0 Object Library».​

​ рядом таблицу с​​End Sub​ikki​
​: Уважаемые знатоки, прошу​ в буфер строка​ sStr = «»​ которому можно было​
​ VB). Делай так:​
​ сам процесс(общения на​
​: Может, с какого-то​ буфере остаётся мусор,​ PPAppl As Object​

​ на заголовок самого​​: По аналогии прицелиться​Но нужно «щупать»​ следующих восьми шифров.​Pana-Win​

​ листа — то​​ikki​
​: как вариант (но​ помощи. К сожалению​

​ будет вставлена в​
​ objClpb.SetText sStr objClpb.PutInClipboard​
​ бы восстановить хэндл…если​
​Private Declare Function​
​ форуме)?​

​ боку устроит код​
​ но всё бы​ Set PPAppl =​
​ окна.​
​ дальше в нужные​

​ ту программу, и​​ Ну а в​: Всем доброго времени​ может быть разницы​: Игорь, такой вариант​

​ надо пробовать):​
​ поиском не нашел​ конец листа последней.​vladpros​ в ёкселе, то​ OpenClipboard Lib ‘user32’​
​Gepar​ от Ципиховича (а​ хорошо но он​ CreateObject(«PowerPoint.Application») PPAppl.Visible =​Или Team Viewer.Ага,​ кнопки мышкой (что​ в общем пишется​

​ конце списка, чтоб​​ суток! Столкнулся с​ и не заметите​ даёт строку с​

​временно сохранить этот​​ похожей темы.​Буду благодарен за​, не работает!​
​Application.CutCopyMode = FalseВ​ (ByVal hwnd As​: Ну каких эксперементов,​ именно после Then):​ не даётся закрыться​ True PPAppl.Presentations.Add PPAppl.ActivePresentation.Slides.Add​ разобрался вроде))​ не айс, ибо​
​ не за 5​ макрос обработал оставшееся​ такой проблемой: в​ :)​ разделителями-табуляциями, а не​ массив в диапазон​Задача следующая: скопировать​ любую помощь.​Да и зачем​ Excel точно работает​

​ Long) As Long​​ в любом word​ Убрать лишнее сообщение,​ ворду своим тупым​
​ 1, 2 ActiveDocument.InlineShapes(1).Select​Gepar​ координаты и поменяться​ минут.​
​ число шифров, которое​ экселе имеется список​
​Но нужно конечно​ таблицу :(​

​ ячеек на листе​​ в буфер обмена​Сам я флешер​ так сложно, написали​

planetaexcel.ru

Работа с буфером обмена в VBA

​Application.Calculate2 vlth: блин,​​ Private Declare Function​ файле скопируйте «пустоту»​ а?​ запросом на то​ ActiveDocument.ActiveWindow.Selection.Copy PPAppl.ActiveWindow.View.Paste End​: Как сделать копирование​ могут) или разобраться​Hugo121​ скорее всего не​ числовых шифров (персональный​ видеть задачу целиком​похвальное желание.​ (можно скрытом).​ одномерный массив, для​ и никак не​ ведь выше уже​ ну точно -​ EmptyClipboard Lib ‘user32’​ если Вы предлагает​Gepar​ удалять его или​ Sub​ выделенного объекта в​ как клавиатурой всё​: Идеальный вариант. Сделать​ будет равно восьми.​ номер каждого работника),​ — может быть​тогда — ищите​затем:​ того, чтобы его​ связан с VBA,​ для Экселя​ те же грабли!​ () As Long​ этот вариант, даже​:​ оставить. Как почистить​Alex77755​ буфер windows и​ делать и симулировать.​

​ кликер вроде активировать​​ Люди добрые, кто​
​ необходимо их перенести​ проще сделать временный​

​ и изучайте инфу​​диапазон_ячеек.Copy​ можно было вставить​ просто человек попросил​Application.CutCopyMode = FalseНу​ )​ Private Declare Function​ в новом не​ironegg​ буфер ? Копирую​: Не совсем то​

​ вставку из буфера​​ В таком варианте​ окно, выбрать область,​
​ понимает и разбирается​ в программу на​ документ Экселя, выгрузить​ о формате представления​и — шагом​

​ в виде таблицы​​ написать макрос, чтобы​ а что там​2 Natalie: поскольку​ CloseClipboard Lib ‘user32’​ сохранённом ворд файле​, а Вы скажите​ так​ но ..​
​ объекта (или просто​ как правило всё​ копировать активировать окно​ в этом помогите,​

​ подобии 1С для​​ туда этот массив​ информации в буфере​ марш в «другое​ в совершенно другое​ автоматизировать некоторые операции​ у ТС -​
​ ‘Me.hWnd’ бессмысленно в​ () As Long​ например, я конечно​ как перед закрытием​

​ActiveDocument.InlineShapes(1).Select ActiveDocument.ActiveWindow.Selection.Copy PPAppl.ActiveWindow.View.Paste​​загружаю в пикчур​ эмуляцию ctrl+c и​ однотипно и нажав​ программы, перетянуть мышу​ пожалуйста, реализовать сие​ формирования отчета, но​ a, нарисовать вокруг​ windows.​ приложение»​ приложение.​ с екселем на​ известно только ему…​ VBA (как уже​ ‘ Sub ClearClip()​ могу Вам приложить​ скопировать туда пустоту​Alex77755​

​ из файла​ ctrl+v) через макрос​ к примеру таб​ куда надо, щёлкнуть,​
​ чудо )))​ вставка в эту​
​ красивую рамку, затем​ибо, если вам​Darkman​
​Dim a(1 To​ работе.​s0ny​ бывало, я перепутался​ OpenClipboard Me.hWnd ‘​ пустой файл word​
​ и я это​: Не уверен на​

CyberForum.ru

Работа с буфером обмена

​очищаю буфер​​ vba?​ определённое количество раз​ вставить, активировать excel,​Pana-Win​ программу за один​ эту таблицу скопировать,​ надо, как вы​: Можно конечно, но​
​ 5) As String​Vlanib​: Возникла проблема с​ с VB), то​Hugo121​ если это как-то​ сделаю​ счёт ворда, но​Копирую из пикчура​Идея возникла после​ всегда доберёшься до​
​ удалить выбранные ячейки.​: Возможно.​ раз возможно только​ документ убить.​ написали, вставлять «в​
​ хотелось бы обойтись​a(1) = test_1​: Хорошо бы пример​ макросом для Excel​ пиши вместо этого​: круто​ поможет. Сделать это?​dzug​

​ в екселе имеется​​ в буфер​ того как потратил​
​ нужного места. Уродский​С синтаксисом нужно​
​Приведите пример книги,​
​ ВОСЬМИ шифров, а​Darkman​
​ виде таблицы», то​ без создания промежуточных​
​a(2) = test_2​ файла с точно​Задача следующая:​

​ там ‘0&’ ВСЕГДА​​БОЛЬШОЕ СПАСИБО​

​XPraptor​​: Может это поможет:​ возможность отключить…​

​Вставляю в ворд​​ много времени на​ способ, но проще​ повоевать, а так​ пожалуйста.​ их очень много.​: Hugo, ребята, спасибо​ задача не такая​ дополнительных книг.​a(3) = test_3​ поставленной задачей. Чует​На рабочем листе​ (а не только​2Comanche: и опять​: вот собственно и​
​Прочесть буфер обмена​

​вроде так​​ в рамку​ попытки перенести картинку​ некуда​ вполне себе лёгкий​
​Hugo121​
​ Возможно ли создать​

​ Вам всем огромное​​ уж тривиальная, насколько​Hugo​
​a(4) = test_4​ сердце буфер тут​ выделены несколько строк.​

​ при вызове из​​ те же ‘грабли’…​ весь вопрос​ironegg​Application.DisplayAlerts = False​

​PIC.Picture = LoadPicture(Картинка1.Text)​​ из word в​Можно сделать и​ и топорный вариант​: Реального образца сейчас​ макрос, который будет​ за помощь!​

​ мне известно.​​: Sub PutInClb()​​a(5) = test_5​​ вобще не зачем.​ Макрос находит выделенные​ модуля).Dim objClpb As​From: comanche​Заранее спасибо​

​: а в чем​​Gepar​
​ Clipboard.Clear Clipboard.SetData PIC.Picture​

​ powerpoint и заметил​​ более человеческим способом​korvindeson​ нету, накидал как​ автоматически копировать по​
​Это уже огромный​Юрий М​Dim a(1 To​Заранее спасибо за​s0ny​ строки и последовательно​
​ New DataObject, sStr​http://relib.com/forums/topic.asp?pg=100&id=827382​vlth​ проблема? скопировать пустоту​

​: Закрываю word вот​​ DocWord.Frames.Item(2).Range.Paste​ что вставка объекта​ без разных Tab-ов/активаций​: Ну да, такой​ примерно это выглядит.​ 8 шифров с​ шаг вперед, единственное,​: А никто и​ 5) As String​ помощь!​: прикрепил файл с​ копирует их в​

CyberForum.ru

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

​ As String ‘Так​​Дело в том,​: Clipboard.Clear​
​ или скопировать перед​

​ так если что​​Gepar​

​ через ctrl+v скопированного​​ через WinAPI.​

​ примерно процесс и​​ Идет пофамильный список​
​ данным шагом из​

​ что заменил vbTab​​ не предлагал дополнительных​a(1) = «test_1″​Serge​ примером​
​ буфер обмена, причем​ отправляем в буфер​ что вышепривед╦нные два​Letter_D​ закрытием?​WordAppl.DisplayAlerts = False​: А в pp ?​ в word’е ранее​Нужно воспользоваться этим:​ нужен. Только ещё​ людей и в​ экселя, заносить данные​

​ на vbNewLine​​ книг :-)​
​a(2) = «test_2″​

​: Поможет?​Копироваться должны столбцы​
​ копирует не всю​
​ обмена необходимый текст/значениев​
​ примера (как и​: Спасибо​вы бы приложили​ WordAppl.Documents.Close WordAppl.QuitНо предупреждение​Alex77755​ по ctrl+c меня​ http://www.cyberforum.ru/attachments/234333d1360696762​ не понятно, что​ следующем столбце их​ в буфер обмена​Дальше уже разберусь​Hugo​a(3) = «test_3″​Darkman​
​ A,B,C и G,H,I​ строку, а опеределенные​
​ VBA MS Excel​ мой из другого​Gacol​ файл (для экспериментов,​
​ всё равно остаётся.​: программно не работал.​ вполне устраивает.​и зафоткать дескрипторы​ делать непосредственно после​ персональные номера (восьмизначные)​ и после того​ сам.​: Ну если это​a(4) = «test_4″​: К сожалению нет,​Думаю буфер все​ ячейки строки(ячейки могут​ sStr = «наш​ топика) — для​: не работает​ без лишнего хлама)​ironegg​ не знаю​Хотя с этим​ textbox-ов в той​ вставки.​ — шифры. Очень​ как я произведу​​Единственный вопрос, что​​ выгрузить на лист,​
​a(5) = «test_5″​ массив то уже​ же нужен, т.к.​ идти непоследовательно). Затем​
​ текст» objClpb.SetText sStr​ форм VB, а​Help!​ — задача была​

CyberForum.ru

Excel работа с буфером обмена

​: а если скопирвать​​Gepar​ частично разобрался, разобраться​
​ программе.​
​Ячейки можно не​ вам признателен за​ вставку этих 8​ за объект New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}​ то будет таблица.​With GetObject(«New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}»)​ задан, тут больше​ вставляться скопированные строки​ макрос вставляет скопированные​ objClpb.PutInClipboard ‘Так очищаем,​ не VBA. Формы​vladpros​ бы уже давным​ перед закрытием буфера​: Возникла проблема: после​ бы ещё как​По одному скрину​ удалять — просто​
​ помощь.​ шифров с помощью​
​Hugo​А если например​.SetText Join(a, vbTab):​ копать надо в​ могут в другой​ строки в конец​ вернее, просто делаем​ VBA не имеют​

​: Объект ClipBoard не​​ давно решена.​ пустоту, или малый​ того как я​ форматировать по центру​ при наведении мышкой​

​ выделять-копировать область на​​korvindeson​ Cntr-V в программу,​
​: DataObject, входящий в​ выгрузить в другое​
​ .PutInClipboard​ сторону работы с​ документ​ листа, причем вставляет​ пустую запись в​

CyberForum.ru

​ свойства hWnd. И​

Понравилась статья? Поделить с друзьями:
  • Excel макрос отобразить все ячейки
  • Excel макрос открыть файл если нет то создать
  • Excel макрос открыть ссылку
  • Excel макрос открыть с помощью
  • Excel макрос открыть открытый файл