Показать сообщение отдельно
Старый 22.05.2009, 19:58   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от zZ_TOP_Zz Посмотреть сообщение
to Gustav без обид:
Абсолютно. Я ж сразу предупредил - ничего личного. Мы просто делаем тихую революцию
Цитата:
Сообщение от zZ_TOP_Zz Посмотреть сообщение
Можно было конечно рассказать о существовании вывода в Ексель через механизмы прямого обращения через COM, используя операции с текстовым буфером и вставкой всех данных за раз, но за чем.
Вот это точно незачем, потому что вопрос был не про вывод, а про конкретную операцию уже внутри Excel. А что мы там делаем и как туда попали в задачке не говорится и не спрашивается.
Цитата:
Сообщение от zZ_TOP_Zz Посмотреть сообщение
скажу честно пользовался Вашими советами
Спасибо, очень приятно
Цитата:
Сообщение от zZ_TOP_Zz Посмотреть сообщение
но для примера и начала разбора с механизмами подойдет способ предложенный ice и простенький метод копирования.
Увы, он уже сразу не совсем простенький, потому что получен превращением кода макрорекордера, который операцию копирования (выделения типа Range.Select не учитываем) раскладывает на: копирование "от имени" range и последующую вставку от имени worksheet. К слову сказать, при выполнении Вашего метода еще, наверное, останется пунктирная рамка выделения, которую надо снимать операцией типа Application.CutCopyMode(false). Т.е. еще как минимум одна строка должна появиться.

Ну вот и смотрит человек и видит, аналогично как и в других методах этого класса, что чтобы выполнить простую операцию надо эвона сколько строк понаписать. Они все правильные - иначе ж бы не работало. Но они - лишние... Вот как уже достаточно (бог с ними пока с букмарками):
X++:
void copy(MSOfficeBookMark_RU bookMark1, MSOfficeBookMark_RU bookMark2, int _workSheet = 1)
{
    Com range1,range2;

    if (m_comDocument)
    {
        range1 = this.findRange(bookMark1, _workSheet);
        range2 = this.findRange(bookMark2, _workSheet);

        range1.copy(range2);
    }
}
А я предлагаю вот как (уже без букмарков и, заметьте, отпала необходимость в параметре worksheet, потому что range сам знает, с какого он worksheet'а и из какого он workbook'а):
X++:
void copy(COM range1, COM range2)
{
    if (m_comDocument)
    {
        range1.copy(range2);
    }
}
Ну и как-то уже и метод вроде не нужен в таком элементарном виде (но об этом я написал выше).
Цитата:
Сообщение от zZ_TOP_Zz Посмотреть сообщение
Далее он сам все найдет. Мы же не сразу со знаниями рождаемся, а приобретаем их по ходу жизни.
Иех, четвертый год я на форуме, время от времени возникаю с этой темой. А все равно, как ни вопрос по Excel, так очередной ответ с методом для ComExcelDocument_RU - и c теми же букмарками, с теми же проверками, с теми же findRange... А новичков учить-то, наверное, надо сразу правильно, чтобы потом мучительно не переучиваться.
Цитата:
Сообщение от zZ_TOP_Zz Посмотреть сообщение
А вообще Вы как всегда правы в своем посте.
Спасибо еще раз и простите, что еще раз тут повыступал.
За это сообщение автора поблагодарили: zZ_TOP_Zz (1).