【问题标题】:Based on String return Array in Access 2010 vba基于Access 2010 vba中的字符串返回数组
【发布时间】:2014-10-08 00:14:12
【问题描述】:

我已经为此工作了两天,辗转反侧,这就是我现在的位置。

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 函数中“将 icolumns() 重新设置为整数”时出现语法错误。 提前致谢。

【问题讨论】:

  • Dim iColValue() As Integer更改为ReDim iColValue(10) as Integer(),然后将Dim iColumns() As Integer更改为ReDim iColumns(10) as Integer,然后将as Integer()添加到函数定义的末尾。这应该让你开始

标签: vba ms-access-2010


【解决方案1】:

您不需要在调用过程中使用两个单独的数组来执行您想要的操作。试试这个:

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 时要明确,如我在示例中所示。

【讨论】:

  • 再次感谢。我一直在将其整合到更大的实际项目中,它运行得很好,比我所领导的方向更强大。
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多