в VBA Почему объект выбора действует по-разному при индексации? - PullRequest
0 голосов
/ 18 сентября 2018

надеюсь, вы поможете мне с этим!

Я пишу код на VBA и у меня возникают проблемы с объектом Selection, действующим не так, как я ожидаю.

Когда я пишу дляцикл как в

For Each Cell in Selection
    MsgBox Cell.Value
Next Cell

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

Вот так;

For i = 0 to 5
    MsgBox Selection(i).Value
Next i

Это дает довольно случайные значения.Любое понимание было бы здорово!

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

Спасибо всем за участие, кажется, мне нужно найти другой способ сделать следующее.У меня есть кусок кода, который берет выбранные ячейки пользователя и использует эти значения для расчетов.Прямо сейчас я пытался сделать так, чтобы они могли выбирать несмежные ячейки.По сути, мне нужно создать массив этих значений, и я подумал о том, чтобы сделать цикл for следующим образом:

For I = 0 To 5
    Array(i) = Selection(i).Value
Next I

Я не уверен, есть ли другой способ сделать это.Если у кого-то есть предложения, мне интересно!

1 Ответ

0 голосов
/ 18 сентября 2018

Как уже говорили другие, вы не должны использовать Выбор таким образом.Но чтобы ответить на ваш вопрос ... Я провел небольшое быстрое тестирование на основе вашего примера использования.

Похоже, что когда вы зацикливаете cell in Selection, оно идет слева направо, затем сверху вниз по области диапазона.Так, например, если у вас выбраны два несмежных диапазона, то if будет выглядеть примерно так:

enter image description here

Когда вы индексируете его, он не выглядитсделать прыжок между областями диапазона.вместо этого он продолжит итерацию слева направо сверху вниз в пределах границ столбцов первой области диапазона:

enter image description here

Так что, если вы спали 2 столбца, итерацияпо индексу будет просто продолжать вниз по первому столбцу, даже если он находится за пределами выделения.

Мой тестовый код:

Private Sub testing()
    Dim i As Integer
    For i = 1 To Selection.Cells.Count
        Selection(i).Value = i
    Next i
End Sub

Private Sub testing2()
    Dim c As Range
    For Each c In Selection.Cells
        c.Value = c.Column
    Next c
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...