Ошибка выполнения 1004 при попытке заблокировать ячейку на листе, защищенном только UserInterface: = True - PullRequest
0 голосов
/ 03 июля 2018

Создайте новую книгу Excel и добавьте следующий код к вставленному module1.

В листе введите:

  • «Test FixDate» для ячейки A1.
  • Слияние и центр ячеек F1: H1.
  • Разблокировать ячейки F1.
  • Введите формулу в F1 = Today()

На вкладке формулы определите имя TodaysDate как $F$1:$H$1.
Переименуйте лист "Тест"

В окне Immediate введите Protect и нажмите Enter.
Затем введите FixDate и нажмите Enter.

Ошибка 1004 во время выполнения в строке:

rng.Locked = True

Обратите внимание, что значение в диапазоне TodaysDate изменяется на текст, предоставленный окном сообщения, но свойства ячейки диапазона не могут быть изменены, если рабочая таблица не защищена. Я хочу изменить цвет диапазона TodaysDate, чтобы он соответствовал цвету ячейки A1. Это изменение свойства также завершается с ошибкой во время выполнения 1004. Я исключил попытку из кода при построении примера сделать его максимально простым.

Это ошибка в Excel? или я пропустил некоторые ограничения по настройке свойств диапазона?

Вот код:

Option Explicit

Global Const gPassword As String = "password"

Sub FixDate()
    Dim rng As Range
    Dim wks As Worksheet
    Set wks = Worksheets("Test")
    wks.Activate
    Set rng = Range("TodaysDate")
    If ActiveWorkbook.FileFormat <> xlOpenXMLTemplateMacroEnabled _
       And ActiveWorkbook.FileFormat <> xlOpenXMLTemplate _
        And ActiveWorkbook.FileFormat <> xlTemplate Then
        If Not rng.Locked Then
            '   Let user change the date; today's date is default
            rng.Value = InputBox("Enter competition date (mm/dd/yy), if not today.", Range("A1"), Format(Now(), "mm/dd/yy"))
            rng.Copy
            rng.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
            Application.CutCopyMode = False
            rng.Locked = True
        End If
    End If
    Application.Goto Reference:=rng, Scroll:=False
    Set rng = Nothing
    Set wks = Nothing
End Sub

Public Sub ProtectWorkbook(Optional UnProtect As Boolean = False)
    '
    '   Workbook is protected (or optionally unprotected) in such a way as to allow code to change the data
    '   without unprotecting worksheets but human interface needs password.
    '
    Dim wks As Worksheet
    Dim wksActive As Worksheet
    Dim i As Integer
    Set wksActive = ActiveSheet
    For Each wks In Worksheets
        With wks
            If .Name = "Roster" Then
               On Error Resume Next
               .Visible = xlSheetHidden
            End If
            wks.UnProtect Password:=gPassword
            If UnProtect = False Then wks.Protect Password:=gPassword, UserInterfaceOnly:=True
        End With
    Next wks
    Set wks = Nothing
    wksActive.Activate
    Set wksActive = Nothing
End Sub

Public Sub Protect()
    ProtectWorkbook UnProtect:=False
End Sub

Public Sub UnProtect()
    ProtectWorkbook UnProtect:=True
End Sub

1 Ответ

0 голосов
/ 03 июля 2018

Удалить нарушающий код (rng.locked = true) и заменить на Selection.Locked = True Selection.Interior.ColorIndex = wks.Range (ячейки (1, 1), ячейки (1, 1)). Interior.ColorIndex

Этот код работает нормально, не снимая защиту листа. Это все еще не объясняет, почему объект Range rng терпит неудачу. Я был бы заинтересован в любом комментарии об этом.

Спасибо

...