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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.09.2007, 20:03   #1  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Помогите сделать действие в Excel через COM
Господа.
Я снова к вам со странной проблемой.

В Excel есть возможность группировки данных, если кто не в курсе.
Так вот, после группировки слева от рабочего листа появляются уровни, которыми можно регулировать отображение ячеек - показывать их свернутыми, или только второй уровень, или все развернутые и тд..
Также на местах группировки слева появляются плюсики/минусики, нажав на который, сворачиваем ТОЛЬКО эту группу ячеек.

Замечание.
1. Меня интересует только группировка строк
2. Код для установки общего уровня отображения (в Эксель) такой:
X++:
    ActiveSheet.Outline.ShowLevels RowLevels:=1 ()
Вопрос:
Как отобразить или свернуть ячейки определенной группы из Axapta?
Макрос в Excel что-то ничего на это действие нажатия по плюсику не записывает
Старый 07.09.2007, 20:37   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Макрос в Excel что-то ничего на это действие нажатия по плюсику не записывает
Если сделать не "плюсиком", а по меню: Данные \ Группа и структура \ Отобразить данные, то в VBA запишется оператор примерно следующего вида (Application добавил я для наглядности):
Код:
Application.ExecuteExcel4Macro "SHOW.DETAIL(1,3,TRUE,,0)"
далее в справочнике по макрофункциям Excel 4 читаем:
Цитата:
SHOW.DETAIL
Macro Sheets Only

Expands or collapses the detail under the specified expand or collapse button.

Syntax

SHOW.DETAIL(rowcol, rowcol_num, expand, show_field)

Rowcol is a number that specifies whether to operate on rows or columns of data.

Rowcol Operates on
1 Rows
2 Columns
3 The current cell's row or column. The second argument, rowcol_num, is then ignored.


Rowcol_num is a number that specifies the row or column to expand or collapse. If you are in A1 mode, you must still give the column as a number. If rowcol_num is not a summary row or column, SHOW.DETAIL returns the #VALUE! error value and interrupts the macro.

Expand is a logical value that specifies whether to expand or collapse the detail under the row or column. If expand is TRUE, Microsoft Excel expands the detail under the row or column; if FALSE, it collapses the detail under the row or column. If expand is omitted, the detail is expanded if it is currently collapsed and collapsed if it is currently expanded.

Show_Field is a string specifying the name of the field to add to a PivotTable report, if the selection is inside a PivotTable report. The new field is added as the new innermost field. Available for only innermost row or column fields.

Related Function

SHOW.LEVELS Displays a specific number of levels of an outline
P.S. Записывается макрорекордером почему-то 5 аргументов, а не 4 как сказано в хелпе. Если после записи попробовать выполнить этот оператор ExecuteExcel4Macro "SHOW.DETAIL(1,3,TRUE,,0)", то возникнет ошибка типа "Много аргументов". Достаточно в принципе первых трех.
Старый 07.09.2007, 20:45   #3  
aidsua is offline
aidsua
AX*****
Аватар для aidsua
 
106 / 40 (2) +++
Регистрация: 28.09.2005
Адрес: 2:463/Kyiv
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Господа.
Я снова к вам со странной проблемой.

В Excel есть возможность группировки данных, если кто не в курсе.
Так вот, после группировки слева от рабочего листа появляются уровни, которыми можно регулировать отображение ячеек - показывать их свернутыми, или только второй уровень, или все развернутые и тд..
Также на местах группировки слева появляются плюсики/минусики, нажав на который, сворачиваем ТОЛЬКО эту группу ячеек.

Замечание.
1. Меня интересует только группировка строк
2. Код для установки общего уровня отображения (в Эксель) такой:
X++:
    ActiveSheet.Outline.ShowLevels RowLevels:=1 ()
