【问题标题】:VBA Refresh UserForm ListBox Data when source changes源更改时VBA刷新用户窗体列表框数据
【发布时间】:2017-10-11 19:56:31
【问题描述】:

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

一开始显示的数据很好,但是当我尝试点击“运行日期”按钮时

它与我的 Range 中的值不匹配,该值被设置为我的排序键

这是我的 RUN DATE BUTTON 代码,用于对升序和降序进行排序

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 之类的?

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

谢谢

【问题讨论】:

标签: vba excel listbox


【解决方案1】:

您可以使用工作表中数据的Named Range 并分配属性
ListBox1.RowSource = "Name of the Range"

,而不是使用 var 并将数据从 var 分配给 List

每次您想刷新listbox 时,只需在您的代码中使用上述赋值即可。如果您发现任何困难,请告诉我。

【讨论】:

    【解决方案2】:

    您可以添加一个刷新过程,然后在按钮的 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
    

    【讨论】:

    • 我没有您要测试的源表单,而且我最近一直在 .Net 中使用 Excel 互操作,所以我不记得您是否需要重新绘制表单以显示更新的列表框。如果没有显示更新,请在 RefreshListBox 过程的末尾添加一行:Me.Repaint
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多