Error handling 使用GetText从剪贴板获取文本-避免在剪贴板上仅显示图形时出错

Error handling 使用GetText从剪贴板获取文本-避免在剪贴板上仅显示图形时出错,error-handling,excel,clipboard,excel-2003,vba,Error Handling,Excel,Clipboard,Excel 2003,Vba,这是我在这里提出的问题的延伸: 这个问题的答案很好地避免了空剪贴板的错误,但现在我发现我还必须处理一个只包含图形而不包含文本的剪贴板,这种情况会通过空剪贴板过滤器 那么,当剪贴板上只有一个图形而没有文本时,如何中止该过程呢?您可以使用此代码测试剪贴板中数据的格式是否为图像 Option Explicit Private Declare Function OpenClipboard Lib "user32" _ (ByVal hwnd As Long) As Long Private Dec

这是我在这里提出的问题的延伸:

这个问题的答案很好地避免了空剪贴板的错误,但现在我发现我还必须处理一个只包含图形而不包含文本的剪贴板,这种情况会通过空剪贴板过滤器


那么,当剪贴板上只有一个图形而没有文本时,如何中止该过程呢?

您可以使用此代码测试剪贴板中数据的格式是否为图像

Option Explicit

Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long

Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long

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

Const CF_BITMAP = 2

Sub Sample()
    Dim RetClpB As Long
    Dim RetBmp As Long

    '~~> Open Clipboard
    RetClpB = OpenClipboard(0&)

    '~~> Check if we were successful
    If RetClpB <> 0 Then
        '~~> Test if the data in Clipboard is an image by
        '~~> trying to get a handle to the Bitmap
        RetBmp = GetClipboardData(CF_BITMAP)

        '~~> If found
        If RetBmp <> 0 Then
            MsgBox "data in clipboad is an image"
        Else
            MsgBox "data in clipboad is not an image"
        End If
    End If

    '~~> Close Clipboard
    RetClpB = CloseClipboard
End Sub
选项显式
私有声明函数OpenClipboard Lib“user32”_
(ByVal hwnd As Long)一样长
私有声明函数GetClipboardData库“user32”_
(ByVal wFormat作为整数)长度相同
私有声明函数CloseClipboard Lib“user32”(长度为
常数CF_位图=2
子样本()
如长
暗淡如长
“~~>打开剪贴板
RetClpB=OpenClipboard(0&)
“~~>检查我们是否成功
如果RetClpB为0,则
“~~>通过以下方式测试剪贴板中的数据是否为图像:
“~~>正在尝试获取位图的句柄
RetBmp=GetClipboardData(CF\u位图)
“~~>如果找到
如果为0,则
MsgBox“剪贴板中的数据是图像”
其他的
MsgBox“剪贴板中的数据不是图像”
如果结束
如果结束
“~~>关闭剪贴板
RetClpB=CloseClipboard
端接头

好吧,这需要一段时间,但这里有一些方法

为了重申这个问题,我想使用DataObject.GetFromClipboard从剪贴板中提取文本,将错误捕获设置为在所有错误时中断,并且在剪贴板上找不到文本时不抛出错误

 Sub TEST_getClipText()
    Debug.Print getClipText
 End Sub
 Function getClipText() As String
    Dim DataObj As MsForms.DataObject
    Set DataObj = New MsForms.DataObject 'tnx jp
    Dim V As Variant
    For Each V In Application.ClipboardFormats
       If V = xlClipboardFormatText Then
          DataObj.GetFromClipboard
          getClipText = DataObj.getText(1)
          Exit Function
       End If
    Next V
    MsgBox "No text on clipboard"
 End Function

谢谢Siddharth,但这只能找到位图,我需要检测任何类型的图形对象,它们可以占据剪贴板上的图片槽。事实上,我认为我已经远离了我最初的问题,即在尝试使用GetText阅读之前检测剪贴板上是否有文本。看看VBA对ClipboardFormats属性的帮助,我们能不能在不使用API的情况下使用它呢?我唯一感兴趣的格式是xlClipboardFormatText。无论剪贴板上还有什么,如果该格式不可用,则我希望中止该过程。当错误捕获被设置为在所有错误上中断时,这需要在不抛出错误的情况下完成。我知道这里有一个答案,就是想逃出去:)另一种方法: