我遇到一个非常奇怪的问题。如果返回值不止一个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 =“。这破坏了我的代码。
奇怪的是,如果我从“即时窗口”中调用该函数,它将返回期望值。
我已经做过的事情:
无法在此处了解原因。任何帮助表示赞赏。
UPDATE1 当上面的代码正常工作时,我在一个新文件上尝试了它,但是主要代码有一个新的类似问题。这才刚刚开始发生。它没有为该变量分配字符串值。请参阅所附的屏幕截图。Screenshot of the VBA Code。我假设系统或病毒有问题。
答案 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
为什么需要它是一个问题,但是作为“测试练习”就可以了。
答案 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的建议,我声明正在使用的变量并运行代码。此时间代码按预期运行。
这发生在多个变量中,并且在代码的不同阶段。