【问题标题】:Dynamically building an array in a UserForm (VBA)在用户窗体 (VBA) 中动态构建数组
【发布时间】:2016-07-09 07:35:57
【问题描述】:

我正在尝试根据是否从另一个数组中勾选了一组 CheckBox(在用户窗体中)来构建一个数组。所以目前的代码是:

   Dim MyArray(10) As Integer
   MyArray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  Dim IntrnlArray() As Variant

  For i = 1 To 10
  If Me.Controls("CheckBox" & i).Value = True Then
  ' some code I cant figure out!
  End If
Next

生成的(可能更小)新数组 IntrnlArray() 然后将在其他地方使用。因此,新数组将包含已勾选复选框的数量。然后这些数字将在其他地方用于进一步的计算,而不是告诉用户哪个复选框已被勾选。 任何帮助将不胜感激!!!

【问题讨论】:

  • 我确信这里提供的解决方案之一将满足您的需求:stackoverflow.com/questions/7000334/… 与本文的作者类似,我相信集合可能更适合您的需求。或者,您也可以只连接字符串中的数字(逗号分隔),然后使用Split() 方法从字符串中读取。
  • 出于兴趣,我以前从未使用过集合。我将如何进行编码?感谢您的耐心等待!
  • 以下内容可能有点过分:excelmacromastery.com/Blog/index.php/… 但它非常有条理,这样你只能得到你真正想要/需要的部分和平静。还有一个与数组的比较以及何时使用 which:excelmacromastery.com/Blog/index.php/… 正如作者所提到的:当您具有固定大小时,数组会更好。由于您希望动态调整大小,我建议您使用集合。
  • 盛大。感谢您的链接

标签: arrays vba dynamic userform


【解决方案1】:

由于@Mr-Nemo 在评论中询问,我还提供了一个使用集合的示例:

Public Sub UsingCollections()

Dim MyCollection As New Collection

For i = 1 To 10
    If Me.Controls("CheckBox" & i).Value = True Then
        MyCollection.Add i
    End If
Next i

End Sub

【讨论】:

  • 注意:最后,您将拥有与True 值的复选框一样多的项目集合。
  • 他改变了主意,你偷了我 15 个代表点 ;-) @MrNemo 我仍然会让 NZ() 我在复选框值上设置,否则你会在三态复选框上得到一个错误可以返回truefalseNULL
  • @ThomasG 这就是为什么我赞成你的回答至少给你 10 分,因为我感到内疚。我希望尼莫先生也能学会投票。那你现在已经有20个了。顺便说一句,NZ() 仅适用于 MS Access。由于我没有看到任何有关 MS Access 的迹象,因此您应该注意在 Excel 的情况下可以使用 Iif
  • 啊,是的,你对 Excel 上的 NZ 是正确的,另一方面,他从未指定它是用于 Excel 的:p
【解决方案2】:

不完全确定你到底想要什么,但我想这就足够了:

Dim IntrnlArray() As boolean

For i = 1 To 10
        redim IntrnlArray(i)
        IntrnlArray(i) = nz(Me.Controls("CheckBox" & i).Value,false)
Next

您不需要 2 个数组。此代码会将每个复选框的值(真或假)分配给数组的相应元素

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2022-11-14
相关资源
最近更新 更多