列表更新vba excel后刷新combobox

我试图自动更新combobox列表。 只有在closures并打开工作簿时,或者在VBA上按下停止button并再次运行macros时,才能正确更新。 我有以下的VBA代码。

Private Sub UserForm_Initialize() Dim cod As Range Dim pro As Range Dim cli As Range Dim ws As Worksheet Dim ws5 As Worksheet Set ws = Worksheets("ListaProductos") Set ws5 = Worksheets("ListaClientes") For Each cod In ws.Range("CodigoProductoLista") With Me.codigo .AddItem cod.Value .List(.ListCount - 1, 1) = cod.Offset(0, 1).Value End With Next cod For Each cli In ws5.Range("ClienteLista") With Me.cliente .AddItem cli.Value .List(.ListCount - 1, 1) = cli.Offset(0, 1).Value End With Next cli No.Value = True calendario2.Visible = False calendario2.Refresh calendario = Date Me.codigo.SetFocus End Sub 

谢谢!

您可以再次调用UserForm_Initialize过程,但是必须先清除列表。 你可以在命令button中使用它,或者在事件中使用它。

Initialize事件只会在窗体加载时触发。 将一个button添加到名为cmdRepopulate的表单中,然后使用此代码:

 Option Explicit Private Sub UserForm_Initialize() PopulateCodigoProductoLista PopulateClienteLista FinishingOff End Sub Private Sub PopulateCodigoProductoLista() Dim rngData As Range With Worksheets("ListaProductos").Range("CodigoProductoLista") Set rngData = .Resize(.Rows.Count, 2) End With PopulateComboUsingRange Me.codigo, rngData End Sub Private Sub PopulateClienteLista() Dim rngData As Range With Worksheets("ListaClientes").Range("ClienteLista") Set rngData = .Resize(.Rows.Count, 2) End With PopulateComboUsingRange Me.cliente, rngData End Sub Private Sub FinishingOff() No.Value = True calendario2.Visible = False calendario2.Refresh calendario = Date Me.codigo.SetFocus End Sub Private Sub PopulateComboUsingRange(cboDataDestination As MSForms.ComboBox, _ rngDataSource As Range) Dim lngCounter As Long With cboDataDestination .Clear For lngCounter = 1 To rngDataSource.Rows.Count .AddItem rngDataSource.Cells(lngCounter, 1) If rngDataSource.Columns.Count = 2 Then .List(.ListCount - 1, 1) = rngDataSource.Cells(lngCounter, 2) End If Next End With End Sub Private Sub cmdRepopulate_Click() PopulateCodigoProductoLista PopulateClienteLista FinishingOff End Sub 

有一些限制(因为太晚了),特别是通用组合人口程序,但在目前它应该是对你有好处。 代码将在窗体的Initialize事件上运行,并且每当您单击重新填充button。 我决定像你一样使用你的命名范围 – 没有任何改变。

注意使用通用的proc来填充组合。 如果在同一工作簿中有其他forms的其他组合,则可以将该proc移动到单独的模块中,将其更改为Public(而不是Private),并通过重用代码节省大量的input。