VBA: цикл теряет значение переменной - PullRequest
0 голосов
/ 28 ноября 2018

У меня странная проблема с циклом в VBA, так как кажется, что он теряет значение моей переменной.Есть идеи почему?Если я удаляю цикл, debug.print показывает «тест», в противном случае он пуст (если только я не напечатаю значение «dupa» внутри цикла) ... Кажется очень странным.

Function carbon_copy(indeks As String) As String

Dim emails(1 To 3) As String
Dim i As Integer
Dim dupa As String

emails(1) = "abc@wp.pl"
emails(2) = "pabc@wp.pl"
emails(3) = "rabc@wp.pl"

i = 1
dupa = "test"

Do While emails(i) <> ""

    If i = indeks Then
         GoTo NextIteration
    End If

    dupa = dupa & ";" & emails(i)


    NextIteration:
    i = i + 1

Loop

Debug.Print dupa

carbon_copy = dupa

End Function

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

это должно работать (пояснения в комментариях):

Function carbon_copy(indeks As Long) As String
    Dim emails(1 To 3) As String
    Dim i As Long
    Dim dupa As String

    emails(1) = "abc@wp.pl"
    emails(2) = "pabc@wp.pl"
    emails(3) = "rabc@wp.pl"

    i = 1
    Do While emails(i) <> ""
        If i <> indeks Then dupa = dupa & ";" & emails(i) ' update 'dupa' if current index doesn't natch passed 'indeks'
        i = i + 1
        If i > UBound(emails, 1) Then Exit Do ' be sure to exit upon exceeding 'emails()' array size
    Loop

    carbon_copy = dupa
End Function
0 голосов
/ 28 ноября 2018

Вы должны получить ошибку времени выполнения 9, поскольку при индексировании i будет 4 после того, как вы перебрали свой массив строк электронной почты.Как только он попытается сравнить значение emails(4) с "", он должен создать «индекс вне диапазона», поскольку вы определили, что ваш массив составляет всего 3 элемента.

Для небольшого поясненияпопробуйте этот пример кода, он должен выдать ту же ошибку:

Function littleTest()
    Dim teststr(1 To 3) As String
    Dim i As Integer

    teststr(1) = "abc"
    teststr(2) = "def"
    teststr(3) = "ghi"

    i = 1

    Do While teststr(i) <> ""
        Debug.Print "i do it for the " & i & " time!"
        i = i + 1
    Loop

End Function

Вы уже нашли решение самостоятельно, поскольку UBound() возвращает фактическую длину вашего массива, которая в вашем случае равна трем, поэтому она никогда не будетпоиск вне массива.

0 голосов
/ 28 ноября 2018

Вы индексируете границы массива.Условие Do While emails(i) <> "" всегда верно для вашего массива, поэтому оно не выполняется на emails(4).Просто проверьте границы массива и выполните цикл:

For i = LBound(emails) To UBound(emails)
    If emails(i) <> "" And i = indeks Then
        dupa = dupa & ";" & emails(i)
    End If
Next
0 голосов
/ 28 ноября 2018

На самом деле, я уже решил проблему, используя другой тип цикла (Для i = 1 To UBound (emails), Next i), но почему предыдущий цикл не работал, для меня все еще довольно загадочно ... ЕслиКто-нибудь может объяснить, я был бы признателен, потому что я предпочитаю понимать вещи, а спасибо, просто делайте это правильно.

W.

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