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

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

Статья написана специалистом 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.SetText  123.456

 

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

 

MyDataObj.PutInClipboard

 

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

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

 

MyDataObj.GetFromClipboard

 

Таким образом, переменной 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

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 4

  1. Fillimon
    08.08.2008 в 19:13 | #1

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

  2. Алексей
    12.08.2009 в 13:50 | #2

    Отлично. Мне помогло. А то спрашивал, как в буфер вставить из ворда, и два ответа: Clipboard.SetText или Windows API. Объекта Clipboard просто нет в вордовском VBA, а через API не получилось. А методом просто и быстро. Спасибо.

  3. vladivir
    02.10.2011 в 09:20 | #3

    сложновато не получается осмыслить сразу

  4. Пинтер
    02.03.2021 в 13:47 | #4

    подскажите, плиз, как включить в формулу копирование определённой ячейки?

Оставьте комментарий!

(обязательно)

^ Наверх