|
![]() |
#1 |
Участник
|
запишите макрос в экселе того, что хотите сделать, и повторите в аксапте, при этом смотрите как находятся нужные объекты в других методах
Последний раз редактировалось ice; 22.05.2009 в 09:54. |
|
|
За это сообщение автора поблагодарили: decoder (1). |
![]() |
#2 |
int 20h
|
X++: void copy(MSOfficeBookMark_RU bookMark1, MSOfficeBookMark_RU bookMark2, int _workSheet = 1) { Com Range1,Range2; Com workSheet; if (m_comDocument) { Range1 = this.findRange(bookMark1, _workSheet); Range2 = this.findRange(bookMark2, _workSheet); range1.copy(); workSheet = this.getWorkSheet(_workSheet); workSheet.paste(range2); } }
__________________
It's just my Unhopelessnessabilityerism ![]() Trying to debug my mind ![]() |
|
|
За это сообщение автора поблагодарили: decoder (1). |
![]() |
#3 |
Moderator
|
Очередное разглагольство про Excel
Сразу оговорюсь: словеса мои нижеследующие ни в коем случае не претензии к участникам этой короткой дискуссии, если кому-то так может показаться в связи с тем, что я использую цитаты. Просто существует устоявшаяся точка зрения по вопросу, а мне опять хочется призвать вас посомневаться и призадуматься
И не пренебрегайте изучением самого Excel! Макрорекордер пишет неоптимально - и это вполне естественно! Хотя, тем не менее, огромное ему спасибо за то, что он вообще пишет. Вот здесь в очередной раз и развернусь ![]() Ребята, не ограничивайте себя подходом класса ComExcelDocument_Ru! Он использует идеологию "закладок" (bookmark’ов) вместо идеологии диапазонов (COM range) и сам себе усложняет жизнь. Ещё он предназначен для работы только с одной рабочей книгой. И вы волей-неволей должны следовать этим "традициям" при создании новых методов. Я же настоятельно рекомендую переходить от использования текстовых закладок к COM-переменным диапазонов и оперировать ими. Даже если у вас есть именованные диапазоны, сохраненные в шаблоне (т.е. не просто тривиальные "A1" или "D1:H5", а осмысленные имена типа "ВыручкаЗаМесяц"), то для них в самом начале выполнения можно создать переменные и дальше использовать их. Вы будете приятно поражены, насколько проще станет работать с объектами Excel и как взлетит ваша фантазия разработчика. Ведь для чего в числе прочего создается осмысленное имя? Для того, чтобы при модификации рабочего листа это имя правильно пересчитывало свой адрес. Так если мы ссылаемся на ячейку A1 при помощи стринга "A1", то после вставки новой (первой) строки для ссылки на ту же ячейку нам придется писать уже "A2". Если же мы позаботились заранее и присвоили ячейке A1 "осмысленное" имя - стринг "MyCell", то и перед вставкой первой строки, и после нее обращение к "MyCell" будет ссылаться на одну и ту же ячейку: на A1 до вставки, на A2 - после. Если же мы инициализируем переменную до вставки строки: COM rngMyCell = Application().Workbooks(...).Worksheets(...).Range("A1") или COM rngMyCell = Application().Workbooks(...).Worksheets(...).Range("MyCell"), то любой из этих двух вариантов будет правильно отслеживать все изменения структуры листа и всегда ссылаться на одну и ту же ячейку. Теперь чтобы обратиться к нашему диапазону, его не надо искать на просторах листа или книги при помощи findRange - надо просто брать переменную диапазона и выполнять с ней требуемое действие: скопировать или вставить или очистить, сделать шрифт жирным или заливку синим или задать формат даты и т.п. И о методе копирования "для ComExcelDocument_RU". Что, если вам придется копировать диапазон не в пределах одного листа и не между листами из одной рабочей книги, а из одной книги в другую? Всё, вы "попали". Прикиньте, хотя бы примерно, как надо будет извернуться. На самом деле, копирование любого диапазона в Excel, начиная с единичной ячейки и заканчивая несколькими целыми строками или колонками, выполняется одним простым оператором: исходныйДиапазон.Copy( диапазонВставки ); // и об этом надо почитать в хелпах и мануалах, макрорекордер так не пишет Метод, соответственно, будет с двумя параметрами: static void копирование(COM исходныйДиапазон, COM диапазонВставки). Заметьте, что метод статический, а значит он может быть помещен в любой (!) подходящий класс, а не исключительно в ComExcelDocument_RU. Обратите также внимание (и это может вызвать смятение), что ему и Excel-то не нужен! Единственное, что этот метод не будет копировать диапазоны между разными сессиями Excel (разные объекты Excel.Application). Наверное... Хотя надо проверить! Как вы поняли, предлагаемый метод с двумя параметрами будет содержать одну-единственную строку. Внимание - вопрос: нафига он тогда вообще нужен? Не проще ли, имея в распоряжении две COM-переменные диапазонов, написать эту строку кода прямо в caller-методе. Строка-то все равно одна. Зачем еще и лишний вызов? И общее соображение: если уж делать класс для работы с Excel, то методы его должны отражать не элементарные операции, которые сам Excel как COM-объект и так выполняет замечательно, а некоторые комплексные действия в одном методе: например, вставить данные из буфера + сделать жирным первую строку заголовков + включить автофильтр. А когда 9 строк кода из 10 занимаются тем, что создают COM-переменные на основании предоставленной текстовой информации (букмарков, будь они неладны), а потом последняя строка строка наконец торжественно выполняет желаемое действие... Ну, не знаю, конечно... "Кого что возбуждает!" (с) фильм "Бин" ![]() Еще о «чудесах оптимизации» кода ComExcelDocument_RU см. здесь: ComExcelDocument_RU по именнованной ячейки вывести номер ее строки. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |