Консультация № 172169
14.09.2009, 14:13
0.00 руб.
0 12 1
Уважаемые эксперты помогите освоить на ВБА всё что связано с WinApi
Поясню что я хочу этими знаниями добиться
1)удалять то что находится в буфере обмена, если ни я лично его туда помещал, а ВБА по моим инструкциям
2)работать с открытыми приложениями не входящими в Office то есть считать данные с окон, нажать на кнопку имеющейся в приложении
Если WinApi решает одну из этих двух задач то подскажите. Спасибо Эндрю

Обсуждение

Неизвестный
14.09.2009, 14:46
общий
это ответ
Здравствуйте, Ципихович Эндрю.
Для работы с буфером обмена можно обойтись и функциями VBA, хотя WinAPI намного функциональнее. Предлагаю то, чем пользуюсь сам:
Код:
' ============= работа с буфером обмена
Public Sub SetClipboard(Obj As Variant)
Dim MyDataObj As New DataObject
MyDataObj.SetText CStr(Obj)
MyDataObj.PutInClipboard
End Sub

Public Function GetClipboard() As Variant
GetClipboard = "": On Error Resume Next
Dim MyDataObj As New DataObject
MyDataObj.GetFromClipboard: GetClipboard = MyDataObj.gettext
End Function

Public Sub ClearClipboard()
Dim MyDataObj As New DataObject
MyDataObj.SetText "": MyDataObj.PutInClipboard
End Sub
' ============= работа с буфером обмена(конец)

Как заставить это работать? Создайте новый модуль, чтобы не потерять эти процедуры и функции среди остальных. Назовите его, например, ClipboardRoutines (работа с буфером обмена). Вставьте в него приведенный код.
Как вы видите, в коде имеются две процедуры SetClipboard и ClearClipboard. Соответственно для записи в буфер и для очистки его. И функция GetClipboard для получения содержимого буфера обмена. Перед каждой процедурой или функцией стоит ключевое слово Public, которому мы с вами посвятили уже немало времени. Как вы догадываетесь, это слово делает эти процедуры доступными из других модулей.
Как пользоваться?
Чтобы записать в буфер что-либо, напишите внутри вашей процедуры:
Call SetClipboard("строка для копирования в буфер обмена")

Чтобы очистить буфер:
Call ClearClipboard

Чтобы прочитать содержимое буфера:
Dim ClpBrdContent As Variant 'Переменная в которую будем читать
ClpBrdContent = GetClipboard 'Вызов функции. Поскольку функция возвращает значение, то это значение нужно чему-то присвоить.
давно
Профессионал
848
1596
14.09.2009, 15:03
общий
1. Очистка буфера, код для формы.
Код:
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long

Private Sub Command1_Click()
Call OpenClipboard(Me.hwnd)
Call EmptyClipboard
Call CloseClipboard
End Sub

Если вы програмируете в VB6 то можно очистить и 1 командой Clipboard.Clear
2. Довольно объемный вопрос и описать его в 2 строчках невозможно. Все что вы написали с помощью АПИ можно делать.
Тут можно найти некоторые примеры.
Вот хороший пример
Неизвестный
14.09.2009, 20:33
общий
Витер Александр Анатольевич:
Спасибо за ответ, кстати как то Вы мне отвечали, что в случае если например перед запуском макроса в буфере было слово например диод
затем я запускаю макрос в котором имеется инструкция что-то скопировать то затем нельзя это что-то удалить чтобы в буфере было опять тот же диод.
А тут Вы отвечаете что это возможно, не понятно?. Но Ваш ответ я опробовать не успел потому. что СОС!!! радость была не долгой, я тут после разбирательств с Публик и Привате обнаружил, что у меня мои макросы не реагируют на выполнение имется ввиду выполнение клавишами клавиатуры, а те которые запускаются полями макробуттон успешно запускаются. Подскажите в чём дело, как исправить.
Неизвестный
14.09.2009, 21:25
общий
Нужно переназначить клавиши. Так, как написано здесь
Неизвестный
14.09.2009, 21:31
общий
Витер Александр Анатольевич:
Последние новости что касается СОС отбой, всё сделал причина была в том, что я переименовывал модуль НьюМакрос
Ваш пример побробовал не делает он то что я хочу:
в случае если например перед запуском макроса в буфере было слово например диод
затем я запускаю макрос в котором имеется инструкция что-то скопировать то затем нельзя это что-то удалить чтобы в буфере было опять тот же диод.
Может вариант специалиста PsySex подойдёт? не знаю, но почитав его ответ вижу что пахнет тем же WinAPI, в котором я ничего непонимаю, специалист ли терпеливый, не знаю. Подскажите Эндрю
Неизвестный
14.09.2009, 21:52
общий
PsySex:
Спасибо заответ, я извиняюсь по Вашей ссылке "Вот хороший пример" я зашёл качнул файл распаковал его в нём восемь файлов
Выбрал из них файл с расширением БАС импортировал как модуль в ВБА
Вопрос в том 1)правильно ли я сделал? 2)я привык все процессы смотреть посредством Эф8, как с какого места мне начинать жать Эф8?
3)Ваш пример:
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Sub Command1_Click()
Call OpenClipboard(Me.hwnd)
Call EmptyClipboardCall CloseClipboard
End Sub
сможет ли решить мою задачу:
в случае если например перед запуском макроса в буфере было слово например диод
затем я запускаю макрос в котором имеется инструкция что-то скопировать то затем нельзя это что-то удалить чтобы в буфере было опять тот же диод.
Спасибо Эндрю
давно
Профессионал
848
1596
14.09.2009, 22:32
общий
1,2) Это проект для VB6, помимо BAS(файла модуля) там есть еще и FRM -это код форм. Т.е. недостаточно открыть BAS, программа начинает работу с кода формы. В "BAS" содержаться подпрограммы и объявление API функций. Для того чтобы увидеть пример вам нужна среда разработки VB6.
3)Надо сказать, что у меня нет желания описывать вашу задачу на чистом API, потому как это считаю не нужной задачей, к тому же этой займет не 1 десяток строк. Для решения вашей задачи подойдет код Витер Александра Анатольевича или пример с объектом Clipboard, к сожалению не могу сейчас сказать, что нужно подключить в VBA, чтоб этот объект был доступен(если мне не изменяет память по умолчанию его нет), т.к. дома OpenOffice, завтра на работе посмотрю.
Собственно алгоритм решения задачи прост. Сначала вы сохраняете в переменную содержание буфера, делаете свои операции, а затем восстанавливаете буфер из переменной. Т.е.
'начало вашего макроса
Dim vOldClipboard As Variant
'сохраняем буфер
vOldClipboard = GetClipboard
'здесь ваш любой код макроса
'...
'очищаем буфер
Call ClearClipboard
'восстанавливаем буфер из сохраненной переменной
Call SetClipboard(vOldClipboard)
Неизвестный
15.09.2009, 08:09
общий
Да, я забыл сказать, чтобы работал мой проект нужно зайти в меню Tools→References и поставить галочку напротив Microsoft Forms 2.0 Object Library
Неизвестный
15.09.2009, 08:16
общий
PsySex:
Здравствуйте спасибо за ответ
Собрал два кода, а именно код водуля Витер А.А.
' ============= работа с буфером обмена
Public Sub SetClipboard(Obj As Variant)
Dim MyDataObj As New DataObject
MyDataObj.SetText CStr(Obj)
MyDataObj.PutInClipboard
End Sub

