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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.05.2012, 15:23   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Господа, мне наконец удалось получить это сообщение об ошибке: 0xE004002C The selected cells cannot be merged. The range partially intersects a merged cell. Воспроизвелось на OWC.Spreadsheet (и на 10, и на 11) и на Axapta 3.0. В Excel не воспроизвелось (интересно, о каком же "Excel" мы все-таки тут рассуждаем? )

Суть проблемы не в номере строки, а в количестве выполненных операций Merge на одном листе - 32766. Это максимум. Далее вылетает вышеупомянутое сообщение.

Но обо всём по порядку. Вот джоб, реабилитирующий Excel (на каждом шаге по два Merge, и общее их кол-во значительно превышает 32766 - проблем нет):
X++:
{
    COM rng   = SysExcelApplication::construct().workbooks().add().worksheets().itemFromNum(1).range('A1').comObject();
    COM wks   = rng.Parent();
    COM cells = wks.Cells();
    int i;
    ;
    COM::createFromObject(rng.Application()).Visible(true);
    for (i=1; i<=65536-1; i+=2) // только Excel 2003 был в распоряжении
    {
        rng = wks.Range(cells.Item(i,1),cells.Item(i+1,1));
        rng.Merge();
        rng.Value2(i);

        rng = wks.Range(cells.Item(i,2),cells.Item(i+1,2));
        rng.Merge();
        rng.Value2(i);
    }
}
Вот джоб для Spreadsheet, с параллельным выводом в большой Excel значений счетчика - для визуализации момента ошибки (написан на базе моего джоба отсюда: Табличный процессор)
X++:
{
    Form                form = new Form();
    Args                args = new Args();
    FormRun             formRun;
    FormActiveXControl  ss;

    COM                 worksheet;
    COM                 range;
    COM                 cells;
    int                 i;

    COM rng   = SysExcelApplication::construct().workbooks().add().worksheets().itemFromNum(1).range('A1').comObject();
    COM wks   = rng.Parent();
    COM clls  = wks.Cells();
    int                 j;
    ;

    COM::createFromObject(rng.Application()).Visible(true);

    form.addDesign('Design');
    args.object(form);

    formRun = classFactory.formRunClass(args);
    formRun.init();
    formRun.design().caption('Табличный процессор');

    ss = formRun.design().addControl(FormControlType::ActiveX, 'Spreadsheet');
    //ss.className('{0002E541-0000-0000-C000-000000000046}');     // Microsoft Office Spreadsheet 10.0
    ss.className('{0002E559-0000-0000-C000-000000000046}');   // Microsoft Office Spreadsheet 11.0

    ss.heightMode(FormHeight::ColumnHeight);
    ss.widthMode(FormWidth::ColumnWidth);

    range = ss.Range('A1');
    worksheet = range.Parent();
    cells = worksheet.Cells();
    j=0;

    //for (i=1; i<=80000-1; i+=2)
    //for (i=1; i<=32766; i++)
    for (i=1; i<=20; i++)
    {
        j++; // вывод в Excel для визуализации счетчика
        rng = COM::createFromVariant(clls.Item(j));
        rng.Value2(j);

        // вывод в Speadsheet
        //range = ss.Range(cells.Item(i,1),cells.Item(i+1,1));
        range = ss.Range(cells.Item(i,1),cells.Item(i,2));
        range.Merge();
        range.Value2(i);

        //range = ss.Range(cells.Item(i,2),cells.Item(i+1,2));
        //range = ss.Range(cells.Item(i,3),cells.Item(i,6));
        //range.Merge();
        //range.Value2(i);
    }

    formRun.run();
    formRun.wait();
}
С джобом можно поиграться самостоятельно по-всякому (я уже поигрался, поэтому он такой лохматый с комментариями). Самый простой способ убедиться в числе 32766 это сгенерировать джобом небольшое число строк, скажем 100, а затем их скопировать вручную в Spreadsheet'е ниже. После того как число Merge достигнет 32766 дальнейшее копирование будет выполнено без объединения. Можно встать на последнюю merge-ячейку и разъединить ее. В этом случае опять появляется возможность выполнить однократное копирование объединенной ячейки. Если же ее попытаться скопировать в две строки, то объединенной она останется только в первой из них.

Ограничение 32766 действует в пределах текущего рабочего листа, которых в Spreadsheet'е по умолчанию три: Sheet1, Sheet2, Sheet3.
За это сообщение автора поблагодарили: S.Kuskov (2), Cardagant (1).
Теги
excel, merge, owc, spreadsheet

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Иморт из Excel 2010. Как правильно закрыть Excel? jkspb DAX: Программирование 4 13.10.2013 00:55
проблема использования Excel через clr Batuev Artem DAX: Программирование 8 22.08.2011 18:01
Sample Design Patterns: Microsoft Dynamics AX - Remedy for slow Microsoft Excel import Blog bot DAX Blogs 0 29.05.2011 17:13
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:31.