Вопрос:
Как отобразить или свернуть ячейки определенной группы из Axapta?
Макрос в Excel что-то ничего на это действие нажатия по плюсику не записывает
Например,
Отобразить 4 уровень:
X++:
   Sheets(Sheets(1).Name).Select
   ActiveSheet.Outline.ShowLevels RowLevels:=4, ColumnLevels:=1
__________________
О, как беден, как груб наш русский язык! [c] А.С.Пушкин
Старый 07.09.2007, 20:55   #4  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Цитата:
Сообщение от Gustav Посмотреть сообщение
Если сделать не "плюсиком", а по меню: Данные \ Группа и структура \ Отобразить данные, то в VBA запишется оператор примерно следующего вида (Application добавил я для наглядности):
Код:
Application.ExecuteExcel4Macro "SHOW.DETAIL(1,3,TRUE,,0)"
далее в справочнике по макрофункциям Excel 4 читаем:
Похоже, что это то, что мне нужно.
А вот воспользоваться не получается из Аксапты
Пишет, что ошибка в формуле!!! Непонятно при чем здесь формула

Конкретно, следующая ошибка:

Цитата:
Метод "ExecuteExcel4Macro" в COM-объекте класса "Excel.Application" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: Ошибка в формуле.

• Для получения дополнительных сведений нажмите кнопку ''Справка''.
• Чтобы получить справку по использованию функции, выберите команду "Мастер функций" на вкладке "Формулы" (группа "Библиотека функций").
• Старайтесь не использовать вне формул знак равенства (=) и минус (-) или ставьте перед ними одинарную кавычку ( ' ).
Старый 07.09.2007, 21:00   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Смотри PS в моем посте выше.
Старый 07.09.2007, 21:02   #6  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Цитата:
Сообщение от Gustav Посмотреть сообщение
Смотри PS в моем посте выше.
лишнюю запятую, я конечно же, пробовал убирать.
+ пробовал без четвертого параметра. Ошибка та же.
Старый 07.09.2007, 21:04   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Покажи весь оператор, который получается в Аксапте?
Старый 07.09.2007, 21:06   #8  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания

X++:
m_ComApplication.ExecuteExcel4Macro("SHOW.DETAIL(1,5,TRUE)");
Старый 07.09.2007, 21:11   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
хм... может, эта конструкция хочет вернуть какое-нибудь значение? типа как здесь: Как определить конец страницы в Excel
Старый 07.09.2007, 21:21   #10  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Цитата:
Сообщение от Gustav Посмотреть сообщение
хм... может, эта конструкция хочет вернуть какое-нибудь значение? типа как здесь: Как определить конец страницы в Excel
Не хотит. Что со значением, что без.
Ошибка та же.
Еще варианты пожалуйста. Буду пробовать
Старый 07.09.2007, 21:32   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ну, чисто фантазирую на ходу мозговым штурмом :
- попробуй одинарные кавычки вместо двойных
- попробуй вместо TRUE и FALSE просто 1 и 0
- попробуй сначала строку подготовить отдельно, типа как здесь: Вызов Item() для коллекций Excel
- попробуй поставить четвертым параметром 0
Старый 07.09.2007, 21:39   #12  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Эх. Что ж такое-то?
Все попробовал, кстати, параллельно с тем, как ты это писал
Мозговой штурм похоже работает видимо

Кстати, попробовал только что запустить JOB отсюда
Вызов Item() для коллекций Excel
Та же ошибка.

У меня Офис 2007. Попробовал на 2003 - та же ошибка.
Старый 07.09.2007, 21:48   #13  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Кстати, попробовал только что запустить JOB отсюда
Вызов Item() для коллекций Excel
Та же ошибка.
хм... вот это уже интересно... это уже принципиальный момент... может, какие-нить региональные настройки Виндов мешают? Например, поиграться разделителем списка: запятая или точка с запятой. Я смогу у себя проверить только в понедельник.
Старый 09.09.2007, 19:59   #14  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Конечно, интересно разобраться до конца с этим SHOW.DETAIL, но находятся и другие варианты решения. Например, можно попробовать переложить на X++ следующие команды VBA:
Код:
'Скрыть детали (нажатие на "минусик")
Application.CommandBars("PivotTable").Controls( 5 ).Execute

'Отобразить детали (нажатие на "плюсик")
Application.CommandBars("PivotTable").Controls( 6 ).Execute
Можно еще попробовать воплотить в X++ такую универсальную процедуру на VBA:
Код:
Sub RunExcelMenu(ByVal menuID As Long)

    'в Аксапте все переменные будут типа COM
    Dim cmdBars As CommandBars
    Dim newCmdBar As CommandBar
    Dim ctrls As CommandBarControls
    Dim newCtrl As CommandBarControl
    
    Set cmdBars = Application.CommandBars
    Set newCmdBar = cmdBars.Add
    Set ctrls = newCmdBar.Controls
    Set newCtrl = ctrls.Add(1, menuID)
    
    newCtrl.Execute
    newCmdBar.Delete
    
End Sub

'Скрыть детали (нажатие на "минусик")
    RunExcelMenu( 464 )

'Отобразить детали (нажатие на "плюсик")
    RunExcelMenu( 462 )
А коды команд меню Excel можно узнать, например, в окне отладки:
Код:
? Application.CommandBars("PivotTable").Controls( 5 ).Id
 464 
? Application.CommandBars("PivotTable").Controls( 6 ).Id 
 462
Подпрограмма RunExcelMenu - адаптированная для последующего перевода на X++ версия подпрограммы RunMenu, заимствованная со стр. 418 из книги: Excel 2003 и VBA. Справочник программиста
За это сообщение автора поблагодарили: Stainless (1).
Старый 10.09.2007, 11:34   #15  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Понедельник. Сваял джобик. Все три способа прекрасно работают у меня...
Предлагаю призвать заинтересованную общественность прогнать джоб на своих компах и сравнить настройки Виндов, Экселя и т.п.
X++:
#define.xlListSeparator( 5 )
static void TestShowDetail(Args _args)
{
    COM xlApp, wbks, wbk, wkss, currSheet;
    COM rng, rows, currRows;
    int i;
    COMVariant dummy    = new COMVariant();
    COM cmdBars, cmdBar, ctrls, ctrl;

    str listSeparator;
    COMVariant varListSeparator;

    void runExcelMenu(int menuID)
    {
        cmdBars = xlApp.CommandBars();
        cmdBar = cmdBars.Add();
        ctrls = cmdBar.Controls();
        ctrl = ctrls.Add(1, menuID);

        ctrl.Execute();
        cmdBar.Delete();
    }
;
    xlApp = new COM('Excel.Application');
    xlApp.Visible(true);

    // определение разделителя списка
    varListSeparator = xlApp.International(#xlListSeparator);
    listSeparator = varListSeparator.bStr();
    info( listSeparator );

    wbks = xlApp.Workbooks();
    wbk = wbks.Add();

    wkss = wbk.WorkSheets();
    currSheet = wkss.Item(1);

    rng = currSheet.Range('A1');

    for (i=1; i<= 10; i++)
    {
        rng.Value2(i);
        rng = rng.Offset(1,0);
    }

    rows = currSheet.Rows();
    currRows = COM::createFromVariant(rows.Item('4:7'));
    currRows.Select();
    currRows.Group();
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 1")');

    // xlApp.ExecuteExcel4Macro('SHOW.DETAIL(1,7,FALSE)'); //Скрыть детали
    xlApp.ExecuteExcel4Macro(strfmt('SHOW.DETAIL(1 %1 7 %1 FALSE)', listSeparator)); //Скрыть детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 2")');

    // xlApp.ExecuteExcel4Macro('SHOW.DETAIL(1,7,TRUE)'); //Отобразить детали
    xlApp.ExecuteExcel4Macro(strfmt('SHOW.DETAIL(1 %1 7 %1 TRUE)', listSeparator));  //Отобразить детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 3")');

    cmdBars = xlApp.CommandBars();
    cmdBar = cmdBars.Item('PivotTable');
    ctrls = cmdBar.Controls();

    ctrl = ctrls.Item( 5 );
    ctrl.Execute(); //Скрыть детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 4")');

    ctrl = ctrls.Item( 6 );
    ctrl.Execute(); //Отобразить детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 5")');

    runExcelMenu( 464 ); //Скрыть детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 6")');

    runExcelMenu( 462 ); //Отобразить детали
}

Последний раз редактировалось Gustav; 10.09.2007 в 14:39. Причина: добавил определение разделителя списка
За это сообщение автора поблагодарили: kashperuk (10), aidsua (1).
Старый 10.09.2007, 11:53   #16  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Короче, всё ясно. Дело в разделителе списка в региональных настройках Windows. Если он установлен как "точка с запятой", то и в SHOW.DETAIL параметры должны перечисляться через точку с запятой:
X++:
xlApp.ExecuteExcel4Macro('SHOW.DETAIL(1;7;FALSE)'); //Скрыть детали
Это что касается использования именно SHOW.DETAIL. Если не заморачиватсья с определением текущего разделителя списка, то можно просто пойти другим путем и сделать через CommandBars (см. выше).
Старый 10.09.2007, 12:44   #17  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Спасибо. Действительно, видимо дело было в разделителях списков.
После изменения запятых на точки с запятой ошибка перестала вываливаться.

НО.
Группировка тоже не происходит так: SHOW.DETAIL(1;7;FALSE)

Через CommandBars проходит обоими вариантами.

НО.
В JOB срабатывает, а в реальном классе - не хочет.
Возможно дело в том, что я использую не Rows, а Range? Но врядли.
Еще отличие - я снял галочки про итоги в настройках шаблона. (то есть плюсик - сверху над сгруппированными строками).
Но тоже не то - попробовал запускать Job с шаблоном таким-же. Там сворачивает.

Gustav, с нетерпением жду след. идей и кода
Старый 10.09.2007, 12:49   #18  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Ага. Разобрался. Все дело с вызовом этих команд - нужно делать select() перед вызовом.

Давай думать, как сделать без выделения.
Старый 10.09.2007, 14:14   #19  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1148 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ну, если без выделения, тогда нужно использовать SHOW.DETAIL - там же есть второй параметр "номер строки/колонки". Но, как мы выяснили, для использования SHOW.DETAIL нужно точно знать ListSeparator. Оказывается, Excel предоставляет такую возможность (сам впервые сегодня к этому прикоснулся ):
Код:
? Application.International( xlListSeparator )
;

'где константа xlListSeparator = 5
А чем плохо выделить и приложить CommandBar'ом?
Старый 10.09.2007, 14:36   #20  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2061 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
А SHOW.DETAIL не работает у меня.

кстати, xlApp.ExecuteExcel4Macro('ALERT("Пауза 5")'); тоже ничего не делает.
Хотя, я так понял, должно вывестись какое-то окно с текстом этим?

Да ничем не плохо. Просто хочется, чтобы позиция не менялась у выделенной ячейки.
сделал просто при показе перемещение в требуемую ячейку фокуса.
Спасибо, еще раз, за код.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kurt Hatlevik: Sneak preview of the WMS E&E Blog bot DAX Blogs 0 20.11.2008 01:10
не получается экспорт в excel через COM Dimk DAX: Программирование 2 16.02.2007 19:37
"Functions" через COM Connector murad DAX: Программирование 4 13.04.2006 16:21
Взаимодействие с Аксаптой через COM+ banbery DAX: Программирование 21 25.06.2005 23:49
связь с 1С через COM rinugun DAX: Программирование 9 03.12.2004 11:28
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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