首页 > 解决方案 > 调用返回 ArrayList 的函数

问题描述

我对其他编程语言(如 java 和 C++)最有经验。VBA 对我来说仍然很新,我几乎不知道我在做什么。我试图从一个函数返回一个数组列表,但我不断收到错误 5 - 无效的过程调用或参数。

Dim months As ArrayList
Dim temp As Integer

Set months = New ArrayList

'Copy and Paste State and Quarter Specific Data
Sheets("The Data (2)").Select
ActiveSheet.Range("$A:$T").AutoFilter Field:=6, Criteria1:=stateName
months = getMonths(Year, Quarter)
ActiveSheet.Range("$A:$T").AutoFilter Field:=17, Criteria1:=months.Item(0), Operator:=xlOr, Criteria2:=months.Item(1), Operator:=xlOr, Criteria3:=months.Item(2)
Range("$A$1:$$T$1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows("State Rate Planning Template.xlsm").Activate
Sheets(3).Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Range("A1").Select

我在“months = getMonths(Year, Quarter)”处收到错误。Year 和 Quarter 是在我这里的代码上方声明的字符串。

这是函数getMonths:

Function getMonths(Year As String, Quarter As String) As ArrayList

    Dim i As Integer
    Dim month As String
    Dim monthList As ArrayList
    
    Set monthList = New ArrayList
    
    If (StrComp(Quarter, "1", compare) = 0) Then
        For i = 1 To 3
            month = Year & "-0" & i
            monthList.Add month
        Next i
    
    ElseIf (StrComp(Quarter, "2", compare) = 0) Then
        For i = 4 To 6
            month = Year & "-0" & i
            monthList.Add month
        Next i
    
    ElseIf (StrComp(Quarter, "3", compare) = 0) Then
        For i = 7 To 9
            month = Year & "-0" & i
            monthList.Add month
        Next i
    
    ElseIf (StrComp(Quarter, "4", compare) = 0) Then
        For i = 10 To 12
            month = Year & "-" & i
            monthList.Add month
        Next i
    
    End If
    
    Set getMonths = monthList

End Function

VBA新手的任何帮助将不胜感激:)

标签: excelvbafunctionarraylistcompiler-errors

解决方案


将错误行更改为

Set months = getMonths(Year, Quarter)

你不需要这条线

Set months = New ArrayList

months持有对对象的引用(使用 c++ 和 java 术语)并设置该引用,您需要使用 VBA 的Set关键字。

编辑:

如果你使用 @Variatus 的getMonths()函数(它返回 VBA 自己的函数,Array我很确定你可以像这样简化你的过滤器:

ActiveSheet.Range("$A:$T").AutoFilter Field:=17, Criteria1:=months

这没有经过测试,我需要进行更正,因为阵列可能需要是一个乱七八糟的阵列。但是尝试一下也无妨。


推荐阅读