Запретить вставку значений в заблокированных ячейках - PullRequest
0 голосов
/ 15 марта 2019

У меня есть лист с несколькими заблокированными ячейками и несколькими входными / разблокированными ячейками.Поскольку входные ячейки отформатированы, я разрешаю им только вставлять значения (это делается с помощью простого макроса для вставки значений и назначается элемент управления CTRL V ). Однако этот макрос позволяет мне вставлять значенияв заблокированных ячейках, в которых у меня есть формулы, которые перезаписываются.

Если я делаю специальную копию вставки ( ALT E + S + V ) Мне не разрешено вставлять, если это влияет на заблокированные ячейки.Причина, по которой мне нужен макрос с назначенным CTRL V только для вставки значений, заключается в том, что мои пользователи не знают, как скопировать специальную вставку, а знают только стандартный CTRL V , который в случае без макроса уничтожает формат.

Любая помощь о том, как я могу ограничить мой CTRL V макросомвставлять только значения в разблокированные ячейки?

РЕДАКТИРОВАТЬ

Макрос, который я запускаю с помощью CTRL V :

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

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

Альтернативный подход заключается не в переброске 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, и вам будет хорошо.

0 голосов
/ 15 марта 2019

Я нашел решение здесь: Код Excel VBA для принудительной вставки только значений вызывает странное поведение при вставке объектов

Приведенный ниже код, помещенный в 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
0 голосов
/ 15 марта 2019

Не видя ваш код, все, что мы можем вам дать, это фрагмент.По сути, вы можете проверить, заблокирован ли он с помощью

ActiveCell.Locked

. Это вернет True, если это так.Замените вашу идентификацию ячейки на ActiveCell.

...