Excel 调用返回ArrayList的函数 我在java和C++等其他编程语言方面有丰富的经验。VBA对我来说还是很新的,我几乎不知道自己在做什么。我试图从函数返回arraylist,但一直出现错误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

Excel 调用返回ArrayList的函数 我在java和C++等其他编程语言方面有丰富的经验。VBA对我来说还是很新的,我几乎不知道自己在做什么。我试图从函数返回arraylist,但一直出现错误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,excel,vba,function,arraylist,compiler-errors,Excel,Vba,Function,Arraylist,Compiler Errors,我在月=GetMonthYear,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 ArrayLis

我在月=GetMonthYear,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新手有任何帮助:

将错误行更改为

Set months = getMonths(Year, Quarter)
你不需要排队

Set months = New ArrayList

月份使用C++和java术语保存对象,并设置需要使用VBA的SETKEY.E/P>的引用。 编辑:

如果您使用@Variatus的getMonths函数返回VBA自己的数组,我确信您可以像这样简化过滤器:

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

这是没有测试,我站在被纠正,因为阵列可能需要一个普通的。但是尝试也无妨。

将错误行更改为

Set months = getMonths(Year, Quarter)
你不需要排队

Set months = New ArrayList

月份使用C++和java术语保存对象,并设置需要使用VBA的SETKEY.E/P>的引用。 编辑:

如果您使用@Variatus的getMonths函数返回VBA自己的数组,我确信您可以像这样简化过滤器:

ActiveSheet.Range("$A:$T").AutoFilter Field:=17, Criteria1:=months
这是没有测试,我站在被纠正,因为阵列可能需要一个普通的。但是试试也无妨。

请试试这段代码

Private Sub Test()
    ' 066
    
    Dim Months()    As String
    Dim Temp        As Integer
    
    Months = getMonths(2020, 4)
    For Temp = 1 To 3
        Debug.Print Months(Temp)
    Next Temp
End Sub

Function getMonths(ByVal Year As Integer, _
                   ByVal Quarter As Integer) As String()
    ' 066

    Dim Fun(1 To 3) As String               ' function return array
    Dim i           As Integer
    
    For i = 1 To 3
        Fun(i) = Format(((Quarter - 1) * 3) + i, CStr(Year) & "-00")
    Next i
    getMonths = Fun
End Function
请尝试此代码

Private Sub Test()
    ' 066
    
    Dim Months()    As String
    Dim Temp        As Integer
    
    Months = getMonths(2020, 4)
    For Temp = 1 To 3
        Debug.Print Months(Temp)
    Next Temp
End Sub

Function getMonths(ByVal Year As Integer, _
                   ByVal Quarter As Integer) As String()
    ' 066

    Dim Fun(1 To 3) As String               ' function return array
    Dim i           As Integer
    
    For i = 1 To 3
        Fun(i) = Format(((Quarter - 1) * 3) + i, CStr(Year) & "-00")
    Next i
    getMonths = Fun
End Function

@超级对称的答案正是你需要坚持下去的

其他可能偶然发现这个问题的人应该知道,要从VBA(即在中)直接使用ArrayList类型,必须从Tools/References/Browse添加对mscorlib.dll的引用,然后浏览到适当的.NET Framework文件夹,例如C:\Windows\Microsoft.NET\Framework\v4。。并选择文件mscorlib.tlb。后期绑定会让您的宏在具有不同版本的.NET framework YMMV的计算机上运行,而代价是Intellisense

您提到您是VBA新手,因此这里有一些附加信息

在所有模块和类模块的顶部使用Option Explicit。您可以通过选中“工具”/“选项”/“编辑器”/“要求变量声明”,将VBA编辑器配置为自动执行此操作。然后可以使用Debug/Compile快速查找问题

对于健壮且干净的代码,请避免使用select方法。如果记录宏,则仅用于发现目的;用这个流行答案中给出的技巧清理它们

