Excel VBAmacros:粘贴前检查剪贴板的内容

从各种来源的数据粘贴到Excel中,我遇到了一些严重的问题。 Excel往往会试图变得聪明,并做各种愚蠢的格式化。 我们需要数据作为文本。

问题是我们有很多的用户,而且他们中的很多人对计算机不是很有经验,所以要求他们每次使用右键点击和“select性粘贴”不是一种select。

我find了一个解决scheme,录制一个使用“粘贴特殊”和“文本”的macros,并覆盖ctrl-v来使用这个函数。 它似乎工作完美,直到我标记一个单元格,复制它,并试图粘贴它。 macros坠毁。

所以我需要的是一个函数,可以检查我是否试图粘贴一些复制的文本,然后使用这一行:

ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:= _ False 

而如果我粘贴一个标记的单元格,我想运行这一行(只粘贴值):

 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 

我不是很擅长为Excel编写VBAmacros(我希望我永远不需要),所以如果有人有几个指针,我会非常感激。

对于剪贴板访问/操作,您需要在Project-> References中添加对Microsoft Forms 2.0库的引用。 然后,您可以使用MSForms.DataObject类(其中包含)一个GetFormat方法来检查剪贴板是否具有特定types的数据。

这是使用DataObject进行剪贴板处理的一个很好的介绍。

 Sub PasteAsText() ' Assign Keyboard Shortcut: Ctrl+v Application.ScreenUpdating = False Select Case Application.CutCopyMode Case Is = False On Error Resume Next ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False Case Is = xlCopy If Not Range(GetClipboardRange).HasFormula Then Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Else ActiveSheet.Paste End If Case Is = xlCut ActiveSheet.Paste End Select Application.CutCopyMode = False Application.ScreenUpdating = True End Sub Function GetClipboardRange() As String ' Edited from http://www.ozgrid.com/forum/showthread.php?t=66773 Dim formats 'Check to make sure clipboard contains table data formats = Application.ClipboardFormats For Each fmt In formats If fmt = xlClipboardFormatCSV Then Application.ActiveSheet.Paste Link:=True 'Paste link Dim addr1, addr2 As String 'Parse formulas from selection addr1 = Application.Substitute(Selection.Cells(1, 1).Formula, "=", "") addr2 = Application.Substitute(Selection.Cells(Selection.Rows.Count, Selection.Columns.Count).Formula, "=", "") GetClipboardRange = addr1 & IIf(addr1 <> addr2, ":" & addr2, "") Exit For End If Next End Function 

你有没有考虑使目标表中的单元格等于文本? 当他们是通用的,Excel是最好的猜测你期望看到的。

另一方面,如果你真的想实现粘贴特殊…

没有“粘贴”事件,你可以捕捉 – 你抓住了每个地方,可能会发生粘贴。

例如,如果在工作簿启动时发出以下代码(Workbook_Open),则可以捕获CTRL-V按键:

 Application.OnKey "^v", "DoMyPaste" 

这将调用您的function,而不是Excel粘贴function。 把这样的东西放在一个模块中:

 Public Sub DoMyPaste() If Selection.[is marked cell] Then Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Else ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon _ := False End If End Sub 

我还没有testing过,这是一个粗略的草图。 请注意,select可能是多个单元格,因此您的“检查标记的单元格”需要以某种方式检查整个范围。

这只是冰山一angular。 如果你想要一个完整的解决scheme,你应该看看这篇文章,这是捕获所有粘贴调用的OCD版本:

 http://www.jkp-ads.com/Articles/CatchPaste.asp 

这不是最好的解决scheme,但它在技术上是有效的。 试试他们两个。

 On Error Resume Next ActiveSheet.PasteSpecial Format:=Text, Link:=False, DisplayAsIcon:=False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False