|
30.09.2009, 16:44 | #1 |
Участник
|
Масштаб в Excel
Привет всем.
В параметрах страницы Excel есть флажок "Разместить не более чем на 1 стр. в ширину и 1 стр. в высоту". Может кто знает как его установить через код? |
|
30.09.2009, 16:50 | #2 |
Ищущий знания...
|
запишите макрос в Excel а потом получившийся код перенести в аху
З.Ы. записал у себя, предполагаю что вам интересно вот это: Цитата:
ActiveSheet.PageSetup.PrintArea = ""
With ActiveSheet.PageSetup ...... .FitToPagesWide = 1 .FitToPagesTall = 1 ..... End With
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 30.09.2009 в 16:54. |
|
30.09.2009, 16:51 | #3 |
Участник
|
запишите макрос в Excel, нужные свойства вроде FitToPagesWide и FitToPagesTall
|
|
30.09.2009, 17:21 | #4 |
Участник
|
Ок. Вот я как раз и не понимаю, как этот супермакрос будет выглядеть в Х++...
|
|
30.09.2009, 17:44 | #5 |
Moderator
|
Цитата:
X++: #define.xlDialogPageSetup(7) static void Job210_ExcelFitToPagesDemo(Args _args) { ComExcelDocument_RU excel = new ComExcelDocument_RU(); COM doc; COM app; COM worksheet; COM pageSetup; COM temp; ; excel.newFile(); doc = Excel.getComDocument(); app = doc.Application(); worksheet = app.ActiveSheet(); pageSetup = worksheet.PageSetup(); pageSetup.FitToPagesWide(2); pageSetup.FitToPagesTall(3); // это для демонстрации того, что получается temp = app.Dialogs(); temp = temp.Item(#xlDialogPageSetup); temp.Show(); } P.S. Коллеги забыли про еще один оператор VBA. Полный фрагмент на VBA должен выглядеть так: Код: With ActiveSheet.PageSetup .Zoom = False .FitToPagesWide = 2 .FitToPagesTall = 3 End With P.P.S. Нашёл пилюлю вот здесь: http://www.ozgrid.com/forum/showthread.php?t=49644 Вместо трёх операторов делаем один: X++: //// pageSetup.Zoom(false); // и так не работающий // pageSetup.FitToPagesWide(2); // pageSetup.FitToPagesTall(3); app.ExecuteExcel4Macro('PAGE.SETUP(;;;;;;;;;;;;{2;3})'); P.P.P.S. Вот как-то так вырисовывается пример в окончательном виде с учетом всех известных на данный момент особенностей региональных настроек Excel: X++: #define.xlDialogPageSetup(7) static void Job210_ExcelFitToPagesDemo(Args _args) { ComExcelDocument_RU excel = new ComExcelDocument_RU(); COM doc; COM app; COM temp; str macroFormula; str xlListSep = KKu::excelListSeparator(app); str xlColSep = KKu::excelColumnSeparator(app); str xlForLang = KKu::excelFormulaLanguage(app); int fitToPagesWide = 0; // страниц в ширину int fitToPagesTall = 10; // страниц в высоту ; excel.newFile(); doc = excel.getComDocument(); app = doc.Application(); xlListSep = KKu::excelListSeparator(app); xlColSep = KKu::excelColumnSeparator(app); xlForLang = KKu::excelFormulaLanguage(app); macroFormula = strFmt('%1(%2{%3%4%5})', xlForLang=='English'?'PAGE.SETUP':'ПАРАМЕТРЫ.СТРАНИЦЫ', strRep(xlListSep,12), fitToPagesWide ? int2str(fitToPagesWide) : (xlForLang=='English'?'#N/A':'#Н/Д'), xlColSep, fitToPagesTall ? int2str(fitToPagesTall) : (xlForLang=='English'?'#N/A':'#Н/Д')); app.ExecuteExcel4Macro(macroFormula); // для активного в данный момент листа // это для демонстрации того, что получается temp = app.Dialogs(); temp = temp.Item(#xlDialogPageSetup); temp.Show(); } Для исполнения джоба выше нужны некоторые методы из моего сборника статических методов - класса KKu (мой персональный "Global"). Вот они: X++: // определение разделителя колонок Excel - для FormulaArray static str excelColumnSeparator(COM _excelApplication = null) { #define.xlColumnSeparator(14) ; return KKu::excelSeparator(#xlColumnSeparator, _excelApplication); } // Определение языка формул Excel для свойства Range.Formula // (именно Formula, а не FormulaLocal !!!) // подробности см. здесь: // [url=http://www.axforum.info/forums/showthread.php?p=195646#post195646]Строка в Excel[/url] // СПОСОБ: // помещаем в "международное" свойство формулу на русском языке // и проверяем последующую реакцию Excel // по окончании проверки удаляем временные объекты static str excelFormulaLanguage(COM _excelApplication = null) { str ret; COM workbook; COM range; COMVariant rangeText; boolean separateSession = false; ; // если сессия не передается параметром... if (! _excelApplication) { // ...то пробуем прицепиться к существующей _excelApplication = COM::getObject('Excel.Application'); // если существующей тоже нет... if (! _excelApplication) { // то создаем отдельную - кратковременную - только лишь для определения языка _excelApplication = new COM('Excel.Application'); separateSession = true; } } workbook = _excelApplication.Workbooks(); workbook = workbook.Add(); range = _excelApplication.Range('A1'); // помещаем в "международное" свойство формулу на русском языке // и проверяем последующую реакцию Excel range.NumberFormat('0'); // на всякий случай range.Formula('=СУММ(1+1)'); range.Calculate(); // на всякий случай rangeText = range.Text(); if (rangeText.bStr()=='2') // здесь ожидаются значения: #NAME? или #ИМЯ? или 2 ret = 'Russian'; else ret = 'English'; workbook.Close(false); if (separateSession) _excelApplication.Quit(); return ret; } // определение разделителя списка Excel // нужно для диапазонов вида Range('C:C,F:F') // можно передать Excel берем параметром из контекста задачи, // чтобы не загружать отдельную сессию из-за единственного символа; // а можно и не загружать static str excelListSeparator(COM _excelApplication = null) { #define.xlListSeparator(5) ; return KKu::excelSeparator(#xlListSeparator, _excelApplication); } // Created on 04 Авг 2009 at 16:04:57 by KKU // поскольку уже нужно как минмиум два разделителя для Excel: списка и колонок, то делаем для них общее ядро static str excelSeparator(int _separator, COM _excelApplication = null) { SysExcelApplication xlApp; COMVariant sep; ; // если сессия не передается параметром... if (! _excelApplication) { // ...то пробуем прицепиться к существующей _excelApplication = COM::getObject('Excel.Application'); // если существующей тоже нет... if (! _excelApplication) { // то создаем отдельную - кратковременную - только лишь для определения разделителя xlApp = SysExcelApplication::construct(); _excelApplication = xlApp.comObject(); } } sep = _excelApplication.International(_separator); return sep.bStr(); // если была создана отдельная кратковременная, то она автоматически закроется } Последний раз редактировалось Gustav; 30.09.2009 в 19:31. |
|
30.09.2009, 19:53 | #6 |
Moderator
|
ХА-ХА-ХАААА... А вообще всё было проще!
COMVariant для Zoom!! X++: #define.xlDialogPageSetup(7) static void Job211(Args _args) { ComExcelDocument_RU excel = new ComExcelDocument_RU(); COM doc; COM app; COM worksheet; COM pageSetup; COM temp; COMVariant cv = new COMVariant(); ; excel.newFile(); doc = Excel.getComDocument(); app = doc.Application(); worksheet = app.ActiveSheet(); pageSetup = worksheet.PageSetup(); cv.boolean(false); pageSetup.Zoom(cv); pageSetup.FitToPagesWide(2); pageSetup.FitToPagesTall(3); // это для демонстрации того, что получается temp = app.Dialogs(); temp = temp.Item(#xlDialogPageSetup); temp.Show(); } Последний раз редактировалось Gustav; 30.09.2009 в 20:14. |
|
|
За это сообщение автора поблагодарили: Alenka (1), zelibobis (1), decoder (1). |
30.09.2009, 20:19 | #7 |
Moderator
|
Ну типа, ага. Между прочим, какое-то Ваше же сообщение и вспомнил на эту тему
Владимир, а не посмотрите еще одну затыку: Цитата:
P.S. Хотя я, наверное, допёр... Надо было внимательно читать собственную ссылку: Цитата:
Сообщение от Gustav
Нашёл пилюлю вот здесь: http://www.ozgrid.com/forum/showthread.php?t=49644
X++: int fitToPagesWide = 10; COMVariant cvWide = new COMVariant(); if (fitToPagesWide) cvWide.int( fitToPagesWide ); else cvWide.boolean( false ); pageSetup.FitToPagesWide(cvWide); Последний раз редактировалось Gustav; 30.09.2009 в 23:54. |
|
30.09.2009, 19:57 | #8 |
Участник
|
Цитата:
Сообщение от Gustav
А теперь попробуйте задать этот Zoom из Аксапты - оператор pageSetup.Zoom(false); вызовет ошибку... Думаем, что делать дальше...
При работе с COM-объектами параметры надо передавать/принимать не как типы данных Axapta, а как типы ComVariant. То, что ИНОГДА проскакивают значения параметров в виде типов Axapta - это исключения. Обычно это связано с параметрами, которые принимают (или могут принять) целочисленные значения. Поскольку таких параметров большинство, то создается иллюзия, что так и надо. Но, вообще-то, это не корректно. В общем, нормально работает такой код X++: COM comPageSetup;
ComVariant comVariantParm;
;
(...)
comVariantParm = COMVariant::createFromBoolean(false);
comPageSetup.Zoom(comVariantParm); |
|
|
За это сообщение автора поблагодарили: Gustav (8), decoder (1). |
Теги |
excel, масштаб, программно, com-объект |
|
|