Remkomplekty.ru

IT Новости из мира ПК
11 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel vba буфер обмена

VBA Copy to Clipboard, Paste and Clear

The VBA Tutorials Blog

This VBA tutorial will show you how to copy text to your clipboard, paste from your clipboard and clear the contents of your clipboard. These macros work with 32-bit versions Excel, Outlook, Word and many more Microsoft Office products.

2018 Update: This tutorial has been updated to teach you how to use VBA to copy text to your clipboard in Windows 8 and Windows 10. In this tutorial, I’ll present two solutions. The first solution uses the Microsoft Forms 2.0 Object Library to copy text to your clipboard in Windows 7 and earlier. With the rollout of Windows 8 and Windows 10, this solution no longer works reliably, so I’ve presented a second solution that uses Windows API calls to copy and paste using VBA.

Let’s take a look at the first, and oldest, solution:

Initial Setup

Microsoft Forms 2.0 Object Library

To gain access to to the clipboard methods in the clipboard class in older versions of Windows, you could declare a reference to the Microsoft Forms 2.0 Object Library by following these steps:

  1. Open your VBA editor.
  2. Click Tools > References.
  3. Check the box next to “Microsoft Forms 2.0 Object Library.”

Once your initial setup is complete, insert a module and continue reading to discover how to control your clipboard.

VBA Copy To Clipboard

Solution 1: Windows 7 and earlier

To copy to your clipboard in Windows 7 and earlier, you’ll need to first declare a variable as type MSForms.DataObject. The DataObject will be the bridge between your data and your clipboard.

Copy String to Clipboard

The SetText method is used to store a string in a DataObject. The string can be a VBA variable, as demonstrated above, or a cell in your worksheet, as demonstrated below. The PutInClipboard method is the magical piece that places the text in your clipboard.

Copy Cell to Clipboard

VBA is pretty good at converting your data types to strings before storing them in your clipboard, so you don’t have to worry about using the CStr function to manually convert.

Although I said this is the solution for Windows 7 and earlier, the following solution also works for Windows 7 and earlier. It has the added benefit of working for newer versions of Windows, as well.

Solution 2: Windows 8 and Windows 10

There’s a bit of a bug, if you want to call it that, in Windows 8 and Windows 10 that prevents the Microsoft Forms 2.0 Object Library solution from copying text to your clipboard. The workaround for this is to use Windows API calls, instead. Although intended to be used in newer versions of Windows, this VBA macro will successfully copy to your clipboard on all versions of Windows.

These macros are much longer than the previous solution, but they’re still easy to use since all you have to do is copy and paste. In many ways, this solution is actually easier to use because you don’t need to add a reference to the Microsoft Forms 2.0 Object Library to add text to your clipboard! You will still need to add the reference to the Microsoft Forms 2.0 Object Library to paste from your clipboard, so you might as well go ahead and add it.

Make powerful macros with our free VBA Developer Kit

This is actually pretty neat. If you have trouble understanding or remembering it, our free VBA Developer Kit can help. It’s loaded with VBA shortcuts to help you make your own macros like this one — we’ll send a copy to your email address below.

To actually place text on you clipboard, you would simply pass the ClipBoard_SetData macro an argument containing the string you want to store in your clipboard, like this:

This solution was adapted from a macro I saw here.

VBA Paste from Clipboard

Once you know how to copy, pasting is cinch. The syntax is practically identical to the Windows 7 copy examples shown earlier. Take a look.

Retrieve Clipboard Content

The GetFromClipboard method takes data from your clipboard and stores the data in the DataObject. The GetText method takes the string from the DataObject and puts it in your string variable — in this case, in the string variable str1 . You successfully pasted the content of your clipboard to a string variable that can be manipulated within your VBA macro.

VBA Clear Clipboard

How do you clear the content stored in the clipboard, you ask? There are several ways to clear your clipboard. The simplest is to set your clipboard equal to an empty string.

Set Clipboard to Empty String

Windows 7 and earlier

Windows 8 and later

A more thorough way of clearing your clipboard with VBA is to use our good friend, the user32 library.

Clear Entire Clipboard Contents

