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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.10.2008, 18:08   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
ComExcelDocument_RU по именнованной ячейки вывести номер ее строки.
Вопрос: В Excel файле есть куча именованных ячеек.
Может кто нибудь знает как написать метод для класса ComExcelDocument_RU, чтоб по названию ячейки выдавал номер строки? к примеру назвать такой метод- CellName2RowNum

необходимо использовать для этого кода
X++:
static void Job104(Args _args)
{
ComExcelDocument_RU doc = new ComExcelDocument_RU();
  int i;
;

    doc.open("C:\\test.xls");
    doc.insertValue("test", 100);
    i=ComExcelDocument_RU::CellName2RowNum("test");
//      info(int2str(i));
    doc.insertClearRow(i);
    doc.insertValue("test", 200);
     i=ComExcelDocument_RU::CellName2RowNum("test");
  //    info(int2str(i));
    doc.visible(true);

}
Старый 09.10.2008, 18:39   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Смотрите в сторону коллекции Names у объектов Application, Workbook, Worksheet

Только, в общем случае, имя может ссылаться на несколько ячеек, так что однозначно назвать колонку или столбец не получится
__________________
Axapta v.3.0 sp5 kr2
Старый 09.10.2008, 19:08   #3  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
вот к примеру метод возращающий область, его как то можно допилить чтоб возвращал именно номер строки?
X++:
public COM getFindRange(MSOfficeBookMark_RU bookMark, int _workSheet = 1)
{
    COM comRange,
        comWorkSheet;
    COM comApplication;

    if (m_comDocument)
    {
        comWorkSheet   = this.getWorkSheet(_workSheet);
        comApplication = m_comDocument.application();
        comWorkSheet.activate();

        if (comWorkSheet && comApplication)
        {
            comRange = comApplication.range(bookMark);
        }
    }
    return comRange;
}
Старый 09.10.2008, 19:19   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Poleax Посмотреть сообщение
вот к примеру метод возращающий область, его как то можно допилить чтоб возвращал именно номер строки?
Можно:
X++:
    Counter  row;
    ;
    // ...
    if (comRange)
        row = comRange.Row();
    return row;
}
Старый 09.10.2008, 19:39   #5  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
спасибо, я как раз уже насчупал его.. comRange.Row();
все оказывается просто
Старый 09.10.2008, 19:48   #6  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
:)
Спасибо, вопрос закрыт.

по имени ячейки берем номер строки
X++:
public int getCellName_RowNum(MSOfficeBookMark_RU bookMark, int _workSheet = 1)
{
    COM comRange,
        comWorkSheet;
    COM comApplication;

    if (m_comDocument)
    {
        comWorkSheet   = this.getWorkSheet(_workSheet);
        comApplication = m_comDocument.application();
        comWorkSheet.activate();

        if (comWorkSheet && comApplication)
        {
            comRange = comApplication.range(bookMark);
        }
    }
    return comRange.Row();
}
по имени ячейки берем номер столбца
X++:
public int getCellName_ColumnNum(MSOfficeBookMark_RU bookMark, int _workSheet = 1)
{
    COM comRange,
        comWorkSheet;
    COM comApplication;

    if (m_comDocument)
    {
        comWorkSheet   = this.getWorkSheet(_workSheet);
        comApplication = m_comDocument.application();
        comWorkSheet.activate();

        if (comWorkSheet && comApplication)
        {
            comRange = comApplication.range(bookMark);
        }
    }
    return comRange.Column();
}
и джобик для теста
X++:
static void Job104(Args _args)
{
ComExcelDocument_RU doc = new ComExcelDocument_RU();
;

    doc.open("C:\\test.xls");
    doc.insertValue("test", 100);

   info('Row='+int2str(doc.getCellName_RowNum('test')) + '  Col='+ int2str(doc.getCellName_ColumnNum('test')) );

    doc.insertClearRow(2);
    doc.insertValue("test", 200);

    doc.visible(true);
}
Старый 09.10.2008, 22:01   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Если даже в самом коде явно присутствуют как минимум два ветвления, ведущие к тому, что comRange может оказаться неинициализированным, не говоря уже о том, что на листе книги Excel может отсутствовать указанная "закладка", то имеет смысл проверять перед возвратом строки/столбца, что comRange на что-то ссылается, иначе придется то и дело ловить ошибки времени выполнения "объект такой-то неинициализирован".

