【问题标题】:Get text from clipboard using GetText - avoid error on empty clipboard使用 GetText 从剪贴板获取文本 - 避免空剪贴板出错
【发布时间】:2012-01-26 17:13:12
【问题描述】:

我正在使用这样的代码从剪贴板中获取文本。

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

我使用错误处理来解决剪贴板为空的情况,只要我将错误捕获设置为未处理错误时中断,一切都很好。

但是,出于不相关的原因,我想将错误捕获设置为在所有错误时中断,这会在找到空剪贴板时在DataObj.GetText 处引发错误。是否有任何类型的测试我可以在上游进一步应用以避免尝试处理空剪贴板?

【问题讨论】:

    标签: excel vba clipboard copy-paste clipboarddata


    【解决方案1】:

    使用On Error GoTo 处理错误,如下所示:

    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
    

    你会注意到它也会处理一个空的剪贴板。

    注意:要使代码正常工作,您必须 have a reference 到“Microsoft Forms 2.0 对象库”(此文件可以在 32 位机器上的 C:\windows\system32\FM20.dll 或 64 位机器上的 C:\Windows\sysWOW64\FM20.dll 找到),否则您会收到错误 "User-Defined type not defined"

    您可以使用下面的代码在测试上面的代码之前清空剪贴板。请将其粘贴到模块中。

    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
    

    编辑:您还可以使用以下代码确定剪贴板是否为空:

    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
    

    【讨论】:

    • 我会使用Dim DataObj As MSForms.DataObjectSet DataObj = MsForms.DataObject(单独的行)来避免自动实例化变量。此外,一个函数最适合抓取剪贴板文本并将其返回。
    • 希望看到一个示例 :) 实际上建议您将整个代码发布在新帖子中。它不仅会帮助 OP,还会帮助其他任何寻求解决方案的人:)
    • 没有。我不建议这样做;)原因是它可以帮助新人从中学习;)既然您提出了建议,为什么不在新帖子中跟进呢?
    • 你已经有 99% 的代码,第二个几乎重复的答案是多余的。
    • 您是否按照我的建议清除了剪贴板?如果是,那么您应该看到消息“剪贴板上的数据不是文本或为空”。我在发布之前测试了代码:)
    【解决方案2】:

    添加以下代码只是 b4 用于调试的断线....该错误在测试后对我消失了..奇怪但它以某种方式工作(Excel 2010)

    myString = DataObj.GetText(1)
    MsgBox myString
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多