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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.06.2006, 17:28   #1  
Hidden is offline
Hidden
Участник
 
199 / 15 (1) ++
Регистрация: 25.03.2004
Адрес: Moscow
Удаление группы строк из Excel?
Может есть у кого нить метод для удаления группы строк из Excel для ComExcelDocument_RU.
Вызывать excelDocument.deleteRow(i) столько раз сколько нужно удалить строк не хотелось бы. Может у кого примерчик метода есть для класса ComExcelDocument_RU? Спасибо!
Старый 26.06.2006, 17:37   #2  
KMV is offline
KMV
Участник
 
201 / 25 (1) +++
Регистрация: 11.10.2002
Адрес: Москва
Добавьте метод в указанный класс

PHP код:
public void deleteRows(int _row1int _row2int _workSheet 1)
{
    
int i;
;
    for (
_row2>= _row1i--)
    {
        
this.deleteRow(i_workSheet);
    }

За это сообщение автора поблагодарили: Hidden (1).
Старый 26.06.2006, 19:08   #3  
KMV is offline
KMV
Участник
 
201 / 25 (1) +++
Регистрация: 11.10.2002
Адрес: Москва
а можно просто выделить нужный диапазн, и удалить его:

X++:
void deleteRange(MSOfficeBookMark_RU _bookMark)
{
    COM     comRange;

    comRange = this.findRange(_bookMark);
    if (comRange)
    {
        comRange.delete();
    }
}
Старый 26.06.2006, 22:00   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
(сейчас под рукой Аксапты нет, чтобы проверить - рискну по памяти! завтра по-любому уточню)
Если предположить, что rng - любой известный Вам диапазон на том листе, где Вы хотите удалить строки, то можно действовать примерно следующим образом:
X++:
COM rng;  // Range
COM wks;  // Worksheet
COM rows; // Worksheet.Rows
...........
rng = this.findRange(...); // например, так нам известен некий Range на нужном листе
...........
wks = rng.Parent(); // получили ссылку на рабочий лист
rows = wks.Rows();  // получили ссылку на все строки этого листа
COM::createFromVariant( rows.Item('101:200') ).Delete();
// т.е. удаляем одним махом строки с 101-й по 200-ю
...........
P.S. Всё правильно. Память не подвела. Привожу тестовый автономный примерчик:
X++:
static void Test_DeleteRows(Args _args)
{
    COM xlApp;
    COM wbks, wbk;
    COM wkss, wks1, wks;
    COM rows, rng;
    ;
     
    xlApp = new COM('Excel.Application');
    xlApp.Visible(true);
     
    wbks = xlApp.Workbooks();
    wbk = wbks.Add();
    wkss = wbk.Worksheets();
    wks1 = wkss.Item(1);
     
    rng = wks1.Range('F19'); // допустим так нам известен объект Range
     
    // wks добавлен для примера (можно было бы и через wks1)
    wks = rng.Parent(); // получили ссылку на рабочий лист
    rows = wks.Rows();  // получили ссылку на все строки этого листа
     
    COM::createFromObject( wks.Range('A10') ).Value2('Это строка перед удаляемыми');
    COM::createFromVariant( rows.Item('11:99') ).Formula('=ROW()');
    COM::createFromObject( wks.Range('A100') ).Value2('Это строка после удаляемых');
     
    // можно закоментировать строку ниже, чтобы убедиться в начальном существовании строк 11-99
    COM::createFromVariant( rows.Item('11:99') ).Delete();
    // т.е. удаляем одним махом строки с 11-й по 99-ю
     
}

Последний раз редактировалось Gustav; 27.06.2006 в 09:23.
За это сообщение автора поблагодарили: Hans (1).
Старый 28.06.2006, 10:19   #5  
Hidden is offline
Hidden
Участник
 
199 / 15 (1) ++
Регистрация: 25.03.2004
Адрес: Moscow
Всем спасибо! Всё получилось.
Старый 28.06.2006, 10:38   #6  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Hidden
Всё получилось.
Ну, и славно. Hidden, если не секрет, с какой целью удаляете? Мне любопытно в принципе. У меня стереотип такой, что я воспринимаю Excel как "окончательный приемник" выводимых данных. Можно, допустим, слегка подправить форматирование по окончании вывода всех данных, но сами, скажем так, "блоки информации" готовятся в Аксапте и потом выводятся "потоком" в нужные места эксельного sheet-а. А что-то вывести, чтобы потом удалять... не совсем понимаю... Или я слишком узок в своем стереотипе?



P.S.Forward
Цитата:
Сообщение от Hidden
Вывожу данные в эксель...
Спасибо. Что-то в этом роде мне и подумалось, что связано с копированием.

Последний раз редактировалось Gustav; 28.06.2006 в 14:06.
Старый 28.06.2006, 13:04   #7  
Hidden is offline
Hidden
Участник
 
199 / 15 (1) ++
Регистрация: 25.03.2004
Адрес: Moscow
Цитата:
Сообщение от Gustav
Ну, и славно. Hidden, если не секрет, с какой целью удаляете? Мне любопытно в принципе. У меня стереотип такой, что я воспринимаю Excel как "окончательный приемник" выводимых данных. Можно, допустим, слегка подправить форматирование по окончании вывода всех данных, но сами, скажем так, "блоки информации" готовятся в Аксапте и потом выводятся "потоком" в нужные места эксельного sheet-а. А что-то вывести, чтобы потом удалять... не совсем понимаю... Или я слишком узок в своем стереотипе?
Вывожу данные в эксель, в шаблоне экселя у меня три типа строк: строка данных, Итого и Всего. Когда динамически формирую, я блоки целые копирую и вставляю. Появляются лишние пустые строки, которые образовались в процессе копирования строк, которые я в процессе формирования отчета удаляю.
Старый 16.06.2010, 11:37   #8  
Pudd is offline
Pudd
Участник
 
34 / 10 (1) +
Регистрация: 31.03.2010
Я пытаюсь использовать excel.deleteRange(1,1,2,2,0);
но у меня он ошибку выдаёт (объект Com)
Метод "item" в COM-объекте класса "Sheets" возвратил код ошибки 0x8002000B (<неизвестно>), который означает: <неизвестно>.
Невозможно создать рабочую книгу Microsoft Office Excel.
не могу понять
Да удалить надо именно диапазон а не строки
какое значение может принимать Shift (послед. параметр)
З Ы
excel.RangeCopy(18,8,33,9,2,row+vlog,17,row+vlog+1);
такая штука работает выше

Последний раз редактировалось Pudd; 16.06.2010 в 11:40.
Старый 16.06.2010, 12:08   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Pudd Посмотреть сообщение
Я пытаюсь использовать excel.deleteRange(1,1,2,2,0);
но у меня он ошибку выдаёт (объект Com)
Код метода excel.deleteRange() - в студию! Тогда о чем-то можно говорить дальше. Это явно какой-то ваш самопал, ибо ни в ComExcelDocument_RU, ни в семействе SysExcel* метода с таким названием не наблюдается...

А про параметр Shift фирменного метода Range.Delete можно почитать в MSDN: http://msdn.microsoft.com/en-us/libr...ffice.12).aspx
Старый 16.06.2010, 13:25   #10  
Pudd is offline
Pudd
Участник
 
34 / 10 (1) +
Регистрация: 31.03.2010
Метод стандартный класса ComExcelDocument_RU
X++:
void deleteRange(int _firstCol, int _firstRow, int _secCol, int _secRow, int _shift, int _workSheet = activeWorkSheetIdx)
{
    MSOfficeBookMark_RU bookMark   = ComExcelDocument_RU::numToNameCell(_firstCol, _firstRow) + ':' +
                                     ComExcelDocument_RU::numToNameCell(_secCol, _secRow);
    COM                 comRange   = this.findRange(bookMark, _workSheet);
    ;
    if(comRange)
        comRange.delete(_shift);
}
P S DAX 2009
удалось заменить его на deleteCol
Старый 16.06.2010, 14:23   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ну, наверное, про Shift вам уже всё понятно из моей предыдущей ссылки на MSDN. Грубо говоря, Shift - это две первые опции из четырех на рисунке (диалог вызван правой кнопкой мыши и далее пунктом "Удалить"):

Название: RangeDelete.JPG
Просмотров: 2125

Размер: 19.6 Кб

Если выбрать четыре опции по очереди, то макрорекордер запишет такой код VBA:
Код:
    Range("B3:C7").Select
    Selection.Delete Shift:=xlToLeft
    Selection.Delete Shift:=xlUp
    Selection.EntireRow.Delete
    Selection.EntireColumn.Delete
Как следует из ссылки http://msdn.microsoft.com/en-us/libr...ffice.12).aspx Shift не может быть равен 0, а равен константам -4159 и -4162.
Старый 12.07.2010, 09:28   #12  
Pudd is offline
Pudd
Участник
 
34 / 10 (1) +
Регистрация: 31.03.2010
Вот возник опять вопрос по поводу Shift DeleteRange Какие значения туда подставлять?
-4159 и -4162 выдают ошибку

PS Dax 2009
Старый 12.07.2010, 09:56   #13  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Pudd Посмотреть сообщение
-4159 и -4162 выдают ошибку
хм... серьезная предъява Майкрософту!
но для начала, может, расскажете, что за ошибка возникает?
Старый 12.07.2010, 10:04   #14  
Pudd is offline
Pudd
Участник
 
34 / 10 (1) +
Регистрация: 31.03.2010
ну
на этой строке
excel.deleteRange(4,1,5,2,-4162);
на месте -4162 я пробывал и -4159 и без "-"
ошибка такая
Метод "item" в COM-объекте класса "Sheets" возвратил код ошибки 0x8002000B (<неизвестно>), который означает: <неизвестно>.
Старый 12.07.2010, 12:12   #15  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Запустите у себя вот такой джобик:
X++:
static void Job1(Args _args)
{
    COM     rng     = sysExcelApplication::construct().workbooks().add().worksheets().itemFromNum(1).cells().range('A1:C3').comObject();
    COM     xlApp   = rng.Application();
    Array   arr     = new Array(Types::String);
    ;

    arr.value(1, '1'); arr.value(2, '2'); arr.value(3, '3');
    rng.value2(arr);        // вставка в диапазон A1:C3 - размер 3 х 3

    rng = rng.Resize(2,2);  // переопределение диапазона в A1:B2
    rng.Delete(-4159);      // и удаление диапазона A1:B2
    
    xlApp.Visible(true);
}
Если пройдёт нормально, то константы ни при чём и значит у вас в другой "консерватории что-то не так".
Старый 12.07.2010, 18:03   #16  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Вообще-то в MSDN написано: "Shift Optional Variant" и мне кажется надо параметр Shift передавать как COMVariant.
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Теги
excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Свертка строк при выводе из Аксапты в Excel Zabr DAX: Программирование 20 21.02.2006 15:21
Автовысота строк при экспорте в excel andy239 DAX: Программирование 17 08.11.2005 16:51
Удаление отменённых строк в InventSettlement LCh DAX: Программирование 3 11.03.2004 08:04

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

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

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