Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Пользователь 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, признающую это ограничение.

-Джит