关于excel:VBA字符串数组上的“类型不匹配:需要数组或用户定义的类型”

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)

罪魁祸首仍在那儿,因此经过大量尝试使其编译后,我从arrayToOutput参数中删除了(),它开始起作用。

1
Private Sub OutputAnArray(ByRef arrayToOutput As Variant) 'fixed

令人困惑的是,在以下函数定义中,arrayFrom需要()。

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

现在,您永远不会展示如何将DMAs数组实际传递给OutputAnArray

我愿意做出一个有根据的猜测

1
OutputAnArray (DMAs)

确实会导致

Type mismatch: array or user-defined type expected

您不能以这种方式随意加上括号。它们具有特殊的意义。
如果要在调用子程序时使用括号,则必须使用Call

1
Call OutputAnArray(DMAs)

如果您不在乎,请忽略括号,如上例所示:

1
OutputAnArray DMAs

将数组(用户定义类型)作为参数传递给函数ByRef时遇到相同的错误。

就我而言,问题是通过在函数或要调用的子程序前面使用关键字" Call"解决的。

我不是很了解,但是对我来说,似乎VBA试图在缺少"调用"的情况下以几种不同的方式解释函数/子,这会导致错误消息。

我个人尽量避免将任何内容尽可能长时间地转换为变体。