Последний раз редактировалось gl00mie; 09.10.2008 в 22:05.
Старый 09.10.2008, 22:43   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
О, больная тема! О, любимая мозоль!

Poleax, бросайте изучать ComExcelDocument_RU, начинайте изучать Excel!

Тогда вы будете знать, что для вставки пустой строки перед ячейкой не надо узнавать ее номер, чтобы потом скормить его методу-обертке, вставляющему i-ю строку в таблицу. Если танцевать от comRange, а не от вездесущего текстового букмарка ("test"), который на каждом шаге переводится всё в тот же comRange (который почему-то приговорен быть локальным в методах этого класса), то пустая строка перед comRange вставляется так:
Код:
comRange.EntireRow().Insert()
Это псевдокод. В реале это надо расписать, как полагается при трансляции с VBA в X++ - на двух строчках. Потом посчитайте, сколько строк лишнего кода выполнится в вашем алгоритме, перед тем как в таблице появится пустая строка.

P.S. При желании можно сократить кол-во строк до одной, если воcпользоваться последними достижениями в этой области

X++:
comEarlyBindingImitation( comRange,'EntireRow()','Insert()');
Подробности здесь: Gustav: Unsorted, или Записки DAX-дилетанта - II
Старый 10.10.2008, 12:43   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
офф-топ
Цитата:
Сообщение от Посмотреть сообщение
бросайте изучать ComExcelDocument_RU, начинайте изучать Excel
Ну, вот как раз еще один поучительный пример под горячую руку.

Это код фирменного (со слоя dis) метода из класса ComExcelDocument_RU (DAX 3.0, SP4). Я добавил несколько своих комментариев (в исходном фирменном виде метод не содержит комментариев, а также самой последней строки кода):
X++:
void copyAndInsertRange(str _bookMark, int _workSheet = 1)
{
    COM         comRange, comRange1,
                comWorkSheet;

    int         colNumber, colsNumber;
    int         rowNumber, rowsNumber;
    ;

    if (! m_comDocument)
        throw error(strFmt("@DIS6401", this.getApplicationName()));

    comRange = this.findRange(_bookMark, _workSheet);
    if (! comRange)
    {
        return;
    }

    rowNumber  = comRange.row();
    comRange1  = comRange.rows();
    rowsNumber = comRange1.count();

    // вычитаем единицу... (продолжение см. ниже)
    rowNumber  = rowNumber - 1;

    colNumber  = comRange.column();
    comRange1  = comRange.columns();
    colsNumber = comRange1.count();

/*
//  этот фрагмент кода не нужен,
//  он даже вредит, если выбрать диапазон, начинающийся со строки A

    comRange.copy();

    comRange1 = this.findRange(ComExcelDocument_RU::numToNameCell(colNumber, rowNumber), _workSheet);
    if (! comRange1)
    {
        return;
    }
    comRange1.select();

    m_comApplication.cutCopyMode(false);
*/
    comRange = comRange.entireRow();
    comRange.insert();

    // следующие арифметические упражнения - без комментариев... ррррр!
    // P.S. А впрочем все-таки скажу. 
    // Если бы в начале метода исходный comRange = this.findRange(_bookMark, _workSheet)
    // был сохранен в отдельную переменную, например, comRange0, 
    // то вместо следующего ужасающего comRange = this.findRange(... достаточно было бы простого
    // comRange = comRange0 - поскольку при вставке строк перед Range его адрес автоматически переопределяется!
    comRange = this.findRange(ComExcelDocument_RU::numToNameCell(colNumber, rowNumber + rowsNumber + 1) + ":" +
                              ComExcelDocument_RU::numToNameCell(colNumber + colsNumber - 1, rowNumber + 2*rowsNumber),
                              _workSheet);
    if (! comRange)
    {
        return;
    }

    comRange.copy();

    // ...чтобы потом вернуть эту вычтенную ранее единицу обратно (rowNumber + 1) :)
    comRange1 = this.findRange(ComExcelDocument_RU::numToNameCell(colNumber, rowNumber + 1), _workSheet);

    comRange1.select();

    comWorkSheet = this.getWorkSheet(_workSheet);
    if (comWorkSheet)
    {
        comWorkSheet.paste();
    }

//  а вот здесь этот оператор не помешает (при данном подходе)
    m_comApplication.cutCopyMode(false);
}
А это код нового метода, делающего ту же работу:
X++:
void copyAndInsertRangeNew(str _bookMark, int _workSheet = 1)
{
    COM         comRange, comRange1;

    int         rowsNumber;
    ;

    if (! m_comDocument)
        throw error(strFmt("@DIS6401", this.getApplicationName()));

    comRange = this.findRange(_bookMark, _workSheet);
    if (! comRange)
    {
        return;
    }

    rowsNumber = any2int(COM::createFromObject( comRange.Rows() ).Count());

    COM::createFromObject(comRange.EntireRow()).Insert();
    comRange1 = comRange.Offset(-rowsNumber);
    comRange.Copy(comRange1);
}
А это тот вид метода, к которому я призываю, чтобы наконец избавиться от элементов "защитного программирования" типа if (! m_comDocument) и if (! comRange) - не от всех, конечно, но от необоснованных:
X++:
void copyAndInsertRangeNew2(COM _comRange)
{
    COM         comRange1;
    int         rowsNumber;
    ;

    rowsNumber = any2int(COM::createFromObject( _comRange.Rows() ).Count());

    COM::createFromObject(_comRange.EntireRow()).Insert();
    comRange1 = _comRange.Offset(-rowsNumber);
    _comRange.Copy(comRange1);
}
Заметьте, что в таком виде метод вообще не нуждается в классе ComExcelDocument_RU и в статическом виде может быть помещен хоть в Global.

