28.07.2010, 16:27 | #1 |
Участник
|
Группировка сводной таблицы Excel
Коллеги!
Нужна ваша помощь в освоении Excel. Ситуация следующая: отчет выгружается в шаблон excel, в шаблоне настроена сводная таблица, необходимо сгруппировать столбцы по полю Дата. Группировака должна быть по Месяцам, Кварталам, Годам. Для реализации пишу такой код: X++: Array periods = new Array(Types::Enum); ... // группировка данных сводной таблицы pivotField = pivotTable.pivotFields('Дата'); dataRange = pivotField.dataRange(); range = dataRange.cells(); range = Com::createFromVariant(range.item(1)); periods.value(1, false); periods.value(2, false); periods.value(3, false); periods.value(4, false); periods.value(5, true); periods.value(6, true); periods.value(7, true); varArray = ComVariant::createFromArray(periods); range.group( ComArgument::NoValue, ComArgument::NoValue, ComArgument::NoValue, varArray); Метод "group" в COM-объекте класса "Range" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: Метод Group из класса Range завершен неверно. В описании метода group сказано, что последним параметром может быть булевский массив, который и указывает, по каким периодам будет производится группировка. Подозреваю, что надо как-то по другому передавать этот массив. Каким образом передать массив в метод? |
|
28.07.2010, 17:38 | #2 |
Moderator
|
Как-то так попробуйте оформить:
X++: { Array periods = new Array(Types::Enum); COMVariant varArray = new COMVariant(COMVariantInOut::IN_OUT, COMVariantType::VT_SAFEARRAY); ; periods.value(1, false); periods.value(2, false); periods.value(3, false); periods.value(4, false); periods.value(5, true); periods.value(6, true); periods.value(7, true); varArray.safeArray(periods, COMVariantType::VT_VARIANT); // и дальше подставляем varArray в Range.Group |
|
28.07.2010, 18:20 | #3 |
Участник
|
Не помогло, к сожалению.
Я уже пробовал через ComDispFunction сделать, тоже не помогло. Пишет что первый параметр должен быть ком-вариантом X++: groupFunc = new ComDispFunction(range, "Group", ComDispContext::Method); groupFunc.call( ComVariant::createNoValue(), ComVariant::createNoValue(), ComVariant::createNoValue(), varArray); |
|
29.07.2010, 10:17 | #4 |
Moderator
|
А что-то у меня сегодня с утра на свежую голову вроде как и получилось, правда, с VT_BOOL'ом:
X++: static void Job327_TestRangeGroup(Args _args) { Array periods = new Array(Types::Enum); COMVariant varArray = new COMVariant(COMVariantInOut::IN_OUT, COMVariantType::VT_SAFEARRAY); ComExcelDocument_RU doc = new ComExcelDocument_RU(); COM wbk, wkss, wks, rng; ; doc.newFile(@'C:\TestPivot.xls',true); // тестовый файл прилагается к сообщению wbk = doc.getComDocument(); wkss = wbk.Worksheets(); wks = wkss.Item('Лист4'); rng = wks.Range('A4'); periods.value(1, false); periods.value(2, false); periods.value(3, false); periods.value(4, false); periods.value(5, true); periods.value(6, true); periods.value(7, true); //varArray.safeArray(periods, COMVariantType::VT_VARIANT); varArray.safeArray(periods, COMVariantType::VT_BOOL); rng.Group(ComArgument::NoValue, ComArgument::NoValue, ComArgument::NoValue, varArray); } Последний раз редактировалось Gustav; 29.07.2010 в 10:21. Причина: удалил макросы из xls-файла, чтоб не пугали |
|
|
За это сообщение автора поблагодарили: Player1 (4), AlexeyVS (1). |
29.07.2010, 12:13 | #5 |
Участник
|
Gustav, гениально! Все работает! Спасибо!
Итак, ключевые моменты для того чтобы заработал код в первом сообщении: X++: Array periods = new Array(Types::Enum); [B]ComVariant varArray = new COMVariant(COMVariantInOut::IN_OUT, COMVariantType::VT_SAFEARRAY);[/B] ; //тут выводим данные... // группировка pivotField = pivotTable.pivotFields('Дата'); range = pivotField.dataRange(); range = range.cells(); range = Com::createFromVariant(range.item(1)); periods.value(1, false); periods.value(2, false); periods.value(3, false); periods.value(4, false); periods.value(5, true); periods.value(6, true); periods.value(7, true); [B]varArray.safeArray(periods, ComVariantType::VT_BOOL);[/B] range.group( ComArgument::NoValue, ComArgument::NoValue, ComArgument::NoValue, varArray); |
|
|
|