粘贴前请检查剪贴板内容

4

在Excel VBA中粘贴前,是否可以检查剪贴板内容?

我今天遇到了这个问题:

Sheets.Add After:=Sheets(Sheets.Count)   ' Create new sheet
ActiveSheet.Paste                        ' Paste from Clipboard
IsMultiLevel = (InStr(Range("A1"), "Multi-Level") > 0) ' Determine type of report
If Not IsMultiLevel Then
    MsgBox ("ERROR in Clipboard Data!!")
    End
Else
    ActiveSheet.Delete
End If

我希望在添加新工作表之前检查数据,这样我就不需要删除它。我想要像这样的东西。
IsMultiLevel = (InStr([CLIPBOARD], "Multi-Level") > 0) ' Determine type of report
If Not IsMultiLevel Then
    MsgBox ("ERROR in Clipboard Data!!")
    End
End If
Sheets.Add After:=Sheets(Sheets.Count)   ' Create new sheet
ActiveSheet.Paste                        ' Paste from Clipboard
3个回答

5

如果你从Excel 2003过来,那么你可以通过使用MSForms.DataObject来检查剪贴板内容。首先你需要创建一个引用(VBA窗口工具/引用),引用的是Microsoft Forms 2.0对象库(通常在...\system32\FM20.DLL中找到)。

然后你就可以将剪贴板读入一个文本变量中:

Dim BufObj As MSForms.DataObject, BufTxt as String

Set BufObj = New MSForms.DataObject
BufObj.GetFromClipboard
BufTxt = Buf.GetText

缓冲区文本将保持不变(至少在Win XP / SP3,MS Office 2003 SP 3中),可供进一步使用,即GetFromClipboard不会破坏剪贴板缓冲区。需要考虑的问题是,剪贴板内容可用作文本,因此任何图形都将以原始文本模式存储。此外,需要考虑缓冲区大小,因为Excel中的可变长度字符串最多只能容纳大约2 ^ 31个字符(但我认为这应该足够满足90%的所有需求)。


5
非常感谢大家!你们真是太棒了! 我想和你们分享我的解决方案。
Function GetClipboardText(nChars As Integer) As String
    Dim BufObj As MSForms.DataObject
    Set BufObj = New MSForms.DataObject
    BufObj.GetFromClipboard
    GetClipboardText = Left(BufObj.GetText, nChars) ' Get only first nChars
End Function

Sub CreateOverviewSheet()
' Determine type of report in Clipboard
    IsMultiLevel = (InStr(GetClipboardText(100), "Multi-Level") > 0)
    IsConsolidated = (InStr(GetClipboardText(100), "Consolidated") > 0)
    If Not IsMultiLevel Or IsConsolidated Then
        MsgBox ("ERROR in Clipboard Data!!")
        End
    End If
    Sheets.Add After:=Sheets(Sheets.Count)   ' Create new sheet
    ActiveSheet.Paste                        ' Paste from Clipboard
    .
    .  and so on...
    .
End Sub

很棒的答案!注意:这需要引用“Microsoft Forms 2.0 Object Library”。如果您没有看到它,请参见此处 - ChaimG

1
请理解,在不影响其他应用程序的情况下,无法查看剪贴板内容(除了检查可用格式列表)。如果放置数据的应用程序正在使用延迟渲染,则会触发一个无法撤销的事件(该应用程序将被强制生成数据,并期望用户已经粘贴了数据)。这也会对网络连接上的剪贴板同步产生影响,例如使用远程桌面。而且我的任何用户(ClipMate)都会对你感到非常烦恼,并可能将你添加到破坏性地预览剪贴板数据的应用程序的“耻辱之墙”中。http://www.thornsoft.com/faq/index.php?action=artikel&cat=9&id=79

我不同意,我长期以来一直在获取剪贴板并在Excel VBA应用程序中使用它-请参见我的答案。 - MikeD
应该可以通过某种方式将剪贴板虚拟粘贴到变量/缓冲区中... :S - Aziz
1
-1 对于“一些用户”/“ClipMate”/“耻辱墙”...这与问题无关且具有误导性...以及链接可能是对未提出的问题的答案,可能更多地是广告而不是答案。 - MikeD
1
@Chris,我知道我来晚了,但我不同意一些评论者的看法,因为解决方案不应该破坏其他应用程序。我没有使用过ClipMate,但使用过其他剪贴板应用程序,这些应用程序破坏了Excel的剪贴板使用。然而,阅读您的链接后,我想知道是否完全将剪贴板内容读入适当的变量,然后使用变量手动“粘贴”数据而不是使用剪贴板,或者忽略/清除变量是否仍然被认为是破坏性的预览并导致您描述的问题? - GlennFromIowa
1
将剪贴板内容读入适当的变量中,就像 Windows 剪贴板 API 所描述的那样,实际上是一种“粘贴”操作。 - Chris Thornton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接