VBA 源更改时刷新用户窗体列表框数据

VBA Refresh UserForm ListBox Data when source changes

您好,我的用户表单中的列表框数据有问题 当我尝试更改我的列表框连接的源文件时,它似乎没有改变

一开始它显示的数据不错,但是当我尝试单击 运行 日期按钮时

它与设置为我的排序键的我范围内的值不一致

这是我的 运行 用于升序和降序排序的日期按钮的代码

Private Sub CommandButton1_Click()

Application.EnableEvents = False

Worksheets("combobox_value").Activate
Dim strDataRange As Range
Dim keyRange As Range
Set strDataRange = Range("I2:L4")
Set keyRange = Range("I2:I4")

If Range("M2").Value = "D" Then

strDataRange.Sort Key1:=keyRange, Order1:=xlDescending
Range("M2").Value = "A"
Else
strDataRange.Sort Key1:=keyRange, Order1:=xlAscending
Range("M2").Value = "D"
End If
Application.EnableEvents = True
End Sub

这就是我在列表框中初始化值的方式

Private Sub UserForm_Initialize()
'set ListBox properties on initialization of UserForm
Set sht = ThisWorkbook.Worksheets("combobox_value")
lastRow_combobox_column = sht.Cells(sht.Rows.Count, "I").End(xlUp).Row


With ListBox1
.ColumnCount = 4
.ColumnWidths = "100"
.ColumnHeads = False
.ControlTipText = True
End With

'Load Worksheet Range directly to a ListBox:
Dim var As Variant


var = Sheets("combobox_value").Range("I2:L" & lastRow_combobox_column)


Me.ListBox1.List = var


End Sub

有没有办法刷新我的列表框? Listbox1.refresh 类似的东西?

注意:我不需要关闭我的用户表单并再次打开来查看更新后的列表框 所以当用户窗体处于活动模式(打开)时,我可以直接更新列表框值..

谢谢

您可以添加刷新过程,然后在按钮的 OnClick 事件过程中调用它。 请注意,我尚未测试此代码,但它应该可以满足您最初提出的问题。

Private Sub UserForm_Initialize()
    'set ListBox properties on initialization of UserForm
    Set sht = ThisWorkbook.Worksheets("combobox_value")
    lastRow_combobox_column = sht.Cells(sht.Rows.Count, "I").End(xlUp).Row

    With ListBox1
        .ColumnCount = 4
        .ColumnWidths = "100"
        .ColumnHeads = False
        .ControlTipText = True
    End With

    RefreshListbox 
End Sub

Private Sub CommandButton1_Click()    
    Application.EnableEvents = False

    Worksheets("combobox_value").Activate
    Dim strDataRange As Range
    Dim keyRange As Range
    Set strDataRange = Range("I2:L4")
    Set keyRange = Range("I2:I4")

    If Range("M2").Value = "D" Then

        strDataRange.Sort Key1:=keyRange, Order1:=xlDescending
        Range("M2").Value = "A"
    Else
        strDataRange.Sort Key1:=keyRange, Order1:=xlAscending
        Range("M2").Value = "D"
    End If
    Application.EnableEvents = True
    RefreshListbox
End Sub

Private Sub RefreshListbox()
    Me.ListBox1.Clear
    'Load Worksheet Range directly to a ListBox:
    Dim ListRange As Range
    ListRange = Sheets("combobox_value").Range("I2:L" & lastRow_combobox_column)
    Me.ListBox1.List = ListRange
End Sub

不是使用 var 并将数据从 var 分配给 List,而是可以使用 sheet 中的 Named Range 数据并将 属性
ListBox1.RowSource = "Name of the Range"

每次您想刷新 listbox 时,只需在您的代码中使用上面的赋值,它就会起作用。如果您发现任何困难,请告诉我。