2016-11-23 2 views
-1

Я пытаюсь выяснить, как применить формулу к диапазону ячеек, который определен на основе метода Range.End, описанного here.Зачем определять диапазон с помощью функции cell.address, но не только для ячейки Excel VBA?

Я избегал выбора и т. Д. Согласно How to avoid using Select in Excel VBA macros.

Я использовал код ниже ранее применительно к Range (Cells, Cells), и у меня был желаемый результат копирования неизвестного количества наборов строк в столбце B, связанных с конкретной поисковой записью для данных в столбце A .

Set CopyFrom1 = Cells(FirstRow, "B")  
Set CopyFrom2 = Cells(LastRow, "B") 

sourceBook.Sheets("Sheet1").Range(CopyFrom1, CopyFrom2).Copy _ 
    destBook.Sheets("Sheet1").Range("C6") 

Теперь набор данных скопирован в destBook, я хочу применить к нему формулу. Тем не менее, я не знаю, сколько строк это, поэтому я снова использую метод Range (Cells, Cells).

LRow = destBook.Sheets("Sheet1").Cells(Rows.Count, "C").End(xlUp).Row 
Set LRowA = Cells(LRow, "D") 
Set FRowA = Cells(6, "D") 
destBook.Sheets("Sheet1").Range(LRowA, FRowA).Formula = "=C6*2.236936" 

Это привело: Ошибка выполнения «1004»: Application или объекта определенные ошибки.

Я пробовал этот метод квалификационных ячеек Why does Range work, but not Cells?, так как код VBA работает из исходной книги, и я работаю в destBook (другая рабочая тетрадь). Тем не менее, я получаю ошибка времени выполнения '438': объект не поддерживает это свойство или метод. Я не совсем понимаю, что здесь отличается от того, чего я пытаюсь достичь.

Перед отправкой этого сообщения я нашел https://stackoverflow.com/a/30030763/7199404, что дало мне результат, в котором я нуждался. Код ниже:

destBook.Sheets("Sheet1").Range(LRowA.Address, FRowA.Address).Formula = "=C6*2.236936" 

Может кто-нибудь объяснить мне, почему это работает, а другие нет?

+3

'Cells (LRow, "D") и' Клетка (6, "D") 'неявно со ссылкой на активный лист. Следовательно, вы можете использовать их только для определения диапазона на активном листе. Если это не 'destBook.Sheets (« Sheet1 »)', тогда все идет бум. Какая часть неясна? –

+0

ОК, теперь я понимаю, как явно определить объект. Например, 'destBook.Sheets (« Sheet1 »). Ячейки (LRow,« D »)'. Почему последняя строка выше работает, хотя с '.Address'? Это то же самое или что-то другое? –

+0

После того, как вы уточнили и просмотрели [link] (http://stackoverflow.com/questions/17733541/why-does-range-work-but-not-cells), я теперь понимаю, что пытается ответить. –

ответ

0

Сохранение диапазона может сделать его более легким:

Set rngFrom = sourceBook.Sheets("Sheet1").Range("B" & FirstRow, "B" & LastRow) 
Set rngTo = destBook.Sheets("Sheet1").Range("C6").Resize(rngFrom.Rows.Count) 

rngTo.Value = rngFrom.Value 
rngTo.Offset(, 1).Formula = "=C6*2.236936" 
+0

Насколько я понимаю, этот ответ является эффективным методом написания VBA по сравнению с моим ответом, правильно? –

+0

Да, но используйте то, что проще в обслуживании. Я не думаю, что разница в скорости будет заметна. http://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/11274/always-define-and-set-references-to-all-workbooks-and-sheets#t=201611241506412220564 – Slai

0

Правильный код в этом случае

Set LRowA = destBook.Sheets("Sheet1").Cells(LRow, "D") 
Set FRowA = destBook.Sheets("Sheet1").Cells(6, "D") 

Объяснение можно найти здесь: Why does Range work, but not Cells? и далее ясность в кружке комментарий Мэта выше.