如何:让用户粘贴另一个excel实例(Ctrl + V,...)中的单元格,但仅粘贴值

问题描述 投票:0回答:1

编辑进行中

亲爱的Stackoverflow社区,

我正在处理一个大型excel文件,该文件会为我和我的同事进行一些计算。因为计算数据很多,并且输入了范围(如“ A1:H8”),而不是单个单元格(如“ A1”,“ C1”,...),所以我希望用户能够从中复制数据与我的文件相同或另一个excel实例。

问题(已编辑):

问题是,即使粘贴单元格也会格式化目标单元格(即使它们受到保护也无法格式化),必须避免这种情况。我搜索了许多在线讨论,最后编写了自己的代码,使我可以在同一excel实例中的两个excel文件之间复制和粘贴。可悲的是,如果我从另一个实例复制了单元格,它将无法正常工作。

代码:

这是我在“ ThisWorkbook”中使用的代码:

Sub PasteValuesOnly()
'if cells are pasted in named worksheets, only values are pasted
'is linked to Ctrl+V in options of macro menu

On Error GoTo err_handler

    Dim Target As Range

    Set Target = Selection

    If Target.Parent.Name <> "Table1" Then

        Selection.PasteSpecial

    Else

        Selection.PasteSpecial Paste:=xlPasteValues

    End If

err_handler:
    Exit Sub
End Sub

系统:

  • Windows 7
  • Excel 2010

除了我的代码,我还尝试了什么(新进展):

如评论中所述,我知道Siddharth Rout's solution仅用于让用户粘贴值,但我无法使其正常工作(即使在一个Excel实例中复制和粘贴时,也不能在新文件中使用)。我在整个工作簿和一张纸上都尝试过。

会有什么帮助(编辑):

如果您能告诉我如何优化代码,这将非常有帮助,因此它也适用于两个实例。如果您在Siddharth Rout的Excel 2010解决方案中出现UndoList = Application.CommandBars(“Standard”).Controls(“&Undo”).List(1)错误时知道该怎么办,这也将有所帮助。否则,我将需要所有解决方案,让我们的用户像往常一样粘贴,但是阻止他们在粘贴时格式化单元格。

提前谢谢您

RaspiManu

excel vba
1个回答
0
投票

经过长时间的互联网搜索,我在Microsoft论坛中找到了the solution of Donna Landy (Bella_Donna)。她的代码很简单,可用于CTRL + C / CTRL + V,右键菜单上的复制和粘贴,Drag'n'Drop甚至两个Excel实例。

因为它从每个单元格更改开始,然后返回到更改的单元格或范围,所以我对其进行了稍微优化。现在,手动输入列表的用户不必每次都按两次Enter键,就可以转到下面的下一行。

假设标准用户通常会复制并粘贴,如果有一定范围的数据,他或她不想重新输入,我更改了代码,因此只有在已超过一个单元格的情况下,模块sub才会被激活已更改(请参见下文)。

解决方案:

在每个工作表中,必须加以保护以防止格式化(修改):

Private Sub Worksheet_Change(ByVal Target As Range)
'activates format protection when changing a range

    If Target.Cells.Count > 1 Then                      'If more than one cell has been changed...
        Call Worksheet_Change_Protected(Target)         '...activating protection
    End If

End Sub

在模块中(未修改):

Sub Worksheet_Change_Protected(ByVal Target As Range)

    'Prevents user blithely obliterating in-cell formatting by undoing their paste and pasting the value

    'Donna Landy 26.11.2018

    'May be freely copied - hat tip appreciated :)

    Dim SavedVal As Variant

    On Error GoTo ErrHan

    'Save the pasted value for later

    SavedVal = Target.Value

    'Switch off events to prevent infinite loop

    Application.EnableEvents = False

    'Undo the user's paste

    Application.Undo

    'Set target value

    Target.Value = SavedVal

ErrExit:

    'Remember to re-enable events

    Application.EnableEvents = True

    Exit Sub

ErrHan:

    Resume ErrExit

End Sub

非常感谢,唐娜·兰迪!

热门问题
推荐问题
最新问题