If you’re a long-time follower of the wellsr.com VBA blog, you’ll recognize user32. It’s a staple of computer automation, and I’ve showcased it in several tutorials. In addition to controlling your clipboard, user32.dll can be used to move your mouse and activate windows.

Note, the Private declarations must be pasted at the very top of your module, before any procedures. If you already pasted the big “Solution 2” macro for copying and pasting to your clipboard, you won’t need to add the Private declarations again, since they’re already there.

Final Thoughts

The ability to control your clipboard is a powerful feature of VBA. You can use it to automate complex tasks. For example, in my nuclear engineering career, I regularly work with large ASCII files on UNIX machines. I’ll copy the text to my clipboard, run a VBA macro on Windows to perform string manipulation on the text, then store the final content in my desired format back to my clipboard. I’ll then use this newly formatted string to continue my work on the UNIX boxes. Clipboard manipulation makes for a wonderful post-processor!

For more VBA tips, techniques, and tactics, subscribe to our VBA Insiders email series using the form below.

Share this article on Twitter and Facebook, then leave a comment below and let’s have a discussion.

Oh, and if you have a question, post it in our VBA Q&A community.

The best free VBA training on the web
I see people struggling with Excel every day and I want to help. That’s why I’m giving away my 90-days to Master VBA eCourse and my entire personal macro library for free.

Over 2 million people use our VBA tutorials each year to help automate their work. Are you ready to reclaim your time, too? Grab our VBA Cheat Sheets and you’ll be writing macros like a professional. With over 180 tips and 135 macro examples, they include everything you need to know to become a great VBA programmer.

Excel vba буфер обмена

Войти

Принципы работы с буфером обмена Windows

Перепост одной статьи с с блога WORDEXPERT, посвященная работе с буфером обмена из VBA. Решил взять себе на заметку после того, как познакомился с этой возможностью в программе VBHTMLMaker. Мне такая возможность показалость удобной — в некоторых случаях (и VBHTMLMaker тому хороший пример) это может быть простым и элегантным решением задачи по преобразованию каких-либо данных, когда затем результат необходимо вставить в тот же Excel, Word или аналогичные программы.
Принципы работы с буфером обмена Windows
Пятница, 8 августа 2008 г.

Эта статья была переведена специально для моего блога компанией AGI Triple в рамках специальной акции.

Статья написана специалистом MS Excel и для тех, кто работает с этой программой. Но общие принципы применимы и для разработчиков макросов под Word. Поэтому я и решил заказать перевод этой статьи и разместить ее в блоге. Надеюсь, она будет полезна вам.

На данной странице описываются некоторые методы, используемые в Visual Basic For Applications (VBA) для копирования данных в буфер обмена Windows, а также для получения данных из него. В VBA вы можете копировать или вставлять лишь текстовые данные.

Для того, чтобы скопировать данные непосредственно из ячейки рабочей таблицы в буфер обмена Windows, необходимо использовать метод COPY объекта Range, например: Range (“A1”).Copy. Однако скопировать в буфер обмена другие данные, такие как переменные, ссылки на ячейки, названия листов и т.д., не так-то просто.

В VBA не существует универсальных функций PutOnClipboard и GetOffClipboard, поэтому нам необходимо их создать, чем мы здесь и займемся. В ходе создания этих функций мы обратим внимание, каким образом VBA взаимодействует с буфером обмена Windows.

Так как данные функции используют переменную типа DataObject, то в вашем проекте VBA должна быть установлена ссылка на объектную библиотеку Microsoft Forms 2.0.

Копирование в буфер обмена

Для того чтобы получить доступ к буферу обмена из VBA, необходимо декларировать промежуточный объект типа DataObject. Если ваша процедура VBA будет работать с буфером обмена, необходимо заявить НОВЫЙ объект DataObject следующим образом:

Dim MyDataObj As New DataObject

Метод SetText переменной DataObject используется для хранения текстовых и числовых значений. Например:

MyDataObj.SetText «This Is A Text String»

Таким образом, содержимому MyDataObj присваивается определенное значение. Для того чтобы скопировать содержимое переменной MyDataObj в буфер обмена Windows, необходимо использовать метод PutInClipboard.

Вставка из буфера обмена

Для вставки содержимого буфера обмена, необходимо вызвать следующий метод:

