【问题标题】:Prevent paste values in locked cells防止在锁定的单元格中粘贴值
【发布时间】:2019-08-06 00:32:58
【问题描述】:

我有一张包含一些锁定单元格和一些输入/解锁单元格的工作表。因为输入单元格已格式化,我只允许它们粘贴值(使用简单的宏来粘贴值并分配控件 CTRL V)但是,这个宏让我将值粘贴到锁定的单元格中,其中我的公式会被覆盖。

如果我进行特殊复制粘贴 (ALT E + S + V) 我是不允许的如果它影响锁定的单元格,则粘贴。我需要分配了 CTRL V 的宏来粘贴值的原因是因为我的用户不知道如何复制粘贴特殊但只知道标准 CTRL V,在没有宏的情况下会破坏格式。

关于如何将我的 CTRL V 宏限制为仅将值粘贴到未锁定单元格的任何帮助?

编辑

我用 CTRL V 启动的宏:

Sub PasteasValue() 
Selection.PasteSpecial Paste:=xlPasteValues 
End Sub

【问题讨论】:

  • 如果您的单元格被锁定并且工作表受到保护,那么任何人都不能在锁定的单元格中粘贴...
  • 通常是的,但是因为我指定了宏 PastAsValues() Selection.PasteSpecial Paste:=xlPasteValues End Sub,它允许我粘贴到锁定的单元格中。这就是我想要阻止的 - 基本上是恢复标准检查/错误消息

标签: excel vba copy-paste protected locked


【解决方案1】:

在没有看到您的代码的情况下,我们只能为您提供一个 sn-p。基本上,你可以测试它是否被锁定了

ActiveCell.Locked

如果是,这将返回一个True。用您的单元格标识替换ActiveCell

【讨论】:

  • .Locked 可以处于三种状态:True 如果范围内的所有单元格都被锁定,False 如果范围内的所有单元格都被解锁,Null 如果有范围内锁定和未锁定单元格的混合。
  • 感谢您的建议。我所拥有的: - 用户可以从任何 Excel 复制选择 - 用户可以通过按 CTRL + V 将值粘贴到仅未锁定的单元格 - 代码应检查选择范围是否仅粘贴到未锁定的单元格 - 如果选择范围影响锁定的单元格应该出现错误消息 - 如果选择范围仅影响未锁定的单元格,请复制值 我有以下宏,我使用 CTRL + V 启动: Sub PasteasValue() Selection.PasteSpecial Paste:=xlPasteValues End Sub
  • 您应该编辑您的帖子以显示该宏,以便以后查看此宏的任何人都可以在您的问题中看到它,而不是隐藏在评论中。
  • @AJD 是的,我正在考虑粘贴到单个单元格。错误的假设!
【解决方案2】:

我在这里找到了解决方案:Excel VBA code to Force Values Only Paste causes strange behavior when pasting objects

ThisWorkbook 中放置的以下代码允许正常复制粘贴并将格式重新调整为目标工作表特定格式。

    Dim UndoString As String, srce As Range
    On Error GoTo err_handler
    UndoString = Application.CommandBars("Standard").Controls("&Undo").List(1)
    If Left(UndoString, 5) <> "Paste" And UndoString <> "Auto Fill" Then
        Exit Sub
    End If
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Undo
    If UndoString = "Auto Fill" Then
        Set srce = Selection
        srce.Copy
        Target.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.SendKeys "{ESC}"
        Union(Target, srce).Select
    Else
        Target.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    End If
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub
err_handler:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

【讨论】:

  • 全局 Undo 的使用会导致后续出现问题(我刚刚使用工作中的工具解决了这个问题)。使用SendKeys 并不能保证提供您认为的结果。使用全局错误处理程序也存在问题,并且可能隐藏应在代码中解决的真正错误。
【解决方案3】:

另一种方法不是覆盖Ctrl-V,而是使用上下文菜单。

在您要控制的工作表中,放置以下事件处理程序:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim tHasLock As Boolean
    If IsNull(Target.Locked) Then    ' at least one locked cell
        tHasLock = True
    Else
        tHasLock = Target.Locked ' will only be true if the cell(s) are locked
    End If

    If tHasLock And Application.CutCopyMode <> False Then
        Cancel = True
        CommandBars("MyMenu").ShowPopup
    End If
End Sub

如果有东西被剪切或复制并且单元格被锁定,这将激活。否则你会得到正常的菜单。

在您要创建“MyMenu”的工作簿中。您只能在应用程序中执行此操作一次,并且每次启动应用程序时都必须执行此操作。您可以在 Workbook_Open 上执行此操作。

Private Sub CreateMenu()
Dim tMyMenu As CommandBar
Dim tMenuItem As CommandBarControl

    Set tMyMenu = Application.CommandBars.Add("MyMenu", msoBarPopup)
    Set tMenuItem = tMyMenu.Controls.Add(ID:=370) ' Standard Paste values menu item
    tMenuItem.Caption = "Paste &Values"

End Sub

应该发生的是,这将允许粘贴发生在锁定的单元格中。

在进一步测试中 - 这没有按预期粘贴(我将自己起草一个关于此的问题以用于其他目的,因为我为工作制作的特殊菜单确实会粘贴到锁定的单元格中!)。下面是一个替代方案。

Private Sub CreateMenu()
Dim tMyMenu As CommandBar
Dim tMenuItem As CommandBarControl

    Set tMyMenu = Application.CommandBars.Add("MyMenu", msoBarPopup)
    'Set tMenuItem = tMyMenu.Controls.Add(ID:=370) ' Standard Paste values menu item
    'tMenuItem.Caption = "Paste &Values"
    Set tMenuItem = tMyMenu.Controls.Add(msoControlButton)
    With tMenuItem
        .Caption = "Special Paste"
        .OnAction = "PasteasValue" '"MySpecialPasteMacroName"
    End With
End Sub

如果您已经创建了特殊菜单并尝试再次创建它,那么您将收到运行时错误(运行时错误“5”)。只需使用Application.CommandBars("MyMenu").Delete 就可以了。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多