【问题标题】:Access VBA loop through listbox select items and add to array通过列表框选择项访问VBA循环并添加到数组
【发布时间】:2016-02-17 15:20:16
【问题描述】:

我正在尝试遍历列表框并将内容添加到数组中......

我的代码是这样的:

Private Sub exportfolders_Click()

Dim list As String
Dim folderlist As String
Dim folderarray() As String
'Dim i As Interger

For i = 0 To Me.selectedfolders.ListCount - 1
    'folderlist = (Me.selectedfolders.Column(0, i))
    'folderarray() = Join(Me.selectedfolders.Column(0, i), ",")
    list = (Me.selectedfolders.Column(0, i))
    folderarray() = Join(list, ",")
    ReDim Preserve folderarray(i)
Next i
   folderlist = folderarray
    'folderarray() = Join(folderlist, ",")
    MsgBox (folderlist)

End Sub

您可以看到我已注释掉的部分,并尝试了各种方法使其正常工作。但我在folderarray(i) = Join(list, ",") 不断收到“无法分配给数组”的消息。关于我在哪里失败的任何指示?

【问题讨论】:

  • 尝试将数组调暗为变体。定义为 String 的数组需要具有指定的大小(即 Dim folderarray(5) As String),而 Variant 允许不指定的大小。
  • 仍然得到“无法分配给数组”:(
  • 在给“folderarray()”赋值之前放置“ReDim”语句,否则无法赋值。然后,当为“folderarray()”分配一个值时,您必须使用索引 (folderarray(i)=...)。如果要将整个列表分配给数组,则必须将数组声明为“Variant”类型
  • 我得到运行时错误 '13:即使变量设置为 Variant 或 String,类型也不匹配
  • 触发错误的行是这样的:folderarray(i) = Join(list, ",")

标签: arrays ms-access vba listboxitems


【解决方案1】:

您可以将列表框项目连接成一个字符串,然后使用Split() 加载您的数组。这样,数组会自动调整大小,而无需 ReDim

我在 Access 2010 中测试了这段代码:

Dim folderarray() As String
Dim i As Long
Dim strList As String

For i = 0 To Me!selectedfolders.ListCount - 1
    strList = strList & "," & Me!selectedfolders.Column(0, i)
Next
' use Mid() to exclude the first comma ...
folderarray = Split(Mid(strList, 2), ",")

注意我不知道你想在加载后对数组做什么。 MsgBox folderarray 会抛出 类型不匹配 错误。 MsgBox Mid(strList, 2) 是有效的,但如果这是你想要的,你就不需要数组了。

【讨论】:

  • +1 是为了简单和跳出框框思考。如果我是提问者,我肯定会奖励这个!
  • 谢谢!它起作用了:),我的计划是在 SQL 语句中使用它,以根据添加到列表框中的数据导出更详细的结果。因为可以将许多变体添加到列表框中。
【解决方案2】:

1) 声明数组。看看https://msdn.microsoft.com/en-us/library/wak0wfyt.aspx

2) 不需要支持变量

3) 使用正确的语法将值分配给数组

Private Sub exportfolders_Click()

Dim folderarray() As String
Dim i As Interger

Redim folderarray (Me.selectedfolders.ListCount-1)

For i = 0 To Me.selectedfolders.ListCount - 1
    folderarray(i) = Me.selectedfolders.Column(0, i)
Next i

' Write here what you want to do with your array

End Sub

【讨论】:

    【解决方案3】:

    你可以试试这样的:

    Private Sub ListToArray()
        Dim folderArray() As Variant
        Dim currentValue As String
        Dim currentIndex As Integer
        Dim topIndex As Integer
    
        topIndex = Me.selectedfolders.ListCount - 1
        ReDim folderArray(0 To topIndex, 0 To 1)
    
        For i = 0 To topIndex
            currentValue = Me.selectedfolders.Column(0, i)
            folderArray(i, 0) = i
            folderArray(i, 1) = currentValue
        Next i
    End Sub
    

    请注意,我的示例是一个多维数组,如果您选择这样做,它可以让您添加多个项目。在此示例中,我添加了“i”的值作为占位符/索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多