VBA行为异常,无法获取存储在变量

时间:2019-11-11 15:18:51

标签: excel vba

我遇到一个非常奇怪的问题。如果返回值不止一个char,则无法从如下所示的简单函数返回值。现在,第二个问题是以下代码未将“ 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 =“。这破坏了我的代码。

奇怪的是,如果我从“即时窗口”中调用该函数,它将返回期望值。

我已经做过的事情:

  • 我已经使用上面的简单代码在一个新文件中进行了测试。
  • 在不同的PC上进行测试,并且相同的代码可以在相同版本的Windows 10和Office 365上正常工作。
  • 更新/重新安装了MS Office 365
  • 重新启动电脑
  • 如果返回值是单个字符(如“ A”),则代码工作正常。

无法在此处了解原因。任何帮助表示赞赏。

ScreenShot of the VBA Code Execution

UPDATE1 当上面的代码正常工作时,我在一个新文件上尝试了它,但是主要代码有一个新的类似问题。这才刚刚开始发生。它没有为该变量分配字符串值。请参阅所附的屏幕截图。Screenshot of the VBA Code。我假设系统或病毒有问题。

4 个答案:

答案 0 :(得分:1)

如果想法是要有一个函数,即数组,则可以使用以下代码实现:

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

为什么需要它是一个问题,但是作为“测试练习”就可以了。

答案 1 :(得分:0)

将我的评论纳入答案以巩固并添加更多解释。

在更正之前指出代码中的一些错误:

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 =的第二个数组,允许从函数输出数组。

答案 2 :(得分:0)

您的代码正在正常运行。

test1函数将值 AJ 分配给test1变量,然后将值 A 分配给{{1} }变量。
您可以在test1过程中分配值 50 ,它将返回 A

我认为这是您要使用的代码:

test

答案 3 :(得分:0)

即使不使用显式选项,我也通过声明变量来解决此问题。

即使未声明变量并且也未使用显式选项,旧代码仍可运行而不会引发错误。但是,由于某些原因,它无法按预期方式读取/写入未声明的变量。

现在按照@cyril的建议,我声明正在使用的变量并运行代码。此时间代码按预期运行。

这发生在多个变量中,并且在代码的不同阶段。