防止在锁定的单元格中粘贴值

时间:2019-03-15 00:32:18

标签: excel vba copy-paste protected locked

我有一张纸,上面有一些锁定的单元格和一些输入/未锁定的单元格。因为输入单元格是格式化的,所以我只允许它们粘贴值(使用简单的宏将其粘贴以粘贴值,并为控件分配 CTRL V )但是,这个宏让我将值粘贴到我的公式被覆盖的锁定单元格中。

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

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

编辑

我使用 CTRL V 启动的宏:

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

3 个答案:

答案 0 :(得分:0)

在没有看到您的代码的情况下,我们所能提供的只是一个片段。基本上,您可以测试它是否被锁定

'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8', 'collation' => 'utf8_general_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ],

这将返回一个ActiveCell.Locked。将您对单元格的标识替换为True

答案 1 :(得分:0)

另一种方法不是覆盖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,您就可以使用了。

答案 2 :(得分:0)

我在这里找到了解决方案: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