Пытался поиграться радикально-хацкерским сочетанием Exception + SendKeys. Не покатило. Т.е. катит, но случайным образом, через раз-два, иногда наполовину. Для использования, конечно, не рекомендуется, хотя, если бы катило устойчиво, то было бы прикольно.
С другой стороны, если бы катило, то Microsoft пришлось бы изобретать новую рогатку для борьбы с таким управлением доступа к VB Project. Ибо любой, простите, дурак мог бы подобным образом поступить в своих злодейских целях...
Подозреваю, что, возможно, у них предусмотрена, какая-то случайная временная задержка на переключение этой галки "Доверять доступ к Visual Basic Project", подразумевающая именно ручное (неторопливое) переключение. Поэтому программа, как умалишенная сбрасывающая и устанавливающая этот флажок втечение долей секунды, просто отдыхает...
На память все же выкладываю джоб-попытку как отчет о проведенном исследовании:
X++:
static void MVB_Excel_DocProperty_3(Args _args)
{
COMExcelDocument_RU excel;
FileName fileName = "C:\\Пример.xls";
COM doc;
COM app;
COM Workbook;
COM prj;
COM comp;
COM module;
COM code;
str s;
// added by Gustav
// ----------------------
COM comTemp;
str vbCrLf, alertMessage;
int langID;
str strSendKeys;
boolean useTrustAccessDefault;
#define.msoLanguageIDUI(2)
// ----------------------
#define.vbext_ct_StdModule(1)
;
excel = new ComExcelDocument_RU();
excel.newFile(fileName,true);
doc = excel.getComDocument();
app = doc.Application();
// added by Gustav: запрос на проверку доступа к VB-проекту
// --------------------------------------------------------
comTemp = app.LanguageSettings();
langID = comTemp.LanguageID(#msoLanguageIDUI); // язык интерфейса Excel
switch (langID)
{
case 1033:
strSendKeys = '%TMS%T%V~'; // английский Excel (латинские буквы в стринге)
break;
case 1049:
strSendKeys = '%ЕМБ%Н%В~'; // русский Excel (русские буквы в стринге)
break;
}
useTrustAccessDefault = true;
try
{
// если в исходном состоянии галка "Доверять доступ" выключена, то здесь возникает ошибка
comTemp = app.VBE();
}
catch (Exception::Error)
{
useTrustAccessDefault = false;
// корректируем ошибку установкой галки
app.SendKeys(strSendKeys, true);
}
// --------------------------------------------------------
Workbook = app.ActiveWorkbook();
prj = Workbook.VBProject();
comp = prj.VBComponents();
comp.add(#vbext_ct_StdModule);
module = comp.item(comp.count());
code = module.CodeModule();
s = strfmt(
"Sub SetDocumentProperties()\n" +
"\n" +
"ActiveWorkbook.BuiltinDocumentProperties(\"Author\").Value = \"%1\"\n" +
"ActiveWorkbook.BuiltinDocumentProperties(\"Creation Date\").Value = CDate(\"%2\")\n" +
"With ActiveWorkbook.CustomDocumentProperties\n" +
" .Add Name:=\"Автор\", _\n" +
" LinkToContent:=False, _\n" +
" Type:=msoPropertyTypeString, _\n" +
" Value:=\"%1\"\n" +
" .Add Name:=\"Дата создания\", _\n" +
" LinkToContent:=False, _\n" +
" Type:=msoPropertyTypeDate, _\n" +
" Value:=CDate(\"%2\")\n" +
"End With\n" +
"\n" +
"End Sub",
(select UserInfo where UserInfo.id == curuserId()).Name,
date2str(today(), 123, 2, 2, 2, 2, 4)
);
code.addFromString(s);
app.Run(strfmt("%1.SetDocumentProperties", module.name()));
// added by Gustav: удаляем VBA-модуль из рабочей книги
// --------------------------------------------------------
comTemp = module.Collection();
comTemp.Remove(module);
if (!useTrustAccessDefault)
{
// восстанавливаем исходное состояние галки "Доверять доступ" (т.е. выключенное)
app.SendKeys(strSendKeys, true);
}
// --------------------------------------------------------
}
Через некоторое время еще немножко продолжу (есть некоторые мысли). Потерпите немножко?