我有一个动态的字符串DMA数组,我在全局声明。
Dim DMAs() As String
我重新调整数组,并在CreateArrayOf函数中为其赋值,该函数的类型为String(),返回String()类型的数组
DMAs = CreateArrayOf(Sites, 2, "", False)
Public Function CreateArrayOf( _
ByRef arrayFrom() As String, _
Optional ByVal numOfChars As Integer = 2, _
Optional ByVal filterChar As String = "", _
Optional ByVal filterCharIsInteger As Boolean = False _
) As String()
Dim i As Integer, _
j As Integer, _
strn As Variant, _
switch As Boolean, _
strArray() As String
'numOfChars 2 for DMA with no filterChar
'numOfChars 3 for W with filterChar "W"
'numOfChars 3 for A with filterChar "A"
'numofChars 2 for D with filterChar "D"
ReDim strArray(LBound(arrayFrom) To LBound(arrayFrom)) 'required in order to
'not throw error on first iteration
For i = LBound(arrayFrom) To UBound(arrayFrom) 'iterate through each site
switch = False
For Each strn In strArray 'iterate through the array to find whether the
'current site already exists
If strn = Mid(arrayFrom(i), 1, numOfChars) And Not strn = "" Then
switch = True
End If
Next strn
If switch = False Then 'if it doesn't exist add it to the array
ReDim Preserve strArray(1 To UBound(strArray) + 1)
strArray(UBound(strArray) - 1) = Mid(arrayFrom(i), 1, numOfChars)
End If
Next i
CreateArrayOf = strArray 'return the new array
End Function
当我尝试将DMAs数组传递给另一个函数OutputAnArray
时Private Sub OutputAnArray(ByRef arrayToOutput() As String)
Dim i As Variant
Dim x As Integer
x = 1
For Each i In arrayToOutput
Cells(x, 6).Value = i
x = x + 1
Next i
End Sub
我得到"类型不匹配:期望的数组或用户定义类型"。在整个过程中,我只讨论字符串数组。
如果我获取OutputAnArray函数的内容并将其放在我调用它的父函数中,那么一切都很好。
感谢任何帮助。
答案 0 :(得分:2)
我将所有字符串定义都更改为Variants
Private Sub OutputAnArray(ByRef arrayToOutput() As Variant)
罪魁祸首仍然存在,所以在经过大量尝试将其编译后,我从arrayToOutput
参数中删除了()并开始工作。
Private Sub OutputAnArray(ByRef arrayToOutput As Variant) 'fixed
令人困惑的是,在以下函数定义中,arrayFrom
需要()。
Public Function CreateArrayOf(ByRef arrayFrom() As Variant, _ ...
我真的不明白,如果有人知道解释,我很乐意听到。
答案 1 :(得分:2)
来自文档:
"Arrays of any type can't be returned, but a Variant containing an array can."
如果遵循该函数“CreateArrayOf”不返回字符串数组:它返回包含字符串数组的变量。
变量不能作为参数传递给期望字符串数组的函数:
Private Sub OutputAnArray(ByRef arrayToOutput() As String)
它只能传递给期望变体的函数:
Private Sub OutputAnArray(ByRef arrayToOutput as Variant)
相反,DMA是一个字符串数组:
Dim DMAs() As String
DMA 可以传递给期望字符串数组的函数:
Public Function CreateArrayOf(ByRef arrayFrom() As String, _ .
最后,“类型不匹配:数组或用户定义的预期类型”是泛型类型不匹配消息。当您传递错误类型的数组或变量数组,并获得错误“array expected”时,它并没有特别的帮助。
答案 2 :(得分:0)
在将数组(用户定义类型)作为参数传递给函数ByRef时遇到相同的错误。
对于我来说,问题是通过在函数或要调用的子程序前面使用关键字“ Call”解决的。
我不太了解它,但是对我来说,似乎VBA试图在缺少“呼叫”的情况下以几种不同的方式解释函数/子,这会导致错误消息。
我个人尽量避免将任何内容尽可能长时间地转换为变体。
答案 3 :(得分:0)
从函数返回带类型的数组或将带类型的数组作为参数传递给函数都没有问题。预期效果如下:
Option Explicit
Sub asdfasf()
Dim DMAs() As String
DMAs = CreateAnArray()
OutputAnArray DMAs
End Sub
Private Function CreateAnArray() As String()
Dim arr() As String
ReDim arr(1 To 5)
Dim i As Long
For i = LBound(arr) To UBound(arr)
arr(i) = i
Next
CreateAnArray = arr
End Function
Private Sub OutputAnArray(ByRef arrayToOutput() As String)
Dim i As Long
For i = LBound(arrayToOutput) To UBound(arrayToOutput)
Debug.Print arrayToOutput(i)
Next
End Sub
现在,您永远不会显示如何实际将DMAs
数组传递给OutputAnArray
。
我愿意对你正在做的事情进行有根据的猜测
OutputAnArray (DMAs)
这确实会导致
类型不匹配:需要数组或用户定义的类型
您不能以这种方式随意放置括号。 They have special meaning。
如果要在调用子程序时使用括号,则必须使用Call
:
Call OutputAnArray(DMAs)
如果您不在乎,请像上面的示例一样省略括号:
OutputAnArray DMAs