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
- 从HTML复制/粘贴到MS Excel时如何处理换行符
- 根据列中的条件复制一系列行并粘贴到名为条件的其他表中
- 如果A1与带有列表的工作表中的数据匹配,将数据从一个工作表传输到多个工作表
- 根据表1中的非零值复制Sheet 1中某些行的特定单元格到Sheet 2的最后一个空行
- 从一个单元格查找值,从靠近该单元格的单元格中复制值并将其粘贴到另一个表单
- 为什么我得到运行时错误'1004'与我的VBA代码复制并从一个工作簿粘贴到另一个?
- 如何使用VBA在列中的每个单元格中比较数据,复制下一列中的单元格的值并粘贴到不同的电子表格中?
- 我怎样才能让我的代码更快运行? 将单元格从一个表格复制到另一个
- 在for-each循环中复制dynamic范围