2016-09-06 4 views
3

Я искал везде, но не смог выяснить, почему переменная диапазона может ссылаться на ячейки за пределами заданного диапазона.Excel 2007 VBA Диапазон Переменные Ссылки Ячейки вне назначенного диапазона

Например, если я пишу код ниже:

Dim Rate as Range 
Set Rate = Range("A1:A5") 

For Each Cell In Rate 
     Debug.Print Cell.Value 
Next Cell 

Range("H6").Value = Rate(6).Value 
Range("H7").Value = Rate(7).Value 

выше процедура будет печатать только из 5 значений в «А1: А5» - НО последние 2 заявления вызывают значения в «A6 »и« A7 »для сохранения в« H6 »и« H7 ».

Поскольку переменная «Rate» присвоена только «A1: A5», почему она может ссылаться на другие ячейки в столбце A (то есть «A6» & «A7»)?

Я что-то не так? Любое понимание было бы высоко оценено!

+0

Благодаря Slai. Но можете ли вы выяснить, как получить сообщение об ошибке? Я не уверен, что вы имели в виду под «= Rate.Value2 (7)». – Dionysus17

ответ

1

Ничего страшного, это просто, как это работает. Мне лично нравится эта «функция».
Если вы скорее получите сообщение об ошибке, то вы можете использовать что-то вроде

Range("H6").Value = Rate.Value2(6, 1) ' .Value2 because .Value(6, 1) 

потому что Rate.Value2 даст вариантный массив 5 на 1. Или использовать .Value массив вместо Range:

Dim Rate ' as Variant 
Rate = Range("A1:A5").Value ' Variant/Variant(1 To 5, 1 To 1) 

Debug.Print Rate(5, 1) ' ok 
Debug.Print Rate(6, 1) ' Run-time error '9': Subscript out of range 

или

Dim Rate as Variant 
Rate = Application.Transpose(Range("A1:A5")) ' Variant/Variant(1 To 5) 

Debug.Print Rate(5) ' ok 
Debug.Print Rate(6) ' Run-time error '9': Subscript out of range 

В вашем случае Rate(6) коротка для Rate.Cells(6, 1), который похож на .Offset. Например:

Debug.Print Range("C3:D4")(1, 1).Address ' prints "$C$3" 
Debug.Print Range("C3:D4")(-1, -1).Address ' prints "$A$1" 

Единственный способ, которым я могу думать о получении ошибки с Range является использование вместо Areas:

Dim Rate As Areas 
Set Rate = Range("a1,a2,a3,a4,a5").Areas 

Debug.Print Rate(5) ' ok 
Debug.Print Rate(6) ' Run-time error '9': Subscript out of range 
+0

Пара проблем с вашим кодом: во-первых, это должно быть «Следующее значение» не «Следующая ячейка»; во-вторых, любое значение 'n', которое вы переходите на' Rate (n) ', будет терпеть неудачу, так как' Rate' всегда будет ** 2D ** массивом. – Rory

+0

спасибо @Rory Я был неаккуратно, как обычно – Slai

+0

@Slai Очень полезно знать, как переменная Variant отличается от переменной Range в этом отношении. Итак, есть ли способ заставить переменную Range генерировать ошибку, если вне заданного диапазона (аналогично переменной Variant)? – Dionysus17

Смежные вопросы