Поведение строк и строк (x) в Excel VBA. - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь понять, как использовать свойство Rows.Count и метод Rows (x) для объектов Range:

У меня есть следующий объект диапазона:

Dim rng As Range
Set rng = Range("B66:B78")

rng.Rows.Count ---> returns 13

Итак, я Я ожидаю, что rng.Rows(15) не вернет ничего, поскольку, если я правильно понимаю, индексы строк должны равняться числу строк и поэтому не должны превышать 13 (?). Но rng.Rows(15) возвращает Range объект. Почему это так?

Редактировать:

Вот моя подпрограмма:

Sub Button2_Click()

Dim a As Range
Set a = Range("A1:C10")
Dim ginrng As Range
Set ginrng = a.Find("gin")
Debug.Print "Row " & ginrng.Row & ", B cell value = " & ginrng.Range("B" & ginrng.Row).Value
Dim b As String
b = ginrng.Address

Do
    Dim ginrngnxt As Range
    Set ginrng = a.FindNext(ginrng)
    Debug.Print "Row " & ginrng.Row & ", B cell value = " & ginrng.Range("B" & ginrng.Row).Value

Loop While b <> ginrng.Address


End Sub

Снимок экрана набора данных:

enter image description here

Снимок экрана фактического вывода из подпрограммы: enter image description here

Ожидаемый вывод из подпрограммы:

Row 2, B cell value = wafer
Row 3, B cell value = start
Row 4, B cell value = gin
Row 5, B cell value = may
Row 6, B cell value = go
Row 7, B cell value = gin
Row 9, B cell value = water
Row 10, B cell value = tonic
Row 2, B cell value = wafer

Значения ячейки B в фактический вывод не соответствует значениям ячейки B в наборе данных. Почему это?

1 Ответ

0 голосов
/ 13 апреля 2020
Range.Range
Range.Rows
Range.Columns

можно подумать о возвращении диапазона относительно начальной точки.

Например:

With Range("A2")
     Debug.Print .Range("B2").Address '<~ returns $B$3
     Debug.Print .Rows(2).Address  '<~ returns $A$3
     Debug.Print .Columns(2).Address '~ returns $B$2
End With

В ваших данных c case,

ginrng.Range("B" & ginrng.Row).Value

дает вам диапазон относительно ginrng. Если ginrng равно A2, то

ginrng.Range("B" & ginrng.Row)

эквивалентно

Range("A2").Range("B2")

, что на самом деле является ячейкой $B$3, а не $B$2.

Другими словами, удалите начальный ginrng., и теперь Range("B" & ginrng.Row).Value будет на самом деле будет находиться в столбце B и в той же строке, что и ginrng.

...