4

在将各种来源的数据粘贴到 Excel 中时,我遇到了一些严重的问题。Excel 倾向于尝试变得聪明,并进行各种愚蠢的格式化。我们需要文本形式的数据。

问题是我们有很多用户,而且他们中的许多人对计算机不是很熟悉,所以让他们每次都使用右键单击和“选择性粘贴”不是一种选择。

我找到了记录使用“选择性粘贴”和“文本”的宏并覆盖 ctrl-v 以使用此功能的解决方案。它似乎工作得很好,直到我标记了一个单元格,复制它并尝试粘贴它。宏崩溃了。

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

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

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

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

我在为 Excel 编写 VBA 宏方面不是很有经验(我希望我永远不必如此),所以如果有人有一些指点,我将不胜感激。

4

4 回答 4

3

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

是使用DataObject.

于 2009-07-10T11:42:30.397 回答
1
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
于 2012-12-17T12:29:58.960 回答
1

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

On Error Resume Next
ActiveSheet.PasteSpecial Format:=Text, Link:=False, DisplayAsIcon:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
于 2009-09-28T19:43:52.567 回答
0

您是否考虑过使目标工作表中的单元格等于文本?当它们是通用的时,Excel 会最好地猜测您期望看到的内容。

另一方面,如果你真的想实现选择性粘贴......

您无法捕捉到“粘贴”事件 - 您已经捕捉到可能发生粘贴的每个地方。

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

Application.OnKey "^v", "DoMyPaste"

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

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

我没有测试过这个,这更像是一个粗略的草图。请注意,选择可能不止一个单元格,因此您的“检查标记的单元格”需要以某种方式检查整个范围。

不过,这只是冰山一角。如果您想要一个完整的解决方案,您应该查看这篇文章,这是捕获所有粘贴调用的 OCD 版本:

http://www.jkp-ads.com/Articles/CatchPaste.asp
于 2009-07-10T11:42:48.417 回答