16.08.2006, 00:38 | #11 |
Moderator
|
Отрицательный результат - тоже результат
Пытался поиграться радикально-хацкерским сочетанием 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); } // -------------------------------------------------------- } |
|
Теги |
excel |
|
|