最后,我不得不缩短您的getMonths函数。下面是一个测试接头:

Option Explicit

Function getMonths(iYear As Integer, iQuarter As Integer) As ArrayList
    Dim monthList As ArrayList
    Dim i As Byte
    Dim item As String
    
    Set monthList = New ArrayList
    
    'Assumption: iYear and iQuarter are both within valid ranges.
    For i = (iQuarter - 1) * 3 + 1 To (iQuarter - 1) * 3 + 3
        item = CStr(iYear) & "-" & Format(i, "00")
        monthList.Add item
    Next
    
    Set getMonths = monthList
End Function

Public Sub Test()
    Dim months As ArrayList
    Dim iYear As Integer
    Dim iQuarter As Integer
    Dim monthItem As Variant
    
    iYear = 2020
    For iQuarter = 1 To 4
        Set months = getMonths(iYear, iQuarter)
        For Each monthItem In months
            Debug.Print monthItem
        Next
    Next
End Sub

@超级对称的答案正是你需要坚持下去的

其他可能偶然发现这个问题的人应该知道,要从VBA(即在中)直接使用ArrayList类型,必须从Tools/References/Browse添加对mscorlib.dll的引用,然后浏览到适当的.NET Framework文件夹,例如C:\Windows\Microsoft.NET\Framework\v4。。并选择文件mscorlib.tlb。后期绑定会让您的宏在具有不同版本的.NET framework YMMV的计算机上运行,而代价是Intellisense

您提到您是VBA新手,因此这里有一些附加信息

在所有模块和类模块的顶部使用Option Explicit。您可以通过选中“工具”/“选项”/“编辑器”/“要求变量声明”,将VBA编辑器配置为自动执行此操作。然后可以使用Debug/Compile快速查找问题

对于健壮且干净的代码,请避免使用select方法。如果记录宏,则仅用于发现目的;用这个流行答案中给出的技巧清理它们

最后,我不得不缩短您的getMonths函数。下面是一个测试接头:

Option Explicit

Function getMonths(iYear As Integer, iQuarter As Integer) As ArrayList
    Dim monthList As ArrayList
    Dim i As Byte
    Dim item As String
    
    Set monthList = New ArrayList
    
    'Assumption: iYear and iQuarter are both within valid ranges.
    For i = (iQuarter - 1) * 3 + 1 To (iQuarter - 1) * 3 + 3
        item = CStr(iYear) & "-" & Format(i, "00")
        monthList.Add item
    Next
    
    Set getMonths = monthList
End Function

Public Sub Test()
    Dim months As ArrayList
    Dim iYear As Integer
    Dim iQuarter As Integer
    Dim monthItem As Variant
    
    iYear = 2020
    For iQuarter = 1 To 4
        Set months = getMonths(iYear, iQuarter)
        For Each monthItem In months
            Debug.Print monthItem
        Next
    Next
End Sub

ArrayList不是VBA已知的数据类型。不看代码的其余部分,从Dim months作为变体开始。请注意,您不需要选择任何内容。范围$A$1:$$T$1.Select:RangeSelection,Selection.EndxlDown.Select:Selection.Copy具有范围$A$1:$$T$1.Copy的效果,$$T$1是一个语法错误。我假设您添加了对mscorlib.dll的引用。即使这样,代码也不会编译。在每个模块/类的顶部添加Option Explicit,然后调试/编译。更正代码并更新问题。ArrayList不是VBA已知的数据类型。不看代码的其余部分,从Dim months作为变体开始。请注意,您不需要选择任何内容。范围$A$1:$$T$1.Select:RangeSelection,Selection.EndxlDown.Select:Selection.Copy具有范围$A$1:$$T$1.Copy的效果,$$T$1是一个语法错误。我假设您添加了对mscorlib.dll的引用。即使这样,代码也不会编译。在每个模块/类的顶部添加Option Explicit,然后调试/编译。更正代码并更新问题。