#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))