И в качестве постскриптума и для большей ясности - код VBA, который делает ту же работу, что и вышеприведенные методы X++:
Код:
 
Sub Macro1()
    Dim rng As Range
    Set rng = Worksheets(1).Range("B2:C4")
    
    rng.EntireRow.Insert
    rng.Copy rng.Offset(-rng.Rows.Count)
End Sub
За это сообщение автора поблагодарили: blokva (3), Poleax (2).
Старый 10.10.2008, 21:17   #10  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Хорошо Gustav интересный код. Обязательно пригодится и использую.
Только у меня, еще немного другой вопрос.
Как сделать чтоб передали методу параметры (str _bookMark, int _workSheet = 1)
и для _BookMark скопировать всю эту область и вставить ниже, под копируемой областью. (с полным форматированием, и если ячейка именованная пользователем, то именованную ячейку перенести вниз.) ?
А содержимое _bookMark оставить как есть.. но уже без имени ячейки.
Т.е. копируем вставляем не всю строку, а только ту область которую указали.
Старый 11.10.2008, 23:56   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Т.е., как я понял, всё происходит так же, как и в методе copyAndInsertRange, только перед "букмарком" вставляются не полные строки, а диапазон с таким же размером, как у исходного "букмарка".

На VBA это выглядит так (отличие в одной строке):
Код:
 
Sub Macro2()
    Dim rng As Range
    Set rng = Range("B2:C4")
    
    rng.Insert xlShiftDown 'где константа xlShiftDown = -4121
    rng.Copy rng.Offset(-rng.Rows.Count)
End Sub
В методе copyAndInsertRangeNew меняем соответствующую строку:
X++:
// с
COM::createFromObject(_comRange.EntireRow()).Insert();