Public Function GetClipboard() As Variant
GetClipboard = "": On Error Resume Next
Dim MyDataObj As New DataObject
MyDataObj.GetFromClipboard: GetClipboard = MyDataObj.gettext
End Function

Public Sub ClearClipboard()
Dim MyDataObj As New DataObject
MyDataObj.SetText "": MyDataObj.PutInClipboard
End Sub
' ============= работа с буфером обмена(конец)
И Ваш код:
'начало вашего макроса
Dim vOldClipboard As Variant
'сохраняем буфер
vOldClipboard = GetClipboard
'здесь ваш любой код макроса
'...
Я добавил:Селектион.Копи, потому что было часть текста выделено например "ВБА"
'очищаем буфер
Call ClearClipboard
'восстанавливаем буфер из сохраненной переменной
Call SetClipboard(vOldClipboard)
И всё работает как надо
Вопрос в том можно ли этот объект "ВБА" еще убрать с лифта который находится слева от документа при открытом Правка>Буфер обмена Оффис, чтобы не мозолил глаз
Спасибо Эндрю
давно
Профессионал
848
1596
15.09.2009, 08:34
общий
Ципихович Эндрю:
хотя наверна я немного ошибся, это и есть та библиотека о который сказано выше, т.е. нет объекта Clipboard как я писал. :-)
давно
Профессионал
848
1596
15.09.2009, 08:37
общий
можно ли этот объект "ВБА" еще убрать с лифта который находится слева от документа при открытом Правка>Буфер обмена Оффис, чтобы не мозолил глаз

не могу вам, сказать, я мало работал именно в vba.
Неизвестный
15.09.2009, 12:39
общий
Витер Александр Анатольевич:
Здравствуйте Витер А.А.
В настоящее время у меня по Вашему совету галочка напротив Microsoft Forms 2.0 Object Library стоит, я её не ставил она уже стояла
Затем я собрал два кода, а именно Ваш код модуля
' ============= работа с буфером обмена
Public Sub SetClipboard(Obj As Variant)
Dim MyDataObj As New DataObject
MyDataObj.SetText CStr(Obj)
MyDataObj.PutInClipboard
End Sub

Public Function GetClipboard() As Variant
GetClipboard = "": On Error Resume Next
Dim MyDataObj As New DataObject
MyDataObj.GetFromClipboard: GetClipboard = MyDataObj.gettext
End Function

Public Sub ClearClipboard()
Dim MyDataObj As New DataObject
MyDataObj.SetText "": MyDataObj.PutInClipboard
End Sub
' ============= работа с буфером обмена(конец)
И код PsySex, Специалиста:
'начало вашего макроса
Dim vOldClipboard As Variant
'сохраняем буфер
vOldClipboard = GetClipboard
'здесь ваш любой код макроса
'...
Я добавил:Селектион.Копи, потому что было часть текста выделено например "ВБА"
'очищаем буфер
Call ClearClipboard
'восстанавливаем буфер из сохраненной переменной
Call SetClipboard(vOldClipboard)
И всё работает как надо
Вопрос в том можно ли этот объект "ВБА" еще убрать с лифта который находится справа от документа при открытом Правка>Буфер обмена Оффис, чтобы не мозолил глаз
Спасибо Эндрю
Форма ответа