VSTO 4.0 / Office 2007
В проекте автоматизации уровня документа Excel у меня есть рабочий лист, который нельзя удалять из рабочей книги . Я боюсь, что неосторожный пользователь может удалить его случайно, что в настоящее время вызывает много горя (исключений в изобилии).
Я не могу защитить всю книгу, потому что пользователь должен иметь возможность создавать, удалять и иным образом изменять этот файл. Точно один лист должен быть защищен от удаления, но я могу что-то пропустить, поэтому, если такое решение существует, я весь слух. Например, я мог представить, что могу Protect()
и Unprotect()
книгу, когда лист виден, но это решение кажется грязным.
Googling дал следующий код VBA:
Private Sub Worksheet_Activate()
Dim CB As CommandBar
Dim Ctrl As CommandBarControl
For Each CB In Application.CommandBars
Set Ctrl = CB.FindControl(ID:=847, recursive:=True)
If Not Ctrl Is Nothing Then
Ctrl.OnAction = "RefuseToDelete"
Ctrl.State = msoButtonUp
End If
Next
End Sub
Я не знаком с VBA, но я попытался запустить его из сгенерированного VSTO метода запуска:
private void Sheet1_Startup(object sender, System.EventArgs e)
{
//Is there a neater way to iterate through all Office Collections?
for (var i = 1; i <= Application.CommandBars.Count; i++)
{
var commandBar = Application.CommandBars[i];
//847 is a magical constant that any fule no has something to do with sheet deletion
var control = commandBar.FindControl(Id: 847, Recursive: true);
if (control != null) control.OnAction = null;
}
}
Этот код, похоже, ничего не делает. Вы можете спросить «Привет, Глено, почему вы устанавливаете OnAction
в ноль» , ну, я не знаю, как его установить ... Связанное решение VBA присоединяется к событиям Активировать и Деактивировать так что есть больше кода, откуда это взялось.
Заранее спасибо.