【问题标题】:Change array values depending on selections in listbox on a userform根据用户窗体上列表框中的选择更改数组值
【发布时间】:2017-07-06 03:39:37
【问题描述】:

我希望能够从运行用户表单的子程序中更改数组值。我该怎么做?

这是我所拥有的示例:

A = [25, 50, 75, 100]
UserForm1.Show

UserForm1 包含一个带有选项 1、2 或 3 的列表框。
通过选择“1”、“2”、“3”或它们的多个组合,我想相应地更改 A 的值。

If "1" is selected Then
A(0) = 10
If "2" is selected Then
A(1) = 0
If "3" is selected Then
A(2) = 1000

我将如何做到这一点?提前感谢您的帮助。

【问题讨论】:

  • "1" 将始终为=True。 “2”和“3”等相同。您的意思是该项目是否在列表框中选中
  • 是的,如果他们被选中。

标签: vba excel


【解决方案1】:

这是在 ListBox_AfterUpdate() 事件中测试的。获取ListBox 对象的句柄(分配给变量lb)然后迭代lb.List 中的项目,检查是否每个项目都被选中。如果选中,则将位置值分配给数组A

数组A 在此声明为模块/用户表单范围的变量,并在表单的_Initialize 事件期间分配默认/初始值。如果用户在 ListBox 中进行选择,则这些值将被更改。

Option Explicit
Dim A()
Private Sub UserForm_Initialize()
'Assigns initial values to your array:
A = Array(25, 50, 75, 100)
'Assigns the default ListBox items:
Me.ListBox1.List = Array("1", "2", "3")
End Sub
Private Sub ListBox1_AfterUpdate()
Dim lb As MSForms.ListBox
Dim i As Long, v As Long
Set lb = Me.ListBox1 '# Modify as needed
For i = 0 To lb.ListCount - 1
    If lb.Selected(i) Then
        Select Case lb.List(i)
            Case "1"
                v = 10
            Case "2"
                v = 0
            Case "3"
                v = 1000
        End Select
        'confirm prev & new values for array:
        MsgBox (A(i) & " will be changed to: " & v)
        A(i) = v
        'Confirm the value in array has changed
        MsgBox (A(i))
    End If
Next
End Sub

根据您初始化A 数组的位置/时间,您可以修改它并从ListBox_ChangeListBox_AfterUpdate 事件中调用它,或者根据需要从另一个控件的事件过程中调用它。

【讨论】:

  • 这看起来正是我所需要的。我会将此代码放在通过双击列表框产生的子程序中吗?如何调用 A 数组以便更改其数据?
  • 放在哪里取决于你想做什么。我不能为你回答这个问题。我不明白你的第二个问题。你了解 VBA 中的变量 scope 吗?如果没有,请研究它并使用适当的范围。可能您希望在 UserForm 模块中有一个公共变量,但同样,这取决于您要执行的操作。
  • 如果您想从 ListBox 调用此代码,我建议您使用 ChangeAfterUpdate 事件,而不是 Click 事件。
猜你喜欢
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多