Для запрета сохранения и распечатки могу предложить такой подход
X++:
static void ExcelMacroEvent(Args _args)
{
ComExcelDocument_Ru excel = new ComExcelDocument_Ru();
COM Doc;
COM app;
COM Workbook;
COM prj;
COM comp;
COM module;
COM code;
Com sheet;
int Beg;
Com VBE;
Com Wnd;
Com Wnds;
int i;
;
excel.newFile("", false);
doc = excel.getComDocument();
app = doc.Application();
Workbook = app.ActiveWorkbook();
prj = Workbook.VBProject();
VBE = prj.Vbe();
Wnd = Vbe.MainWindow();
Wnd.Visible(false);
comp = prj.VBComponents();
module = comp.item(1);
module = comp.item(1);
code = module.CodeModule();
Beg = code.CreateEventProc(ComVariant::createFromStr("BeforeSave"), ComVariant::createFromStr("Workbook"))+1;
Wnd.Visible(false);
code.InsertLines(Beg+1, "Cancel = True");
Beg = code.CreateEventProc(ComVariant::createFromStr("BeforePrint"), ComVariant::createFromStr("Workbook"))+1;
Wnd.Visible(false);
code.InsertLines(Beg+1, "Cancel = True");
sheet = app.ActiveSheet();
sheet.protect();
Wnds = Vbe.Windows();
for (i=1;i<=Wnds.count();i++)
{
Wnd = wnds.item(i);
Wnd.Close();
}
app.DisplayAlerts(false);
Wnd.Visible(false);
Workbook.Activate();
Sheet.enableSelection(-4142);
excel.visible(true);
/* app.OnKey("%{F11}");
app.SendKeys("%{F11}%TE^{TAB} {TAB}1{TAB}1~");
Wnd.Visible(false);
Workbook.Activate();
Workbook.SaveAs("c:\\Книга1.xls");*/
}
В результате сохранить или распечатать будет нельзя, но, если пользователь знает о VBA, то можно открыть проект и удалить эти строки из кода.
В закомментареной части - попытка обхода этой возможности (установка пароля на VBA). Но, к сожалению, для того, чтобы это работало надо сохранить и открыть книгу заново

(сохранение выключено из кода, да и добивались обратного)
Ну и повторюсь:
Для того, что бы этот код выполнился, необходимо включить в Excel параметр "Доверять доступ к Visual Basic Project" в форме управления безопасностью макросов (можно поискать на эту тему исследования Gustav)