|
07.09.2007, 21:48 | #1 |
Moderator
|
|
|
09.09.2007, 19:59 | #2 |
Moderator
|
Конечно, интересно разобраться до конца с этим SHOW.DETAIL, но находятся и другие варианты решения. Например, можно попробовать переложить на X++ следующие команды VBA:
Код: 'Скрыть детали (нажатие на "минусик") Application.CommandBars("PivotTable").Controls( 5 ).Execute 'Отобразить детали (нажатие на "плюсик") Application.CommandBars("PivotTable").Controls( 6 ).Execute Код: 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 ) Код: ? Application.CommandBars("PivotTable").Controls( 5 ).Id 464 ? Application.CommandBars("PivotTable").Controls( 6 ).Id 462 |
|
|
За это сообщение автора поблагодарили: Stainless (1). |
10.09.2007, 11:34 | #3 |
Moderator
|
Понедельник. Сваял джобик. Все три способа прекрасно работают у меня...
Предлагаю призвать заинтересованную общественность прогнать джоб на своих компах и сравнить настройки Виндов, Экселя и т.п. 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 | #4 |
Moderator
|
Короче, всё ясно. Дело в разделителе списка в региональных настройках Windows. Если он установлен как "точка с запятой", то и в SHOW.DETAIL параметры должны перечисляться через точку с запятой:
X++: xlApp.ExecuteExcel4Macro('SHOW.DETAIL(1;7;FALSE)'); //Скрыть детали |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|