Использование VBA внутри Access2003/2007.
Как скопировать содержимое строковой переменной в буфер обмена?
Этот сайт рекомендует создать текстовый блок с нулевой длиной, скопировав строку в TextBox, а затем запустив DoCmd.RunCommand acCmdCopy
. Тьфу. Я имею в виду, мы можем пойти по маршруту. Но все равно. Тьфу.
В то время как статья базы знаний MS показывает нам, как это сделать, но она включает в себя ряд вызовов Windows API. Юк.
Являются ли эти два варианта?
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
ClipBoard_SetData()
когда вам это нужно. Я согласен, что это любопытный недосмотр для VBA, но маршрут API действительно не так уж и плох.
Я не мог понять, как использовать API, используя первые результаты Google. К счастью, нить куда-то указала мне на эту ссылку: http://access.mvps.org/access/api/api0049.htm
Что работает хорошо.:)
Пользователь 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, признающую это ограничение.
-Джит