Почему строка именованного диапазона в Excel не является целым числом - PullRequest
0 голосов
/ 19 февраля 2020
Sub fix_name_ranges()
    Dim rangeData As Range
    Dim startRow As Integer

    Set rangeData = ThisWorkbook.Names("test_range").RefersToRange
    Set startRow = rangeData.Row 

Последнее выражение выдает ошибку:

Compile Error

Object Required

rangeData.Row является объектом типа Integer, нет?

1 Ответ

2 голосов
/ 19 февраля 2020

Другие уже дали быстрое решение - удалите ключевое слово Set, потому что это присвоение значения, а не ссылочное.

rangeData.Row является объектом типа Integer , нет?

Нет. Давайте узнаем, как это сделать sh здесь. Нажмите F2, чтобы открыть браузер объектов; найдите класс Range, затем его член Row:

Object Browser listing the members of 'Range'

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...