基于Access 2010 vba中的String返回数组

时间:2014-10-07 15:38:29

标签: vba ms-access-2010

我已经在这方面工作了两天并且四处奔波,这就是我现在的位置。

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”时出现语法错误。 提前谢谢。

1 个答案:

答案 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根据传递给SetColumns的参数动态调整数组大小。
  • 我在ReDim语句中将下限和上限都传递给了数组。 VBA中的数组默认为零,因此ReDim iColumns(4)实际上等同于ReDim iColumns(0 To 4)
  • 因为我们不再提前知道数组的大小,所以我使用LBound()UBound()函数来遍历数组。
  • 我将两个If语句更改为Select ... Case语句。根据您提供的有限示例代码,这似乎是合适的。如果您的实际代码更复杂,则可能不是。

*注意:不幸的是,您可以使用Option Base statement在VBA中更改起始阵列库。请不要这样做。永远。你只会迷惑自己和他人。如果你想让一个特定的数组从1开始,那么当我在我的例子中显示Dim或ReDim数组时,应该显式。