Таким образом, переменной MyDataObj присваивается содержимое буфера обмена Windows.

Метод GetText является обратным методу SetText. Этот метод возвращает содержимое DataObject в другую переменную. Например:

Dim MyVar As Variant
MyVar = MyDataObj.GetText

Используя вышеперечисленное, мы можем создать в VBA следующие процедуры::

Public Sub PutOnClipboard(Obj As Variant )
Dim MyDataObj As New DataObject
MyDataObj.SetText Format(Obj)
MyDataObj.PutInClipboard
End Sub
Public Function GetOffClipboard() As Variant
Dim MyDataObj As New DataObject
MyDataObj.GetFromClipboard
GetOffClipboard = MyDataObj.GetText()
End Function
Public Sub ClearClipboard()
Dim MyDataObj As New DataObject
MyDataObj.SetText «»
MyDataObj.PutInClipboard
End Sub

Я достаточно часто использую эти процедуры для того, чтобы поместить формулу из активной ячейки в буфер обмена. Это позволяет осуществлять копирование и вставку таким образом, чтобы Excel при этом не изменял ссылки на ячейки. Возможно, будет полезно внести эти процедуры в список команд выпадающего меню правой кнопки мыши.

Sub CopyFormula()
Dim x As New DataObject
x.SetText ActiveCell.Formula
x.PutInClipboard
End Sub
Sub PasteFormula()
On Error Resume Next
Dim x As New DataObject
x.GetFromClipboard
ActiveCell.Formula = x.GetText
End Sub

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

Для полной очистки буфера обмена необходимо осуществить несколько вызовов API:

Declare Function CloseClipboard Lib «user32» () As Long
Declare Function EmptyClipboard Lib «user32» () As Long
Declare Function OpenClipboard Lib «user32» ( ByVal hwnd As Long ) As Long
Sub ClearClipboard()
OpenClipboard 0&
EmptyClipboard
CloseClipboard
End Sub

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

Работа с буфером обмена
Коллеги, как узнать — с какого листа текущей книги взята в буфер обмена некоторая область (и взята.

Работа с буфером обмена
Подскажите. Есть ли возможность реализовать следующее: Файлы пдф, тиф, джипе хранятся в базе в.

Работа с буфером обмена
Как сделать копирование выделенного объекта в буфер windows и вставку из буфера объекта (или просто.

Excel работа с буфером обмена
Возникла проблема с макросом для Excel Задача следующая: На рабочем листе выделены несколько.

Shell — консоль что-ли?

я запутался в этих «Shell», поэтому внятно не смогу объяснить. Есть в программировании библиотеки «Microsoft Shell Controls And Automation», «Windows Script Host Object Model». Вот этот «Shell» или что-то похожее я имею ввиду.

Пример работы с буфером обмена — поместить в буфер обмена данные из переменной макроса.

Решение

Там у VBA гораздо большие возможности, чем WSH в этом плане.

Способ 1. Через подключение библиотеки Microsoft Forms 2.0 Object Library:
(если не можете найти в References такой библиотеки, просто создайте пустую форму. Она будет автоматически подключена.)

Способ 2. Через прямой доступ к объекту MS Forms 2.0.

Способ 3. Через Win API.

может и есть возможности, но это надо сделать какое-то непонятное действие или создать пользовательскую форму, даже если форма не нужна.

Вот и вспомнил, что есть «Shell» и «WMI».

Скрипт, я не возражаю, если Вы создадите в том разделе еще раз тему.
Только не путайте, пожалуйста, Shell с WSH (Windows Scripting Host), Windows Batch (cmd), Linux Shell (Bash) и объектом shell.application — это все разные вещи (кроме последнего в составе WSH).

Добавлено через 7 минут
И даже напишу Вам код, как это реализуется на WSH. Только будьте уверены, что нативных средств для работы с буфером там нет.
Доступные примеры, которые гуляют по сети, реализованы через обращение к объекту «Internet.Explorer», HTA (по сути тот же IE — объект «HTMLFile»).

P.S. Про WMI я не слышал о возможности работать с буфером.
На счет консоли. Там работа связана с утилитой CLIP.exe, которая появилась только в Windows Vista. Так что ставка делается на утилиты ConClip от Карла Питерсона.

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

Скрипт, ну и нафига мне делать анонимные отзывы с текстом «Не одобряю». Не можешь по мужски разобраться? Получается, я зря все вот это написал и помощь Вам совершенно не нужна. Только зря свое время потерял, которого нет. Больше я в Ваши темы не лезу.

Dragokas, спасибо за надстройку

Небольшое описание надстройки:
1) это просто файл эксель
2) нужный код в модуле класса Clipboard
3) код использует средства WinApi
4) метод который помещает текст в буфер обмена назван Vvv
5) метод который извлекает текст из буфер обмена назван Www
6) русские буквы после вставки из буфера обмена нечитабельны (другая кодировка),
я заменил значение константы X3 c 1 (CF_TEXT) на 13 (CF_UNICODE) и
перед передачей текста в функцию Vvv конвертировал его в UNICODE:
StrConv(«Спасибо за помощь, Dragokas!», vbUnicode)

