|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от Gustav
Метод, соответственно, будет с двумя параметрами: static void копирование(COM исходныйДиапазон, COM диапазонВставки). Заметьте, что метод статический, а значит он может быть помещен в любой (!) подходящий класс, а не исключительно в ComExcelDocument_RU. Обратите также внимание (и это может вызвать смятение), что ему и Excel-то не нужен! Единственное, что этот метод не будет копировать диапазоны между разными сессиями Excel (разные объекты Excel.Application). Наверное... Хотя надо проверить!
Как вы поняли, предлагаемый метод с двумя параметрами будет содержать одну-единственную строку. Внимание - вопрос: нафига он тогда вообще нужен? Не проще ли, имея в распоряжении две COM-переменные диапазонов, написать эту строку кода прямо в caller-методе. Строка-то все равно одна. Зачем еще и лишний вызов? Да, конечно, получив ссылку на COM-объект дальше можно работать вне контекста ComExcelDocument_RU, но, разве вы будете организовывать копирование через COM-объекты? Нет, конечно. Вы будете организовывать копирование через АДРЕСА. Задача формулируется примерно так: Скопировать ячейку "A1" в ячейку "A2". Ну, или через имена. Не важно. Т.е. сама постановка задачи предполагает, что ссылок на COM-объекты нет. Есть только их адреса. А ссылки надо еще сформировать по этим адресам. Поэтому создание статического метода становится бессмысленным. Нужен "контекст". Среда ComExcelDocument_RU. Разумеется, возможна ситуация, когда Com-объект со ссылкой на копируемые ячейки был сформирован раньше, для решения каких-то других задач. Но ведь очевидно, что это частный случай, обсуловленный логикой этой самой задачи. В общем случае далеко не факт, что это произойдет. Т.е. работа с Com-объектами напрямую - это возможный вариант. Но именно как частный случай. |
|
![]() |
#2 |
Moderator
|
Что мешает в самом начале создать COM-переменные для всех необходимых в текущей процедуре "адресов"?
Я думаю, что работать с "АДРЕСАМИ" - вопрос привычки, традиции - не более. И происходит эта традиция именно от стиля записи макрорекордера. Ну, и, безусловно, от опыта ручной пользовательской работы в Excel. В Excel мы можем предложить два следующих макроса для выполнения одной и той же задачи: Код: Sub Macro1() Range("D8").Copy Range("MyCell") End Sub Sub Macro2() Dim rngD8 As Range Dim rngMyCell As Range Set rngD8 = Application.Workbooks("Книга1").Worksheets(1).Range("D8") Set rngMyCell = Application.Workbooks("Книга1").Worksheets(1).Range("MyCell") rngD8.Copy rngMyCell End Sub В Аксапту мы, к сожаление, не можем напрямую перенести эту строку кода Range("D8").Copy Range("MyCell"), но можем создать иллюзию, написав свой метод copy(from, to) и потом вызывать его: copy("D8","MyCell") - ну что ж, всё легко и просто и почти как в Excel. Снаружи! Но углубимся в реализацию этого copy. И что мы имеем? Неотвратимую необходимость создания двух COM-переменных в теле метода и в последующем выбрасывании их, извиняюсь, "на помойку" после выполнения собственно операции копирования. А если нам потребуется скопировать содержимое ячейки "D8" еще в 10 или 100 других ячеек? Ответ понятен: вызовами copy("D8",...) будет создано и тут же уничтожено 10 или 100 объектов Range("D8"). |
|
Теги |
columns, com connector, excel, колонки |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|