2013-11-16 3 views
5

Я работаю со следующим кодом: Этот код делает для примера: если я ввожу любое значение в ячейку A1, ячейка B1 отображает отметку времени.Как отключить изменения в ячейке с помощью vba?

Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
    With Target 
     If .Count > 1 Then Exit Sub 
     If Not Intersect(Range("B1:B10"), .Cells) Is Nothing Then 
      Application.EnableEvents = False 
      If IsEmpty(.Value) Then 
       .Offset(0, 1).ClearContents 
      Else 
       With .Offset(0, 1) 
        .NumberFormat = "hh:mm AM/PM" 
        .Value = Now 
       End With 
      End If 
      Application.EnableEvents = True 
     End If 
    End With 
    End Sub 

То, что я пытаюсь сделать сейчас, чтобы защитить/не редактируется от пользователя ячейки «B1: B10» когда-то отметка времени сделало макрос. Я google о том, как защитить, но мне сложно найти тот код, который я нашел. Может ли кто-нибудь помочь мне, как я создаю/вставляю этот код в свой исходный код?

Private Sub Worksheet_Change(ByVal Target As Range) 
    'set your criteria here 
    If Target.Column = 1 Then 

     'must disable events if you change the sheet as it will 
     'continually trigger the change event 
     Application.EnableEvents = False 
     Application.Undo 
     Application.EnableEvents = True 

     MsgBox "You cannot do that!" 
    End If 
    End Sub 

Или этот код:

'select the cell you want to be editable 
    Worksheets("Sheet1").Range("B2:C3").Locked = False 
    'then protect the entire sheet but still vba program can modify instead. 
    Worksheets("Sheet1").Protect UserInterfaceOnly:=True 

Благодаря Kazjaw. Вот окончательный код.

Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
    'Protect cell "B1:B10" 
    Worksheets("Sheet1").Cells.Locked = False 
    Worksheets("Sheet1").Range("B1:b10").Locked = True 
    Worksheets("Sheet1").Protect Password:="pass", UserInterfaceOnly:=Tru 

    With Target 
     If .Count > 1 Then Exit Sub 
     If Not Intersect(Range("B1:B10"), .Cells) Is Nothing Then 
      Application.EnableEvents = False 
      If IsEmpty(.Value) Then 
       .Offset(0, 1).ClearContents 
      Else 
       With .Offset(0, 1) 
        .NumberFormat = "hh:mm AM/PM" 
        .Value = Now 
       End With 
      End If 
      Application.EnableEvents = True 
     End If 
    End With 
    End Sub 

ответ

6

Если вы хотите защитить только диапазон B1: B10, то вам нужно запустить этот суб только один раз:

Sub ProtectCellsInB() 

    Worksheets("Sheet1").Cells.Locked = False 
    Worksheets("Sheet1").Range("B1:b10").Locked = True 
    Worksheets("Sheet1").Protect Password:="pass", UserInterfaceOnly:=True 

End Sub 

Я сделал modification- я добавил пароль для защиты, которые вы можете Удалить.

Если вы не уверены, как запустить его раз, то вы можете добавить весь внутренний код в конце вашего Private Sub Worksheet_Change(ByVal Target As Excel.Range)

+0

Hi KazJaw, ваше предложение прекрасно работать для того, что я хочу. Спасибо, что ответили на мой вопрос. Я скоро отправлю свой код для целей документации. – Ysanki

+0

Opps! Я почти забыл. Еще раз спасибо. – Ysanki

Смежные вопросы