Метод извлечения текста из буфера не юзал

Добавлено через 49 минут
Ах да, данная надстройка даёт результат независимо от того открыт ли проводник или нет!

anton-sf, не за что. 2013 год? Это не моё и мало похоже на надстройку. Понятия не имею, откуда брал.

Не люблю спагетти-код.

Мой вариант будет выглядеть так:

Dragokas, в методе SetClipboardW работа с буфером обмена ведется дважды (в двух блоках), подскажите зачем?
Очень похоже на две реализации одного действа, но так как с API я не дружу то и утверждать не берусь

Добавлено через 13 минут
Возможно ли что ваш код не просто помещает текст а ещё и указывает кодировку (первый блок)?

Добавлено через 8 минут
Ага, ну так и есть, только не кодировку а язык ввода, круто !)

Это я выкладывал этот файл экселя. Сам код поместить / извлечь я нашёл в интернете и поместил его в книгу, подключив функции листа : щелчок прав/мышкой вставить из буфера, а двойной щелчок — скопировать в буфер обмена Win.

Есть ещё буферы обмена Офиса и там их по моему 24 шт. Когда копируем данные, так же они копируются в 1-й буфер офиса, данные из 1-го офиса перемещаются во 2-й буфер офиса, 2-й в 3-й , и т.д. Я когда то задавал вопрос как из VBA перебрать все эти 24 буфера , но мне никто не ответил. Может сейчас на этот вопрос есть ответ ??

Да, явно устанавливает локаль буфера обмена.
Это для решения проблемы при копировании русского текста со включённой английской раскладкой клавиатуры.

Но ваше замечание справедливое. Этот блок можно смело удалить. Он нужен только в случае, если вы копируете текст в буфер в формате CF_TEXT. Тогда система для преобразования текста из CF_TEXT в CF_UNICODETEXT берёт информацию указанную в CF_LOCALE, либо если там 0, то берёт текущую локаль.

Но поскольку там уже CF_UNICODETEXT, а в VBA текст в памяти хранится по умолчанию в юникоде (кроме некоторых контролов), то такое преобразование не производится.

Статьи из блога

Статья написана специалистом MS Excel и для тех, кто работает с этой программой. Но общие принципы применимы и для разработчиков макросов под Word. Поэтому я и решил заказать перевод этой статьи и разместить ее в блоге. Надеюсь, она будет полезна вам.

На данной странице описываются некоторые методы, используемые в Visual Basic For Applications (VBA) для копирования данных в буфер обмена Windows, а также для получения данных из него. В VBA вы можете копировать или вставлять лишь текстовые данные.

Для того, чтобы скопировать данные непосредственно из ячейки рабочей таблицы в буфер обмена Windows, необходимо использовать метод COPY объекта Range, например: Range (“A1”).Copy. Однако скопировать в буфер обмена другие данные, такие как переменные, ссылки на ячейки, названия листов и т.д., не так-то просто.

В VBA не существует универсальных функций PutOnClipboard и GetOffClipboard, поэтому нам необходимо их создать, чем мы здесь и займемся. В ходе создания этих функций мы обратим внимание, каким образом VBA взаимодействует с буфером обмена Windows.

