Как переменная ссылается на ту же переменную в VBA? - PullRequest
1 голос
/ 24 апреля 2019

Всего начинающих здесь. Мне трудно понять следующий код или любой код, который работает с той же переменной.

Например:

Private Sub CommandButton1_Click()

Dim i As Long

For i = 1 To 3
i = i + 1
Next i

MsgBox (i)

End Sub

Почему это возвращает 5?

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

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

Вот что происходит:

По мере выполнения цикла Next i добавляет единицу к значению i (даже если вы уже добавили один ...) - если значение i находится за пределами For, тогда цикл завершается.

Итак:

Итерация 1: i входит в цикл как 1, увеличивается до 2, затем снова до 3 на Next i

Итерация 2: i входит в цикл как 3, увеличивается до 4, затем снова до 5 на Next i

5 находится за пределами 1-3, поэтому i заканчивается как 5

0 голосов
/ 24 апреля 2019

Вот ваш цикл For, переписанный с использованием цикла While:

i = 1
While i >= 1 And i <= 3
    i = i + 1
    i = i + 1
End While

Обратите внимание, что Next i напрямую переводится как i = i + 1 - так что теперь для каждой итерации цикла выэффективно выполняют i = i + 2.

Поскольку i равняется 1 в начале, это соответствует условию цикла, поэтому мы добавляем 2 к i.Он по-прежнему соответствует условию цикла, поэтому мы выполняем цикл снова, добавляя еще один 2.

. Это означает, что i равно 1 + 2 + 2 или 5.

0 голосов
/ 24 апреля 2019

Сказать i = i + 1 имеет тот же эффект, что и Next i.В основном вы добавляете 1 к i в операторе for и еще раз, когда увеличиваете его.

For i = 1 to 3 'starts with i = 1
    i = i + 1 'adds 1 to i, i = 2 in the first loop
Next i  'adds 1 to i, i = 3 at the end of the first loop. Thee second loop starts

я запускаю цикл секунд со значением 3, и вы добавляете 1 к нему, когда i = i + 1и еще раз, когда Next i

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

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