Мой подход немного другой.
Я защищаю весь лист, а затем разблокирую отдельные ячейки, столбцы или строки, чтобы пользователь мог заполнить данные на этих листах. Но вы должны получить те же результаты с этим.
Код был протестирован на VS 2008.
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
var activesheet = (Excel.Worksheet)this.Application.ActiveSheet;
// keep particular cell unlocked
activesheet.get_Range("A1",missing).Locked = false;
// keep entire row unlocked
activesheet.get_Range("B2", missing).EntireRow.Locked = false;
// keep entire column unlocked
activesheet.get_Range("C1", missing).EntireColumn.Locked = false;
// keep particular range (D4 - E8) unlocked
activesheet.get_Range("D4","E8").Locked = false;
activesheet.Protect(missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing, missing, missing);
}
Когда пользователь нажимает на заблокированную ячейку, Excel выдает предупреждающее сообщение о том, что ячейка заблокирована. Это раздражает пользователя. Вы можете отключить displayalerts
.
Просто используйте
this.Application.DisplayAlerts = false;
в ThisAddIn_Startup(object sender, System.EventArgs e)
непосредственно перед объявлением var activesheet
и не забудьте снова включить его, используя
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
this.Application.DisplayAlerts = true;
}
Это позаботится о надоедливом предупреждающем сообщении.