Показать сообщение отдельно
Старый 25.05.2009, 15:53   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Что мешает в самом начале создать 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
Оба прекрасно работают в контексте Excel. И программисту в данном случае практически безразлично, что использовать с точки зрения трудозатрат и визуальной ясности кода: Range("D8") и Range("MyCell") или rngB8 и rngMyCell. А вот если бы в Excel не поддерживался контекст текущих объектов (workbook, worksheet) и ему пришлось бы в каждом месте использования этих своих диапазонов писать удручающую ссылку Application.Workbooks("Книга1").Worksheets(1).Range("D8")..., то он быстро бы смекнул, что определить rngD8 в самом начале лучше со всех сторон.

В Аксапту мы, к сожаление, не можем напрямую перенести эту строку кода Range("D8").Copy Range("MyCell"), но можем создать иллюзию, написав свой метод copy(from, to) и потом вызывать его: copy("D8","MyCell") - ну что ж, всё легко и просто и почти как в Excel. Снаружи! Но углубимся в реализацию этого copy. И что мы имеем? Неотвратимую необходимость создания двух COM-переменных в теле метода и в последующем выбрасывании их, извиняюсь, "на помойку" после выполнения собственно операции копирования. А если нам потребуется скопировать содержимое ячейки "D8" еще в 10 или 100 других ячеек? Ответ понятен: вызовами copy("D8",...) будет создано и тут же уничтожено 10 или 100 объектов Range("D8").