|
![]() |
#1 |
Moderator
|
Цитата:
Сообщение от Владимир Максимов
а то я уже устал объяснять пользователям, что им надо установить птичку в настройках Excel или
Word. X++: static void MVB_Excel_DocProperty_2(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; // ---------------------- #define.vbext_ct_StdModule(1) ; excel = new ComExcelDocument_RU(); excel.newFile(fileName,true); doc = excel.getComDocument(); app = doc.Application(); // added by Gustav: запрос на проверку доступа к VB-проекту // -------------------------------------------------------- vbCrLf = num2char(13) + num2char(10); alertMessage = 'Нажмите ОК и проверьте на следующем шаге включенность опции' + vbCrLf + '""Доверять доступ к Visual Basic Project"" на закладке ""Надежные издатели""'; app.ExecuteExcel4Macro('ALERT("' + alertMessage + '")'); comTemp = app.CommandBars(); comTemp = comTemp.Item('Macro'); comTemp = comTemp.Controls(); comTemp = comTemp.Item(3); comTemp.Execute(); // -------------------------------------------------------- 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); // -------------------------------------------------------- } |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от Gustav
За Word не скажу, а в Excel'е - если вот так попробовать?
|
|
![]() |
#3 |
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); } // -------------------------------------------------------- } ![]() |
|
![]() |
#4 |
Moderator
|
![]() Цитата:
Ибо любой, простите, дурак мог бы подобным образом поступить в своих злодейских целях...
Цитата:
Подозреваю, что, возможно, у них предусмотрена, какая-то случайная временная задержка на переключение этой галки "Доверять доступ к Visual Basic Project"
![]() Что ж, ситуация в целом побеждена. И побеждена так, как мне хотелось – деликатно. Под «деликатно» я в данном случае понимаю следующий алгоритм: 1. Перед нашей операцией прописывания свойств читаем текущее состояние этой опции «Доверять доступ к Visual Basic Projects», запоминаем ее в переменную, после чего принудительно включаем. 2. Открываем Excel, выполняем собственно операцию прописывания свойств в файле Excel «кодом VBA» из Аксапты, после чего закрываем Excel. 3. После закрытия Excel восстанавливаем состояние галки из переменной. Три метода основного процесса в джобе ниже соответствуют трём вышеперечисленным шагам. Добытые опытным путем нюансы: 1. Программное закрытие Excel в джобе важно - в противном случае 3-й шаг не имеет смысла, поскольку значение ключа в Regisrty будет перепрописано позже при закрытии Excel вручную, а в нём-то как раз галка и включена нами же на шаге 2. 2. До тех пор, пока все три шага были в едином джобе без деления на методы, шаг 3 также не имел эффекта. После разделения на методы всё получилось. 3. Есть мнение, что нюанс 2 зависит от того, где определена переменная COMExcelDocument_RU excel – во вложенном методе или в общем джобе. Получается, что для достижения эффекта на шаге 3, время жизни переменной excel должно быть ограничено рамками вложенного метода MVB_Excel_DocProperty (excel.finalize() в общем джобе не спасал). Впрочем, если деликатность не сильно важна, а интересует только возможность врубить опцию, то это уже пожалуйста – без всяких нюансов. Я проверял на Excel 2003 – для этой версии в имени ключа содержится подстрока «11.0». Соответственно, для Excel 2002 будет «10.0», для Excel 2000 – безразлично, так как там еще нет опции «доверять доступ». X++: static void MVB_Excel_DocProperty_4(Args _args) { #WINAPI int trustAccess; int key; container con; void Process_Registry_Before() { // запоминание состояния флажка перед стартом Excel key = WinAPI::regOpenKey(#HKEY_CURRENT_USER, @'Software\Microsoft\Office\11.0\Excel\Security', #KEY_QUERY_VALUE); if (key) { con = WinAPI::regGetValue(key, 'AccessVBOM'); WinAPI::regCloseKey(key); trustAccess = conPeek(con,1); } // включение флажка - разрешаем доступ к VBProjects key = WinApi::regOpenKey(#HKEY_CURRENT_USER, @'Software\Microsoft\Office\11.0\Excel\Security', #KEY_WRITE); if (key) { WinApi::regSetValueEx(key, 'AccessVBOM', #REG_DWORD, 1); WinApi::regCloseKey(key); } } void Process_Registry_After() { // восстановление состояния флажка до запуска Excel key = WinApi::regOpenKey(#HKEY_CURRENT_USER, @'Software\Microsoft\Office\11.0\Excel\Security', #KEY_WRITE); if (key) { WinApi::regSetValueEx(key, 'AccessVBOM', #REG_DWORD, trustAccess); WinApi::regCloseKey(key); } } void MVB_Excel_DocProperty() // самый первый вариант AndyD'а { 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; FileName newFileName = "C:\\ПримерLAST.xls"; // ---------------------- #define.vbext_ct_StdModule(1) excel = new ComExcelDocument_RU(); excel.newFile(fileName,true); doc = excel.getComDocument(); app = doc.Application(); 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); // сохраняем новый файл Excel if (WinAPI::fileExists( newFileName )) WinAPI::deleteFile( newFileName ); Workbook.SaveAs( newFileName ); // закрываем файл, выходим из Excel excel.closeDocument(); app.Quit(); // -------------------------------------------------------- } //====================================================================== // основной процесс Process_Registry_Before(); MVB_Excel_DocProperty(); Process_Registry_After(); } Последний раз редактировалось Gustav; 21.08.2006 в 15:45. |
|
Теги |
excel |
|
|