Как скопировать в буфер обмена с помощью Access / VBA? - PullRequest
33 голосов
/ 05 апреля 2011

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

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

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

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

Это единственные два варианта?

Ответы [ 3 ]

57 голосов
/ 05 апреля 2011

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

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

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

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

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
7 голосов
/ 22 сентября 2011

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

, которая работает хорошо.:)

6 голосов
/ 27 февраля 2013

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

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

Вы можете получить Исходный код Ли Уэббера здесь

Если эта ссылка не проходит, найдите «Объект буфера обмена для VBA» в Центре разработки Office> Форумы Microsoft Office для разработчиков> Раздел Word для разработчиков.

Я создал два класса, провел его тестовые случаи, и он отлично работал в 32-разрядном VBA Outlook 2007 с пакетом обновления 3 (SP3) под 64-разрядным Windows 7. Скорее всего, это будет работать для доступа. Совет: чтобы переименовать классы, выберите класс в окне «Проект» 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)

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

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

-Джит

...