VBA "Type mismatch: array or user-defined type expected” on String Arrays
我有一个动态的字符串DMA数组,它在全局范围内声明。
1 | Dim DMAs() As String |
我重新数组并在CreateArrayOf函数中为其分配值,该函数的类型为String(),该函数返回类型为String()的数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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 |
当我尝试将DMA数组传递给另一个函数OutputAnArray时
1 2 3 4 5 6 7 8 9 10 11 | 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函数的内容放到从中调用它的父函数中,那么一切都很好。
任何帮助表示赞赏。
从文档中:
1 | "Arrays of any type can't be returned, but a Variant containing an array can." |
如果遵循该条件,则函数" CreateArrayOf"不会返回字符串数组:它将返回包含字符串数组的变量。
该变体不能作为参数传递给需要字符串数组的函数:
1 | Private Sub OutputAnArray(ByRef arrayToOutput() As String) |
它只能传递给需要变体的函数:
1 | Private Sub OutputAnArray(ByRef arrayToOutput as Variant) |
相反,DMA是一个字符串数组:
1 | Dim DMAs() As String |
可以将DMA传递给需要字符串数组的函数:
1 | Public Function CreateArrayOf(ByRef arrayFrom() As String, _ . |
最后,"类型不匹配:预期为数组或用户定义的类型"是一条通用类型不匹配消息。当您传递错误类型的数组或变量数组,并收到错误"期望的数组"时,它并不是特别有用。
我将所有字符串定义更改为Variants
1 | Private Sub OutputAnArray(ByRef arrayToOutput() As Variant) |
罪魁祸首仍在那儿,因此经过大量尝试使其编译后,我从
1 | Private Sub OutputAnArray(ByRef arrayToOutput As Variant) 'fixed |
令人困惑的是,在以下函数定义中,
1 | Public Function CreateArrayOf(ByRef arrayFrom() As Variant, _ ... |
我真的不明白,如果有人对解释有任何想法,我很想听听。
从函数返回类型数组或将类型数组作为参数传递给函数都没有问题。预期的工作如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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 |
现在,您永远不会展示如何将
我愿意做出一个有根据的猜测
1 | OutputAnArray (DMAs) |
确实会导致
Type mismatch: array or user-defined type expected
您不能以这种方式随意加上括号。它们具有特殊的意义。
如果要在调用子程序时使用括号,则必须使用
1 | Call OutputAnArray(DMAs) |
如果您不在乎,请忽略括号,如上例所示:
1 | OutputAnArray DMAs |
将数组(用户定义类型)作为参数传递给函数ByRef时遇到相同的错误。
就我而言,问题是通过在函数或要调用的子程序前面使用关键字" Call"解决的。
我不是很了解,但是对我来说,似乎VBA试图在缺少"调用"的情况下以几种不同的方式解释函数/子,这会导致错误消息。
我个人尽量避免将任何内容尽可能长时间地转换为变体。