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
我在月=GetMonthYear,Quarter时收到错误。年份和季度是在我这里的代码上面声明的字符串 下面是getMonths的函数: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
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,然后调试/编译。更正代码并更新问题。