// на
_comRange.Insert( #xlShiftDown ); // и выше добавить: #define.xlShiftDown(-4121)
Старый 13.10.2008, 19:46   #12  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Gustav Спасибо, а что за значение такое #define.xlShiftDown(-4121)?
Старый 13.10.2008, 21:21   #13  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
:)
Вопрос немного усложнился.
Объединены ячейки 3 шт. Общей ячейке задано имя 'test'.
при использовании
X++:
void copyAndInsertBlock(str _bookMark, int _workSheet = 1)
{  #define.xlShiftDown(-4121)
    COM         comRange, comRange1;
    int         rowsNumber;
    ;

    if (! m_comDocument)
        throw error(strFmt("@DIS6401", this.getApplicationName()));

    comRange = this.findRange(_bookMark, _workSheet);
    if (! comRange)
    {
        return;
    }

    rowsNumber = any2int(COM::createFromObject( comRange.Rows() ).Count());

    comRange.Insert( #xlShiftDown );  // и выше добавить: #define.xlShiftDown(-4121)
    comRange1 = comRange.Offset(-rowsNumber);
    comRange.Copy(comRange1);
}
при вставки объединенной ячейки появляется сообщение "Данная операция приведет к отмене объединения ячеек" т.е. ниже в файле Excel есть объединенные ячейки. Объединение с них снимается и в итоге данные передаваемые в именованную ячейку вставляются не в 3-ную объединенную, а самую первую. А две остальных даже не копируются вниз.

Как сделать так чтоб можно было копировать и дублировать именованную ячейку без потери объединения?
Старый 14.10.2008, 09:03   #14  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Poleax Посмотреть сообщение
а что за значение такое #define.xlShiftDown(-4121)?
ну, если хелп по Excel на своем компе совсем лениво открывать, то хотя бы здесь посмотрите: http://msdn.microsoft.com/en-us/library/bb178850.aspx

Цитата:
Сообщение от Poleax Посмотреть сообщение
при вставки объединенной ячейки появляется сообщение "Данная операция приведет к отмене объединения ячеек" т.е. ниже в файле Excel есть объединенные ячейки. Объединение с них снимается и в итоге данные передаваемые в именованную ячейку вставляются не в 3-ную объединенную, а самую первую. А две остальных даже не копируются вниз.

Как сделать так чтоб можно было копировать и дублировать именованную ячейку без потери объединения?
Самый простой вариант решения проблемы - вернуться к вставке полных строк. Еще вариант - отказаться от объединенных ячеек. В подавляющем большинстве практических случаев они могут быть безболезненно для отображения заменены центрированием по выделению (Формат \ Ячейки \ Выравнивание \ По горизонтали \ По центру выделения).

Если всё-таки хочется решать задачу именно в вашей постановке, то видится такой извратный вариант - сдвигать все оставшиеся ячейки шаблона ниже места вставки вправо (как дверь шкафа-купе), потом делать копирование, потом возвращать "дверь" обратно. Стоит ли игра таких свеч?
Старый 14.10.2008, 11:03   #15  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от Gustav Посмотреть сообщение
ну, если хелп по Excel на своем компе совсем лениво открывать, то хотя бы здесь посмотрите: http://msdn.microsoft.com/en-us/library/bb178850.aspx
хелп по такому ответ не дает, да и проще спросить. За линку респект.
Цитата:
Сообщение от Gustav
Самый простой вариант решения проблемы - вернуться к вставке полных строк. Еще вариант - отказаться от объединенных ячеек. В подавляющем большинстве практических случаев они могут быть безболезненно для отображения заменены центрированием по выделению (Формат \ Ячейки \ Выравнивание \ По горизонтали \ По центру выделения).

Если всё-таки хочется решать задачу именно в вашей постановке, то видится такой извратный вариант - сдвигать все оставшиеся ячейки шаблона ниже места вставки вправо (как дверь шкафа-купе), потом делать копирование, потом возвращать "дверь" обратно. Стоит ли игра таких свеч?
не не не .. со вставкой строки сразу отпадает.
В отчете ячейки слишком мелкие и они объединены в "по больше".
Как у именованной ячейки узнать с кем она объединена? (сколько ячеек в право и сколько вниз.) А потом после вставке основной первой именованной все остальные продублировать также и после всего их объединить?
Старый 14.10.2008, 12:10   #16  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Poleax Посмотреть сообщение
хелп по такому ответ не дает
Ну-ну! Идём в Excel в редактор кода VBA по Alt+F11, пишем в окне отладки: Range("A1").Insert
Название: p1.jpg
Просмотров: 1766

Размер: 45.5 Кб

Щелкаем мышкой в середине слова Insert и жмем F1 - появляется топик хелпа
Название: p2.jpg
Просмотров: 1740

Размер: 35.8 Кб

Читая топик, видим интересующую нас константу xlShiftDown. Копируем эту строку в окно отладки и ставим перед ней восклицательный знак (сократитель команды Print), после чего нажимаем Enter
Название: p3.jpg
Просмотров: 1698

Размер: 46.8 Кб
Цитата:
Сообщение от Poleax Посмотреть сообщение
да и проще спросить
Ну это-то конечно. Типа "пусть работает железная пила"
Цитата:
Сообщение от Poleax Посмотреть сообщение
Как у именованной ячейки узнать с кем она объединена? (сколько ячеек в право и сколько вниз.)
См. MergeArea - cвойство объекта Range. Возвращает тоже Range. Например, если объединены ячейки A1:C2, то Range("A1").MergeArea.Address вернет $A$1:$C$2. Еще есть булевское свойство MergeCells объекта Range - возвращает True, если ячейка входит в объединение.
Старый 14.10.2008, 12:26   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Еще можно воспользоваться Object Browser'ом (кнопка F2 в VBA). В разделе Globals перечислены все константы и их значения
__________________
Axapta v.3.0 sp5 kr2
Старый 14.10.2008, 12:42   #18  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цитата:
Сообщение от Poleax Посмотреть сообщение
Вопрос немного усложнился.
Объединены ячейки 3 шт. Общей ячейке задано имя 'test'.
при использовании
.....
при вставки объединенной ячейки появляется сообщение "Данная операция приведет к отмене объединения ячеек" т.е. ниже в файле Excel есть объединенные ячейки. Объединение с них снимается и в итоге данные передаваемые в именованную ячейку вставляются не в 3-ную объединенную, а самую первую. А две остальных даже не копируются вниз.

Как сделать так чтоб можно было копировать и дублировать именованную ячейку без потери объединения?
Не "...ну вы блин даете..." (с)
Это что же вы в файле перекрываете именованные объединенные диапазоны?
Очень странно это, зачем тогда объединять и именовать?
Если Вы хотите то что написали в первом посту, то Gustav Вам подсказал как это делать, если Вам требуется перекрывать объединенные дипазоны, то это совсем другая задача,
А может Вы просто опишите Вашу задачу не кусками, а целиком и Вам возможно подскажут правильное решение.
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
За это сообщение автора поблагодарили: aidsua (1).
Старый 14.10.2008, 13:06   #19  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Gustav Посмотреть сообщение
видится такой извратный вариант - сдвигать все оставшиеся ячейки шаблона ниже места вставки вправо (как дверь шкафа-купе), потом делать копирование, потом возвращать "дверь" обратно. Стоит ли игра таких свеч?
Я имел в виду следующее - см. код VBA и рисунки:
Код:
Sub Macro1()
    Range("A6:C12").Insert xlShiftToRight 'xlShiftToRight = -4161
End Sub

Sub Macro2()
    Dim rng As Range
    Set rng = Range("B3")
    
    rng.Insert xlShiftDown 'xlShiftDown = -4121
    rng.Copy rng.Offset(-rng.Rows.Count)
End Sub

Sub Macro3()
    Range("A6:C12").Delete xlShiftToLeft 'xlShiftToLeft = -4159
End Sub
Теперь картинки. Исходное состояние. Далее будем размножать красную ячейку B3.
Нажмите на изображение для увеличения
Название: pp1.jpg
Просмотров: 354
Размер:	27.2 Кб
ID:	3809

После отработки Macro1 - сдвинули "дверь" вправо:
Нажмите на изображение для увеличения
Название: pp2.jpg
Просмотров: 272
Размер:	27.2 Кб
ID:	3810

После отработки Macro2 - выполнили размножение (объединенная голубая ячейка не мешает):
Нажмите на изображение для увеличения
Название: pp3.jpg
Просмотров: 284
Размер:	27.4 Кб
ID:	3811

После отработки Macro3 - вернули "дверь" назад:
Нажмите на изображение для увеличения
Название: pp4.jpg
Просмотров: 295
Размер:	27.4 Кб
ID:	3813
За это сообщение автора поблагодарили: aidsua (1).
Старый 14.10.2008, 13:11   #20  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
blokva
Задача: в Excel файле есть ячейка с именем. ("TEST") оказывается она ре одинарная а состоит из нескольких, объединенных. Надо продублировать ячейку вниз целиком и полностью, с сохранением форматирования и объединений.
Каждый раз при дублировании ячейки вниз в нее вставляю через цикл значение.

На данный момент вставка происходит, все хорошо, кроме одного. Если ячейка состояла из нескольких то при вставке объединение теряется.

Gustav Спасибо за мастер-класс по Help(у).
Как мне в аксапте вытянуть этот диапазон Range("A1").MergeArea.Address чтоб потом по нему megre сделать.
X++:
    COM         comRange, comRange1, comR;
   comR=comRange.MergeArea();
   comR.merge(); //че то не то..
Теги
excel, документация, как правильно, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
как вывести номер строки в гриде? funnut DAX: Программирование 21 01.10.2012 16:33
Цветные строки в Grid Sergo DAX: База знаний и проекты 14 19.04.2012 10:02
При создании строки в закупке статус строки становится "Отменено" AlexUnik DAX: Функционал 4 27.09.2004 16:05
Буферные ячейки на складе - зачем? renat DAX: Функционал 16 01.04.2004 20:22
Функция "Удалить строки" Oks DAX: Функционал 1 03.07.2002 18:09

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:49.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.