Другие уже дали быстрое решение - удалите ключевое слово Set
, потому что это присвоение значения, а не ссылочное.
rangeData.Row является объектом типа Integer , нет?
Нет. Давайте узнаем, как это сделать sh здесь. Нажмите F2, чтобы открыть браузер объектов; найдите класс Range
, затем его член Row
:
Range.Row
- целочисленное свойство Long
только для чтения. Так что да, это значение integer (Long
- это тип 32-разрядного целого со знаком), но не Integer
(это тип 16-разрядного целого числа со знаком), а не объект либо.
Dim startRow As Integer
Измените это объявление на As Long
, чтобы избежать ошибок overflow при назначении ему чего-либо большего, чем 2^15-1
(т. е. 32 767).
Intrinsi c типам данных присваивается то, что называется назначением «let»:
[Let] startRow = 42
Конечно, ключевое слово Let
устарело и является избыточным, вы не нужно указывать это. Но просто знайте, что он присутствует неявно, всякий раз, когда вы присваиваете значение .
Когда вы присваиваете ссылку на объект , тогда вам нужно "установить" присваивание, например у вас (правильно) здесь есть:
Set rangeData = ThisWorkbook.Names("test_range").RefersToRange
Типы данных intrinsi c ("let assignment") - это ваши Boolean
, Byte
, Currency
, Date
, Double
, Integer
, Long
, Single
, .. и, вероятно, другие, которые я забыл; Типы данных объекта («назначение присваивания»): Object
, и любой тип данных, определенный классом, например Range
, Worksheet
и Class1
.
Причина Ключевое слово Set
требуется, потому что объекты могут иметь элемент без параметров по умолчанию , который делает назначение неоднозначным в противном случае:
foo = Range("A1")
Если Set
не требуется, VBA не будет иметь пути чтобы узнать, должен ли foo
содержать ссылку Range
, или это назначение означает захват значения свойства объекта по умолчанию Range
, и присвоить это значение foo
.