Так как данные функции используют переменную типа DataObject, то в вашем проекте VBA должна быть установлена ссылка на объектную библиотеку Microsoft Forms 2.0.

Копирование в буфер обмена

Для того чтобы получить доступ к буферу обмена из VBA, необходимо декларировать промежуточный объект типа DataObject. Если ваша процедура VBA будет работать с буфером обмена, необходимо заявить НОВЫЙ объект DataObject следующим образом:

Метод SetText переменной DataObject используется для хранения текстовых и числовых значений. Например:

Таким образом, содержимому MyDataObj присваивается определенное значение. Для того чтобы скопировать содержимое переменной MyDataObj в буфер обмена Windows, необходимо использовать метод PutInClipboard.

Вставка из буфера обмена

Для вставки содержимого буфера обмена, необходимо вызвать следующий метод:

Таким образом, переменной MyDataObj присваивается содержимое буфера обмена Windows.

Метод GetText является обратным методу SetText. Этот метод возвращает содержимое DataObject в другую переменную. Например:

Используя вышеперечисленное, мы можем создать в VBA следующие процедуры::

Я достаточно часто использую эти процедуры для того, чтобы поместить формулу из активной ячейки в буфер обмена. Это позволяет осуществлять копирование и вставку таким образом, чтобы Excel при этом не изменял ссылки на ячейки. Возможно, будет полезно внести эти процедуры в список команд выпадающего меню правой кнопки мыши.

Для полной очистки буфера обмена необходимо осуществить несколько вызовов API:

Вы можете помочь в развитии сайта, сделав пожертвование:

Или помочь сайту популярной криптовалютой:

BTC Адрес: 1Pi3a4c6sJPbfF2sSYR2noy61DMBkncSTQ

ETH Адрес: 0x7d046a6eaa1bd712f7a6937b042e9eee4998f634

LTC Адрес: LUyT9HtGjtDyLDyEbLJZ8WZWGYUr537qbZ

DOGE Адрес: DENN2ncxBc6CcgY8SbcHGpAF87siBVq4tU

BAT Адрес: 0x7d046a6eaa1bd712f7a6937b042e9eee4998f634

XRP Адрес: rEb8TK3gBgk5auZkwc6sHnwrGVJH8DuaLh Депозит Tag: 105314946

USDT (ERC-20) Адрес: 0x7d046a6eaa1bd712f7a6937b042e9eee4998f634

Яндекс Деньги: 410013576807538

Вебмани (R ещё работает): R140551758553 или Z216149053852

А тут весь список наших разных крипто адресов, может какой добрый человек пожертвует немного монет или токенов — получит плюсик в карму от нас 🙂 Благо Дарим, за любую помощь!

VBA Copy to Clipboard, Paste and Clear

The VBA Tutorials Blog

This VBA tutorial will show you how to copy text to your clipboard, paste from your clipboard and clear the contents of your clipboard. These macros work with 32-bit versions Excel, Outlook, Word and many more Microsoft Office products.

2018 Update: This tutorial has been updated to teach you how to use VBA to copy text to your clipboard in Windows 8 and Windows 10. In this tutorial, I’ll present two solutions. The first solution uses the Microsoft Forms 2.0 Object Library to copy text to your clipboard in Windows 7 and earlier. With the rollout of Windows 8 and Windows 10, this solution no longer works reliably, so I’ve presented a second solution that uses Windows API calls to copy and paste using VBA.

Let’s take a look at the first, and oldest, solution:

Initial Setup

Microsoft Forms 2.0 Object Library

To gain access to to the clipboard methods in the clipboard class in older versions of Windows, you could declare a reference to the Microsoft Forms 2.0 Object Library by following these steps:

  1. Open your VBA editor.
  2. Click Tools > References.
  3. Check the box next to “Microsoft Forms 2.0 Object Library.”

Once your initial setup is complete, insert a module and continue reading to discover how to control your clipboard.

VBA Copy To Clipboard

Solution 1: Windows 7 and earlier

To copy to your clipboard in Windows 7 and earlier, you’ll need to first declare a variable as type MSForms.DataObject. The DataObject will be the bridge between your data and your clipboard.

Copy String to Clipboard

