情况:
我有一个函数RemoveEmptyArrRowCol
,它接受两个参数,其中一个是数组(tempArr
)。
当第二个参数是长时,一切都很好。当我将第二个参数更改为 String (以及相关的调用变量)时,我得到了:
类型不匹配(错误13)
所以在下面的代码示例中:
Test1
运行良好Test2
失败问题:
1)为什么两者之间的行为不同?
2)如何修复第二个版本,使其按照第一个版本进行操作?
3)当我将字典值(数组)作为第一个参数传递而不是直接从工作表中读取时,我将如何证明这一点?
我尝试了什么:
这似乎是一个关于SO的常见问题,我已经看过其中的一些问题;其中一些我在这个问题的底部作为参考。但是,我仍然没有解决为什么这两个子工作中的第一个工作原理,但第二个工作原理没有?
我玩了不同的组合:
tempArr
:Dim tempArr() As Variant
ByRef tempArr() As Variant
在查看@ Fionnuala对此问题的回答MS Access/VBA type mismatch when passing arrays to function/subroutine之后,我决定尝试使用Call
:
Call RemoveEmptyArrRowCol2(ws.Range("C4:I129").Value, tempStr)
这已编译但意味着我需要更改代码的其他部分以确保正确填充tempArr
。如果我这样做,我不妨将函数转换为过程。
按原样,流程是我在测试示例中填写tempArr
,直接从工作表填充,然后交给另一个子工作,即
tempArr = RemoveEmptyArrRowCol(ws.Range("C4:I129").Value, tempStr)
ArrayToSheet wb.Worksheets("Test").Range("A1"), tempArr
请注意:问题3:
在最终版本中,我将传递一个数组,从字典中提取,作为第一个参数,即
tempArr = RemoveEmptyArrRowCol( ArrayDict(tempStr), tempStr)
工作版本:
Option Explicit
Public Sub Test1()
Dim tempArr() 'variant
Init
Dim tempStr As String: tempStr = "Response Times"
tempArr = RemoveEmptyArrRowCol(ws.Range("C4:I129").Value, categoryDict(tempStr & "Cols"))
End Sub
Private Function RemoveEmptyArrRowCol(ByRef tempArr As Variant, ByVal nCols As Long) As Variant
End Function
版本失败:
Public Sub Test2()
Dim tempArr()
Init
Dim tempStr As String: tempStr = "Response Times"
tempArr = RemoveEmptyArrRowCol2(ws.Range("C4:I129").Value, tempStr)
End Sub
Private Function RemoveEmptyArrRowCol2(ByRef tempArr As Variant, ByVal tempStr As String) As Variant
End Function
当前完整功能的示例:
Private Function RemoveEmptyArrRowCol(ByRef tempArr As Variant, ByVal tempStr As String) As Variant
Dim i As Long
Dim j As Long
Dim counter As Long
counter = 0
Dim tempArr2()
Dim totCol As Long
Dim adjColTotal As Long
totCol = categoryDict(tempStr & "Cols")
adjColTotal = categoryDict(tempStr & "ColsAdj")
Select Case tempStr
Case "ResponseTimes", "NoCCPR"
ReDim tempArr2(1 To 1000, 1 To adjColTotal)
For i = 1 To UBound(tempArr, 1)
If tempArr(i, 2) <> vbNullString Then 'process row
counter = counter + 1 'load row to temp array (counter becomes row count)
For j = 1 To totCol
Select Case j
Case Is < 4
tempArr2(counter, j) = tempArr(i, j)
Case Is > 4
tempArr2(counter, j - 1) = tempArr(i, j)
End Select
Next j
End If
Next i
RemoveEmptyArrRowCol = RedimArrDimOne(tempArr2, adjColTotal, counter)
Case "Incidents"
End Select
End Function
其他参考资料:
1)Passing arrays to functions in vba
2)Passing array to function returns compile error
3)Type mismatch error when passing arrays to a function in excel vba
答案 0 :(得分:0)
这实际上取决于您的输入和输出,例如RemoveEmptyArrRowCol2函数中的内容。这是一个选项,其中tempStr as String
没有失败:
Public Sub Test2()
Dim tempArr()
Dim tempStr As String: tempStr = "Response Times"
tempArr = RemoveEmptyArrRowCol2(Range("C4:I129").Value, tempStr)
End Sub
Private Function RemoveEmptyArrRowCol2(ByRef tempArr As Variant, _
ByVal tempStr As String) As Variant
RemoveEmptyArrRowCol2 = Array(1, 2)
End Function
,例如,如果删除返回值(数组(1,2),它会失败),但它应该失败,因为它不会返回任何内容。
答案 1 :(得分:0)
将“Dim tempArr As Variant”定义为“()”的变体数组。
请告诉我们您的功能“categoryDict”和“ArrayDict”
“通话”并非无足轻重!
您可以按如下方式访问值:
Dim r As Long
Dim c As Long
For r = 1 To UBound(tempArr, 1)
For c = 1 To UBound(tempArr, 2)
Debug.Print tempArr(r, c)
Next
Next