Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 粘贴前检查剪贴板的内容_String_Excel_Clipboard_Vba - Fatal编程技术网

String 粘贴前检查剪贴板的内容

String 粘贴前检查剪贴板的内容,string,excel,clipboard,vba,String,Excel,Clipboard,Vba,在粘贴到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 N

在粘贴到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

请理解,在查看剪贴板内容(除了检查可用格式列表)时,无法不干扰其他应用程序。如果将数据放置在剪贴板上的应用程序正在使用延迟渲染,则您将触发无法撤消的事件(应用程序将被迫生成数据,并预期用户已粘贴数据)。这也会影响跨网络连接的剪贴板同步,例如使用远程桌面。
我的任何用户(ClipMate)都会对你非常恼火,并且可能会将你添加到破坏性地预先查看剪贴板数据的应用程序的“耻辱墙”中:

来自Excel 2003,我必须说,可以使用
MSForms.DataObject
检查剪贴板内容。首先必须创建对Microsoft Forms 2.0对象库(通常位于…\system32\FM20.DLL)的引用(VBA窗口工具/引用)

然后可以将剪贴板读入文本变量:

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%的所有需要)。

谢谢大家。。!你太棒了! 我只是想和你分享我的解决方案

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

我不同意,我得到了剪贴板并在Excel VBA应用程序中使用了很长时间-请参阅我的回答应该可以以某种方式将剪贴板虚拟粘贴到变量/缓冲区中…:S-1用于“某些用户”/“客户端”/“羞耻之墙”。。。这与问题无关,而且具有误导性。。。还有一个链接,它可能是一个非提问问题的答案,可能更多的是一个广告而不是答案。@Chris,我知道我来晚了,但我不同意一些评论,因为解决方案不应该破坏其他应用程序。我没有使用ClipMate,但使用了其他剪贴板应用程序,打破了Excel的剪贴板使用。然而,阅读您的链接时,我很好奇,如果将剪贴板内容完全读取到适当的变量中,那么1)使用该变量手动“粘贴”数据而不是使用剪贴板,或者2)忽略/清除该变量仍将被视为破坏性预览,并导致您描述的问题?就windows剪贴板API而言,“将剪贴板内容读入适当的变量”实际上是一种“粘贴”。