2016-12-14 3 views
0

У меня есть защищенный лист без пароля, ячейка D6 заблокирована. Код VBA для этой ячейки не будет работать.Защищенный лист, сотовой связи заблокирован, не принимается код VBA

Я прочитал несколько сообщений здесь. Это стало решением аналогичной проблемы. Не знаете, как использовать его или куда его поместить. Как сказано, у меня нет пароля.

Worksheets("Loading").Protect Password:=****, UserInterfaceOnly:=True 

Private Sub Worksheet_Change(ByVal Target As range) 

Application.EnableEvents = False '<--| disable events handling 
On Error GoTo ErrorHandler '<--| be sure to catch any error and enable events handling back 

Select Case Target.Address 

    Case "$D$4" 
     'Recalculate Downpayment D5 if Purchase Price is changed 

     range("D5").Value = (range("D4").Value * range("B5").Value)/100 
     Debug.Print "New value for D5 Downpayment "; range("D5").Value 
     range("D6").Value = (range("D4").Value - range("D5").Value) ' This cell won't activate when locked and sheet protected 
     Debug.Print "D6 New Mortgage " & range("D6").Value 

Cells

+1

Если ваш лист защищен (независимо от того, существует ли здесь пароль, здесь нет никакой реальной разницы), и ячейка заблокирована, тогда вам нужно будет отменить защиту перед внесением любых изменений из кода, если только вы не защищены в VBA с использованием аргумента 'UserInterfaceOnly' , –

+0

Я не уверен, что правильно объяснил, что хочу. Я хочу, чтобы поле D6 заблокировалось, потому что это не поле, в которое пользователь должен вводить что-либо. Мой код vba заполняет его из других записей ячейки. Проблема в том, что как только я защищаю страницу, а затем предоставляю ее пользователю, вычисления не будут автоматически перенаправляться на D6. Он остается на уровне 0 долларов. На самом деле я не знаю, почему я должен вообще защищать листок. Спасибо. – geddeca

ответ

0

У вас есть событие изменения рабочего листа, который может изменить значение ячейки D6. Чтобы изменить значение D6, если ячейка заблокирована, то VBA сначала должен быть незащищенным. Теперь, когда вы говорите, вы хотите D6 быть всегда защищен, делают это:

Case "$D$4" 
    'unprotect sheet 
    Worksheets("Loading").Unprotect 

    'Recalculate Downpayment D5 if Purchase Price is changed 

    range("D5").Value = (range("D4").Value * range("B5").Value)/100 
    Debug.Print "New value for D5 Downpayment "; range("D5").Value 
    range("D6").Value = (range("D4").Value - range("D5").Value) 
    Debug.Print "D6 New Mortgage " & range("D6").Value 

    'protect the sheet back 
    Worksheets("Loading").Protect 

Пожалуйста, нажмите на галочку, если это ответил на ваш вопрос.

+0

Я не знаю, для меня ли то, что вы написали. Где вы размещаете этот код? в модуле? Я не уверен, что правильно объяснил, что хочу. Я хочу, чтобы поле D6 заблокировалось, потому что это не поле, в которое пользователь должен вводить что-либо. Мой код vba заполняет его из других записей ячейки. Проблема в том, что как только я защищаю страницу, а затем предоставляю ее пользователю, вычисления не будут автоматически перенаправляться на D6. Он остается на уровне 0 долларов. На самом деле я не знаю, почему я должен защищать лист. – geddeca

+0

ОК, я отредактировал ответ. УБЕДИТЕСЬ, что вы должны убедиться, что ячейка D6 заблокирована. Для этого щелкните правой кнопкой мыши на ячейке D6> «Сотовая ячейка»> «Защита» и отметьте флажок «Заблокировано». Для этого ваш лист должен быть незащищенным – Ibo

+0

Если обновляемый лист «Загрузка», вы можете использовать (например, «Me.Unprotect» вместо жесткого кодирования в имени листа. В модуле кода рабочего листа 'Me' относится к соответствующему листу. –