The SetText method is used to store a string in a DataObject. The string can be a VBA variable, as demonstrated above, or a cell in your worksheet, as demonstrated below. The PutInClipboard method is the magical piece that places the text in your clipboard.

Copy Cell to Clipboard

VBA is pretty good at converting your data types to strings before storing them in your clipboard, so you don’t have to worry about using the CStr function to manually convert.

Although I said this is the solution for Windows 7 and earlier, the following solution also works for Windows 7 and earlier. It has the added benefit of working for newer versions of Windows, as well.

Solution 2: Windows 8 and Windows 10

There’s a bit of a bug, if you want to call it that, in Windows 8 and Windows 10 that prevents the Microsoft Forms 2.0 Object Library solution from copying text to your clipboard. The workaround for this is to use Windows API calls, instead. Although intended to be used in newer versions of Windows, this VBA macro will successfully copy to your clipboard on all versions of Windows.

These macros are much longer than the previous solution, but they’re still easy to use since all you have to do is copy and paste. In many ways, this solution is actually easier to use because you don’t need to add a reference to the Microsoft Forms 2.0 Object Library to add text to your clipboard! You will still need to add the reference to the Microsoft Forms 2.0 Object Library to paste from your clipboard, so you might as well go ahead and add it.

Make powerful macros with our free VBA Developer Kit

This is actually pretty neat. If you have trouble understanding or remembering it, our free VBA Developer Kit can help. It’s loaded with VBA shortcuts to help you make your own macros like this one — we’ll send a copy to your email address below.

To actually place text on you clipboard, you would simply pass the ClipBoard_SetData macro an argument containing the string you want to store in your clipboard, like this:

This solution was adapted from a macro I saw here.

VBA Paste from Clipboard

Once you know how to copy, pasting is cinch. The syntax is practically identical to the Windows 7 copy examples shown earlier. Take a look.

Retrieve Clipboard Content

The GetFromClipboard method takes data from your clipboard and stores the data in the DataObject. The GetText method takes the string from the DataObject and puts it in your string variable — in this case, in the string variable str1 . You successfully pasted the content of your clipboard to a string variable that can be manipulated within your VBA macro.

VBA Clear Clipboard

How do you clear the content stored in the clipboard, you ask? There are several ways to clear your clipboard. The simplest is to set your clipboard equal to an empty string.

Set Clipboard to Empty String

Windows 7 and earlier

Windows 8 and later

A more thorough way of clearing your clipboard with VBA is to use our good friend, the user32 library.

Clear Entire Clipboard Contents

If you’re a long-time follower of the wellsr.com VBA blog, you’ll recognize user32. It’s a staple of computer automation, and I’ve showcased it in several tutorials. In addition to controlling your clipboard, user32.dll can be used to move your mouse and activate windows.

Note, the Private declarations must be pasted at the very top of your module, before any procedures. If you already pasted the big “Solution 2” macro for copying and pasting to your clipboard, you won’t need to add the Private declarations again, since they’re already there.

Final Thoughts

The ability to control your clipboard is a powerful feature of VBA. You can use it to automate complex tasks. For example, in my nuclear engineering career, I regularly work with large ASCII files on UNIX machines. I’ll copy the text to my clipboard, run a VBA macro on Windows to perform string manipulation on the text, then store the final content in my desired format back to my clipboard. I’ll then use this newly formatted string to continue my work on the UNIX boxes. Clipboard manipulation makes for a wonderful post-processor!

For more VBA tips, techniques, and tactics, subscribe to our VBA Insiders email series using the form below.

Share this article on Twitter and Facebook, then leave a comment below and let’s have a discussion.

Oh, and if you have a question, post it in our VBA Q&A community.

The best free VBA training on the web
I see people struggling with Excel every day and I want to help. That’s why I’m giving away my 90-days to Master VBA eCourse and my entire personal macro library for free.

Over 2 million people use our VBA tutorials each year to help automate their work. Are you ready to reclaim your time, too? Grab our VBA Cheat Sheets and you’ll be writing macros like a professional. With over 180 tips and 135 macro examples, they include everything you need to know to become a great VBA programmer.

Читать еще:  Преобразование файла pdf в формат word
Ссылка на основную публикацию
Adblock
detector