我已经在这方面工作了两天并且四处奔波,这就是我现在的位置。
Private Function SetColumns(sRptVer As String, iColumns() As Integer)
If sRptVer = "Q1" Then
iColumns(1) = 5 '<- Subscript out of range error here Hovering shows _
'"iColumns(1)=<Subscript out of range>"
iColumns(2) = 6
iColumns(3) = 7
iColumns(4) = 17
End If
If sRptVer = "Q2" Then
iColumns(1) = 5
iColumns(2) = 6
iColumns(3) = 7
iColumns(4) = 8
iColumns(5) = 9
iColumns(6) = 10
iColumns(7) = 17
End If
SetColumns = iColumns()
End Function
Private Sub Test2()
Dim iColValue() As Integer
Dim sRptVer As String
Dim iColumns() As Integer
sRptVer = "Q1"
iColValue() = SetColumns(sRptVer, iColumns())
For i = 1 To 10
Debug.Print iColValue(i)
Next i
End Sub
目标是能够传递指定季度的字符串并返回一个数组,该数组将用于设置我将迭代的列以从Excel电子表格中获取值。 (我将数据从Excel提取到Access中)。 我试过用iColumns(0)开始。没有不同。 注意:Access vba不喜欢像iColumns()= {1,2,3,4}那样设置数组。它嘲笑“{}”。 Access vba似乎也不喜欢“ReDim”,我得到一个编译错误:当我在SetColumns函数中“redim icolumns()为Integer”时出现语法错误。 提前谢谢。
答案 0 :(得分:0)
在调用过程中,您不需要两个单独的数组来执行您想要的操作。试试这个:
Private Function SetColumns(sRptVer As String) As Integer()
Dim iColumns() As Integer
Select Case sRptVer
Case "Q1"
ReDim iColumns(1 To 4)
iColumns(1) = 5
iColumns(2) = 6
iColumns(3) = 7
iColumns(4) = 17
Case "Q2"
ReDim iColumns(1 To 7)
iColumns(1) = 5
iColumns(2) = 6
iColumns(3) = 7
iColumns(4) = 8
iColumns(5) = 9
iColumns(6) = 10
iColumns(7) = 17
End Select
SetColumns = iColumns
End Function
Private Sub Test2()
Dim sRptVer As String
Dim iColValue() As Integer
sRptVer = "Q1"
iColValue() = SetColumns(sRptVer)
Dim i As Integer
For i = LBound(iColValue) To UBound(iColValue)
Debug.Print iColValue(i)
Next i
End Sub
我做了一些其他改动:
ReDim iColumns(4)
实际上等同于ReDim iColumns(0 To 4)
。LBound()
和UBound()
函数来遍历数组。 *注意:不幸的是,您可以使用Option Base
statement在VBA中更改起始阵列库。请不要这样做。永远。你只会迷惑自己和他人。如果你想让一个特定的数组从1开始,那么当我在我的例子中显示Dim或ReDim数组时,应该显式。