AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.08.2006, 15:32   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Владимир Максимов
а то я уже устал объяснять пользователям, что им надо установить птичку в настройках Excel или
Word.
За Word не скажу, а в Excel'е - если вот так попробовать? (добавил чуть-чуть от себя в первый job AndyD'а)
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);
    // --------------------------------------------------------
    
}
Старый 15.08.2006, 16:11   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Gustav
За Word не скажу, а в Excel'е - если вот так попробовать?
тогда уж проще установить соответствующие настройки безопасности с помощью групповых политик (domain group policy), чем дергать каждый раз пользователя...
Старый 16.08.2006, 00:38   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Cool Отрицательный результат - тоже результат
Пытался поиграться радикально-хацкерским сочетанием 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);
    }
    // --------------------------------------------------------
    
}
Через некоторое время еще немножко продолжу (есть некоторые мысли). Потерпите немножко?
Старый 16.08.2006, 21:36   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Thumbs up А теперь существенно положительный результат
Цитата:
Ибо любой, простите, дурак мог бы подобным образом поступить в своих злодейских целях...
Однако, как выясняется, может… И в злодейских, и в мирных!

Цитата:
Подозреваю, что, возможно, у них предусмотрена, какая-то случайная временная задержка на переключение этой галки "Доверять доступ к Visual Basic Project"
Подозреваю, что ничего такого нет, а есть просто поле ключика в Registry – AccessVBOM.


Что ж, ситуация в целом побеждена. И побеждена так, как мне хотелось – деликатно.

Под «деликатно» я в данном случае понимаю следующий алгоритм:
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();
}
Сей пост можно считать дополнением для темы Axapta программирует Excel на VBA.

Последний раз редактировалось Gustav; 21.08.2006 в 15:45.
Теги
excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Khue Trinh: Alternative Item Blog bot DAX Blogs 0 09.04.2009 16:05
Вызов класса по Menu Item Silphidae DAX: Программирование 9 13.02.2009 02:21
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:37.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.