VBA ведет себя странно, не может получить значение, хранящееся в переменной - PullRequest
0 голосов
/ 11 ноября 2019

У меня очень странная проблема. Я не могу получить значение, возвращаемое простой функцией, как показано ниже, если возвращаемое значение больше одного символа. Теперь вторая проблема заключается в том, что следующий код не назначает «WTH» переменной sheetName. См. Снимок экрана 2. ОБНОВЛЕНО ПОСЛЕ КОММЕНТАРИИ КИРИЛЯ

Public Sub WTHFormatter()

    Dim sheetName As String

    sheetName = "WTH"

    Dim rng1 As Range

    'delete empty rows

    lastRowWTH = getLastRow(sheetName, 2)

    'Delete rows below the last Row
    Worksheets(sheetName).Rows(lastRowWTH + 1 & ":" & Worksheets(sheetName).Rows.Count).Delete

    ' build first range

    Set rng1 = Worksheets(sheetName).Range("B11:F" & lastRowWTH)

    Call setCellBorders(rng1)

    Set rng1 = Worksheets(sheetName).Range("H11:K" & lastRowWTH)

    Call setCellBorders(rng1)

    'determine the range for months

    For i = 13 To 24

        If Cells(7, i) = "" Then
            lastCol = i - 1
            Exit For
        End If
        lastCol = i
    Next

    ColLetter = returnLabel(lastCol)
    ColLetter2 = returnLabel(lastCol + 2)
    ColLetterX = returnLabel(lastCol + 14)

    Set rng1 = Worksheets(sheetName).Range("K17:" & ColLetter & lastRowWTH)

    Call setCellBorders(rng1)

    Set rng1 = Worksheets(sheetName).Range(ColLetter2 & lastRowWTH & ":" & ColLetter3 & lastRowWTH)

    Call setCellBorders(rng1)
End Sub
Function returnLabel(num1 As Long) As String

    Dim ColumnLetter As String

    ColumnLetter = Split(Cells(1, num1).Address, "$")(1)

    returnLabel = ColumnLetter

End Function

Приведенная выше функция возвращает пустое значение, и varTest не имеет ничего после выполнения. Если я выполняю построчное выполнение, я вижу, что test1 в функции не равен 'Null'. Если я прерываю выполнение и проверяю переменные, я вижу «test1 =» только в соответствии со снимком экрана ниже. И это нарушает мой код.

Странно, если я вызываю функцию из «Немедленного окна», она возвращает ожидаемое значение.

То, что я уже сделал:

  • Я протестировал в новом файле, используя простой код, как указано выше.
  • Протестирован на разных ПК и один и тот же код работает нормально с той же версией Windows 10 и Office 365.
  • Обновлено/ Переустановил MS Office 365
  • Перезагрузил компьютер
  • Если возвращаемое значение представляет собой один символ, такой как «A», код работает нормально.

Не удалось понять причину здесь. Любая помощь приветствуется.

ScreenShot of the VBA Code Execution

UPDATE1 Я попробовал его на свежем файле, пока работал код выше, но основной кодиспытывает новую подобную проблему. Это начало происходить только сейчас. Это не присвоение строкового значения переменной. См. Прикрепленный снимок экрана. Снимок экрана с кодом VBA . Я предполагаю, что есть какая-то проблема с системой или вирусом.

Ответы [ 3 ]

1 голос
/ 11 ноября 2019

Если идея состоит в том, чтобы иметь функцию, то есть массив, это возможно с помощью следующего кода:

Function Test1() As Variant
    ReDim result(2)
    result(0) = "AJ"
    result(1) = "A"
    Test1 = result
End Function

Sub Main()

    Dim varTest As Variant
    varTest = Test1(0)
    Debug.Print varTest
    varTest = Test1(1)
    Debug.Print varTest

End Sub

enter image description here

Этосомнительно, зачем это нужно, но в качестве «тестового упражнения» это нормально.

0 голосов
/ 11 ноября 2019

Ваш код работает должным образом.

Функция test1 присваивает значение AJ переменной test1, а затем присваивает значение A переменной test1.
Вы можете присвоить значение 50 в вашей процедуре test, и оно вернет A .

Я думаю, что это код, который вы ищете:

Function test1(num1) As String

'    Dim MyArray As Variant
'    MyArray = Array("AJ", "A")

'OR

    Dim MyArray(0 To 1)
    MyArray(0) = "AJ"
    MyArray(1) = "A"

    If num1 >= LBound(MyArray) And num1 <= UBound(MyArray) Then
        test1 = MyArray(num1)
    Else
        test1 = "Item not here"
    End If

End Function

    Sub test()

        Dim varTest As String

        'Return the second item in the array from the function.
        varTest = test1(1)
        MsgBox varTest

        'Return the first item in the array from the function.
        varTest = test1(0)
        MsgBox varTest

        'Returns "subscript out of range" error as array is only 2 elements in size (0 and 1).
        'The error is dealt with in the function using the IF....ELSE...END IF block and returns
        '"Item not here" instead.
        varTest = test1(2)
        MsgBox varTest

    End Sub
0 голосов
/ 11 ноября 2019

Собираю свои комментарии в ответ, чтобы объединить и добавить больше объяснений.

Указывая на некоторые ошибки в коде перед исправлением:

Function test1(num1) 'declare `as variant` to ensure you're returning an array
    test1 = "AJ"  'this appears to be saving a single string to var test1
    test1 = "A"  'you are now overwriting the above string
End function

Sub test()
    varTest = test1(1) 'you have a single string from the function and arrays start at 0, not 1
End sub

Вы хотели бы указать местов массиве, после объявления массива, в вашей функции так:

Function test1() As Variant
    Dim arr(2) As Variant 'added array because test1 = BLAH is the final output in a function
    arr(0) = "AJ"  'added (1) to call location in array
    arr(1) = "A"  'added (2) to call location in array
    test1 = arr
End Function

Sub test()
    Dim varTest As Variant
    varTest = test1(0) 'outputs "AJ" in immediate window
    Debug.Print varTest
End Sub

Теперь вы можете debug.print значения вашего массива или установить varTest в зависимости от местоположения в массиве.


Редактировать: Протестировано после консолидации комментариев и обнаружено, что фактического вывода для test1 в виде массива в конце функции не было, поэтому пришлось вернуться и добавитьвторой массив для установки test =, разрешающий вывод массива из функции.

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