Как скопировать в буфер обмена с помощью Access / VBA?

30

Использование VBA внутри Access2003/2007.

Как скопировать содержимое строковой переменной в буфер обмена?

Этот сайт рекомендует создать текстовый блок с нулевой длиной, скопировав строку в TextBox, а затем запустив DoCmd.RunCommand acCmdCopy. Тьфу. Я имею в виду, мы можем пойти по маршруту. Но все равно. Тьфу.

В то время как статья базы знаний MS показывает нам, как это сделать, но она включает в себя ряд вызовов Windows API. Юк.

Являются ли эти два варианта?

  • 3
    Сопротивление коду API в пользу добавления внешней ссылки действительно глупо.
  • 1
    Я почти не нажимал на ссылку MS, потому что я прочитал «gazillion», просто для справки, это 5 вызовов API, и они даже превратили это в приятную функцию для вас. Черт возьми, я бы почти хотел скопировать / вставить его и опубликовать здесь, потому что мы все знаем, как MS собирается удалять ссылки.
Теги:
ms-access
access-vba
clipboard

3 ответа

55
Лучший ответ

VB 6 предоставляет объект Clipboard, который делает все это чрезвычайно простым и удобным, но, к сожалению, недоступным из VBA.

Если бы это был я, я бы пошел по маршруту API. Нет причин бояться вызова собственных API-интерфейсов; язык предоставляет вам возможность сделать это по какой-либо причине.

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

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

Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject
clipboard.SetText "A string value"
clipboard.PutInClipboard

Или, чтобы скопировать текст из буфера обмена в строковую переменную:

Dim clipboard As MSForms.DataObject
Dim strContents As String

Set clipboard = New MSForms.DataObject
clipboard.GetFromClipboard
strContents = clipboard.GetText
  • 5
    +1 за придерживаться API. С точки зрения работы с API, это действительно не так много дополнительного кода. Тем более, что вы просто копируете и вставляете код один раз из MSDN, а затем вызываете простую функцию ClipBoard_SetData() когда вам это нужно. Я согласен, что это любопытный недосмотр для VBA, но маршрут API действительно не так уж и плох.
  • 0
    +1 четыре строки плюс ссылка на формы dll. отлично ответил на наше требование.
Показать ещё 10 комментариев
7

Я не мог понять, как использовать API, используя первые результаты Google. К счастью, нить куда-то указала мне на эту ссылку: http://access.mvps.org/access/api/api0049.htm

Что работает хорошо.:)

  • 0
    (Ваши ссылки указывают на идентичную страницу)
  • 2
    (хм, похоже, у меня проблемы с буфером обмена)
Показать ещё 1 комментарий
6

Пользователь Leigh Webber на сайте social.msdn.microsoft.com опубликовал код VBA, реализующий простой в использовании интерфейс буфера обмена, который использует Windows API:

http://social.msdn.microsoft.com/Forums/en/worddev/thread/ee9e0d28-0f1e-467f-8d1d-1a86b2db2878

Вы можете получить исходный код Leigh Webber

Если эта ссылка не проходит, найдите "Центр буфера обмена для VBA" в центре Office Dev Center > Microsoft Office for Developers Forums > Word for Developers.

Я создал два класса, запустил тестовые примеры, и он отлично работал в 32-битном VBA Outlook 2007 с пакетом обновления 3 (SP3) под 64-разрядной версией Windows 7. Скорее всего, это будет работать для Access. Совет. Чтобы переименовать классы, выберите класс в окне "Проект" VBA, затем нажмите "Просмотр" в строке меню и нажмите "Окно свойств" (или просто нажмите F4).

С его классами это то, что требуется для копирования в/из буфера обмена:

Dim myClipboard As New vbaClipboard  ' Create clipboard

' Copy text to clipboard as ClipboardFormat TEXT (CF_TEXT)    
myClipboard.SetClipboardText "Text to put in clipboard", "CF_TEXT"    

' Retrieve clipboard text in CF_TEXT format (CF_TEXT = 1)
mytxt = myClipboard.GetClipboardText(1)

Он также предоставляет другие функции для манипулирования буфером обмена.

Он также преодолевает ограничение 32 КБ MSForms_DataObject.SetText - основная причина, по которой SetText часто терпит неудачу. Однако имейте в виду, что, к несчастью, я не нашел ссылку на Microsoft, признающую это ограничение.

-Джит

Ещё вопросы

Сообщество Overcoder
Наверх
Меню