Если вам нужен такой эффект, который происходит при установке табличного курсора Excel на заголовок какого-нибудь поля сводной таблицы и последующем щелчке на кнопке "Спрятать детали" из тулбара сводной таблицы, то, наверное, вот это стоит попробовать:
Помогите сделать действие в Excel через COM
P.S. Перед выполнением команды меню (464), описанной по ссылке, нужно выделить ячейку Excel, в которой содержится заголовок (метка) сворачиваемого поля. Соответствующая команда VBA, которую надо разложить в X++, может выглядеть примерно так:
Код:
Worksheets("ВашЛист").PivotTables(1).PivotFields("ВашеСворачиваемоеПоле").LabelRange.Select
и далее вызов:
RunExcelMenu 464
P.P.S. Вот. Поженил свой джоб из блога
http://www.axforum.info/forums/blog.php?bt=210 с джобом по ссылке выше. Дитё родилось такое:
X++:
#CCADO
#define.xlExternal(2)
#define.xlRowField(1)
#define.xlColumnField(2)
static void Job233_showUserGroupInExcelPivot_2(Args _args)
{
UserGroupList userGroupList;
UserInfo userInfo;
UserGroupInfo userGroupInfo;
COM rst, flds, fld;
COM xlApp, wbk, pc, ptb, pf;
COM rng = SysExcelApplication::construct().workbooks().add().worksheets().itemFromNum(1).range('A1').comObject();
COM cmdBars, cmdBar, ctrls, ctrl;
void runExcelMenu(int menuID)
{
cmdBars = xlApp.CommandBars();
cmdBar = cmdBars.Add();
ctrls = cmdBar.Controls();
ctrl = ctrls.Add(1, menuID);
ctrl.Execute();
cmdBar.Delete();
}
;
rst = AdoRst::openRecordsetInMemory([
['UserId' , #adVarChar, 5 ],
['UserName' , #adVarChar, 40 ],
['GroupId' , #adVarChar, 10 ],
['GroupName' , #adVarChar, 40 ]]);
flds = rst.Fields();
while select userGroupList
join userInfo
where userInfo.id == userGroupList.userId
join userGroupInfo
where userGroupInfo.id == userGroupList.groupId
{
rst.AddNew();
fld = flds.Item('UserId' ); fld.Value(userGroupList.userId );
fld = flds.Item('UserName' ); fld.Value(userInfo.name );
fld = flds.Item('GroupId' ); fld.Value(userGroupList.groupId);
fld = flds.Item('GroupName'); fld.Value(userGroupInfo.name );
rst.Update();
}
wbk = rng.Parent(); wbk = wbk.Parent(); // ActiveWorkbook
pc = wbk.PivotCaches(); pc = pc.Add(#xlExternal); // PivotCache
pc.Recordset(rst);
ptb = pc.CreatePivotTable(rng); // PivotTable
pf = ptb.PivotFields('GroupId' ); pf.Orientation(#xlRowField ); pf.Position(1); pf.Subtotals(1,false);
pf = ptb.PivotFields('UserName' ); pf.Orientation(#xlRowField ); pf.Position(2); pf.Subtotals(1,false);
pf = ptb.PivotFields('UserId' ); pf.Orientation(#xlRowField ); pf.Position(3); pf.Subtotals(1,false);
pf = ptb.PivotFields('GroupName'); // PivotField
ptb.AddDataField(pf, 'Участие пользователей в группах');
pf.Orientation(#xlColumnField); pf.Position(1); pf.Subtotals(1,false);
xlApp = rng.Application();
// --- этот блок сворачивает детали
pf = ptb.PivotFields('GroupId');
rng = pf.LabelRange();
rng.Select();
runExcelMenu(464); // Hide Detail
// ---
xlApp.Visible(true);
}
Для сравнения запустите также с закомментированным оператором: // RunExcelMenu(464).