Получить текст из буфера обмена с помощью GetText-избежать ошибки в пустом буфере обмена


Я использую такой код, чтобы получить текст из буфера обмена.

Dim DataObj As New MSForms.DataObject
DataObj.GetFromClipboard
myString = DataObj.GetText

Я использую обработку ошибок, чтобы получить прошлый случай, когда буфер обмена пуст, и все в порядке, пока я сохраняю ловушку ошибок, настроенную на разрыв необработанных ошибок.

Однако по несвязанным причинам я хочу установить ловушку ошибок, чтобы сломать все ошибки, и это вызывает ошибку в DataObj.GetText, когда он находит пустой буфер обмена. Есть ли какой-либо тест, который я могу применить дальше вверх по течению, чтобы избежать попыток обработать пустой буфер обмена?

3 12

3 ответа:

Помогает ли это?

Sub GetClipBoardText()
   Dim DataObj As MSForms.DataObject
   Set DataObj = New MsForms.DataObject '<~~ Amended as per jp's suggestion

   On Error GoTo Whoa

   '~~> Get data from the clipboard.
   DataObj.GetFromClipboard

   '~~> Get clipboard contents
   myString = DataObj.GetText(1)
   MsgBox myString

   Exit Sub
Whoa:
   If Err <> 0 Then MsgBox "Data on clipboard is not text or is empty"
End Sub

Вы заметите, что он также будет обрабатывать пустой буфер обмена.

Вы можете очистить буфер обмена перед тестированием вышеуказанного кода с помощью кода ниже. Пожалуйста, вставьте его в модуль.

Private Declare Function OpenClipboard Lib "User32.dll" _
(ByVal hWndNewOwner As Long) As Long

Private Declare Function EmptyClipboard Lib "User32.dll" () As Long

Private Declare Function CloseClipboard Lib "User32.dll" () As Long

Public Sub ClearClipboard()
    Dim Ret

    Ret = OpenClipboard(0&)
    If Ret <> 0 Then Ret = EmptyClipboard
    CloseClipboard
End Sub

EDIT: New Request by OP

Private Declare Function CountClipboardFormats Lib "user32" () As Long

Sub Sample()
    If (CountClipboardFormats() = 0) = True Then
        MsgBox "Clipboard is empty"
    Else
        MsgBox "Clipboard is not empty"
    End If
End Sub

Надеюсь, это поможет кому-то еще:

Я получал ошибку "пользовательский тип не определен" в коде, опубликованном Сиддхарт-раут

Оказалось, что библиотека "Microsoft Forms 2.0 Object Library" отсутствует / не активирована.

Получил его, чтобы работать с этим (http://excel-macro.tutorialhorizon.com/vba-excel-reference-libraries-in-excel-workbook/):

" иногда вы не найдете нужные ссылки в списке, скажем, вы не найдете "Microsoft Forms 2.0 Object Библиотека " в списке инструментов / ссылок в этом случае вам нужно просмотреть FM20.DLL файл из system32 "

Добавьте следующий код просто B4 прерывающая строка для отладки.... ошибка исчезла для меня после этого теста.. wierd но это как-то работает (Excel 2010)

myString = DataObj.GetText(1)
MsgBox myString