Аргумент диапазона с комбинацией ячеек и другим диапазоном

#excel #vba

Вопрос:

Я написал что-то, что предназначено для определения динамического диапазона на основе стандартных данных последней строки, а также xlspecialcellslastcell для удаления любых посторонних данных. Однако, когда я пытаюсь собрать их вместе, я получаю ошибку, и я не могу понять, почему. Я проверил, и оба аргумента, которые я передаю свойству range, являются строками, поэтому я подумал, что это сработает.

 ws.Range(Cells(LastRow   1, 1).Address, ws.Range("a1").SpecialCells(xlCellTypeLastCell).Address)

 

Когда я печатаю только вторую часть аргумента диапазона выше, я получаю адрес в виде строки. Когда я печатаю первую часть приведенного выше аргумента, я также получаю адрес в виде строки. Если я выполню аналогичную настройку, но вместо использования свойства диапазона я снова использую cells.address, это работает нормально. Я чувствую, что это должно быть очевидно!

Спасибо!

Комментарии:

1. Cells(LastRow 1, 1).Address не обязательно находится на том же листе, ws что и . Измените его на ws.Cells(LastRow 1, 1).Address То, что вам также не нужно .Address в обоих, вы можете просто отдать ячейки Range .

2. Ух, как неловко! Спасибо! Как бы я узнал, что в этом была проблема? Я провел с ним некоторое тестирование, и вы абсолютно правы — если я не укажу ws ни для одного из аргументов, он работает, но дает мне странный адрес. Если я укажу один с ws и один без, это приведет к ошибке, определенной приложением или объектом.

Ответ №1:

Проблема в том, что в

 ws.Range(Cells(LastRow   1, 1).Address, ws.Range("a1").SpecialCells(xlCellTypeLastCell).Address)
 

Cells(LastRow 1, 1) и ws.Range("a1") не обязательно оба находятся на одном листе ws . Это, конечно, означает, что только они работают должным образом, но если вы попытаетесь использовать их как один диапазон, этот диапазон не может начинаться sheet 1 и заканчиваться sheet 2 . Диапазон должен быть только на одном листе.

Таким образом, вы получаете «ошибку, определенную приложением или объектом».

Если вы будете следовать одному правилу:

Никогда не используйте объекты, расположенные на листе ( Range Cells , Columns , Rows , и т.д.), Без явного указания книги и листа.

Тогда вы будете в безопасности от этих проблем.

Решение заключается в следующем

 ws.Range(ws.Cells(LastRow   1, 1), ws.Range("A1").SpecialCells(xlCellTypeLastCell))