填充多个组合框使VBA用户窗体变慢
目前我正在制作带有40个组合框的用户窗体,它们都具有相同的列表。我的问题是填充所有这些组合框的使userform.show
缓慢。在这些组合框中填充的列表是一个非常长的列表(46542行和列表长度可能会有所不同),该列表包含3列。填充多个组合框使VBA用户窗体变慢
我一直在与CONCATENATE鬼混整个名单,但这并没有太大的改变。另外,因为在选择行号时,我需要在组合框中选择的值与组合框中的所有3列进行CONCATENATE。 1,而不是在comboxbox文本框中只写入第1列,它将返回所有3列,这意味着我实际上有4列,其中第一列是CONCATENATE并隐藏在下拉列表中。
所以我的问题是,有没有办法让这个过程更轻?
所以这里是代码:
Private Sub UserForm_Initialize()
Set tsheet = ThisWorkbook.Sheets("Players")
Dim v As Variant, i As Long
v = tsheet.Range("A2:l" & Worksheets("Players").Cells(Rows.Count,
1).End(xlUp).Row).Value
With Me.ComboBox1
.RowSource = ""
.ColumnCount = 4
.BoundColumn = 2
.ColumnWidths = "1;50;50;50" 'Hide first column in dropdown
For i = LBound(v) To UBound(v)
.AddItem v(i, 1) & " " & v(i, 2) & " " & v(i, 3)
.List(.ListCount - 1, 1) = v(i, 1)
.List(.ListCount - 1, 2) = v(i, 2)
.List(.ListCount - 1, 3) = v(i, 3)
Next i
End With
With Me.ComboBox2
.RowSource = ""
.ColumnCount = 4
.BoundColumn = 2
.ColumnWidths = "1;50;50;50" 'Hide first column in dropdown
For i = LBound(v) To UBound(v)
.AddItem v(i, 1) & " " & v(i, 2) & " " & v(i, 3)
.List(.ListCount - 1, 1) = v(i, 1)
.List(.ListCount - 1, 2) = v(i, 2)
.List(.ListCount - 1, 3) = v(i, 3)
Next i
End With
此代码的推移,直到它击中combox40
我的旧代码是工作非常快,但它不具备这是串联列
ComboBox3.ColumnWidths = "50;50;50" 'COLUMN WITH OF LISTBOX
ComboBox3.ColumnCount = 3
'COLUMN NUMBER OF LISTBOX
ComboBox3.List = tsheet.Range("A2:l" &
Worksheets("Players").Cells(Rows.Count, 1).End(xlUp).Row).Value
而不是
ComboBox3.List = tsheet.Range("A2:l" &
Worksheets("Players").Cells(Rows.Count, 1).End(xlUp).Row).Value
使用像这样(声明编曲为Variant): -
Arr = tsheet.Range("A2:l" &
Worksheets("Players").Cells(Rows.Count, 1).End(xlUp).Row).Value
' add your extra rows to the array here, followed by
ComboBox3.List = Arr
相反重复相同的码的40倍的,创建一个循环。
For i = 1 to 40
Cbx = Me.Controls("ComboBox" & Cstr(i))
' then manipulate Cbx as you have done.
Next I
最后,由于你的40个组合框都是一样的,为什么不只用1做呢?您可以将它从一行移动到另一行,让用户进行选择,然后将该选择转移到在退出时出现在Cbx位置的文本框。当再次单击Tbx时,它将被Cbx替代,以便您可以再次访问该列表。
嗨Variatus感谢您的意见。如果我理解你是正确的,我不确定那:)然后这是不可能的,因为没有文本框只有下拉,当我说textfield我的意思是组合框的文本框的原因我其中有40个是因为当用户选择其中的所有内容并按下保存按钮时,所有这些combox的文本字段将被传输到表单中。 userform是这样的:它是一个高尔夫开始表,意思是所有的组合框都有一个列表,所有的玩家然后他选择每个开始位置的玩家,因此40 Cbx – Anker
但thx代码上面我会看看如果我可以得到那个工作我很有道理,使它像thx花时间来帮助队友;)我真的不知道如何使这个循环combobox – Anker
如果你有一个相同大小的Tbx和Cbx完全相同的位置上面的所有用户都可以看到或使用。您可能会隐藏其中一个控件以获得更好的测量结果,或者因为Cbx在您需要之前并不真正需要。所以,你有40个Tbx。当用户点击其中的任何一个时,Cbx就会出现在它的位置上。当他在别的地方点击时,Cbx的结果被转移到它下面的Tbx中,并且Cbx或者消失或者重新出现在用户点击的Tbx位置。 – Variatus
使用ComboBox控件
Option Explicit
Private Sub UserForm_Initialize()
Dim tsheet As Worksheet
Set tsheet = ThisWorkbook.Sheets("Players")
Dim rs As String
rs = "Players!a2:d" & tsheet.Cells(tsheet.Rows.Count, 1).End(xlUp).Row
Dim aaa As Control
For Each aaa In Me.Controls
If Left(aaa.Name, 8) = "ComboBox" Then
aaa.RowSource = rs ' =mySheet!a2:d24 in properties
aaa.ControlSource = "Players!z1" ' put the chosen value into this cell (example)
aaa.ColumnCount = 4
aaa.BoundColumn = 2
aaa.ColumnWidths = "1;50;50;50" ' Hide first column in dropdown
End If
Next aaa
End Sub
的RowSource
财产在模块:
Dim ArrPlayers() as integer
在用户窗体初始化:
'To Do: add code to populate listbox with players
ReDim ArrPlayers (0 To 39)
在列表框更改事件:
txtPosition.text = ArrPlayers(lstPlayers.ListIndex)
在文本框更改事件:
ArrPlayers(lstPlayers.ListIndex) = cInt(txtPosition.text)
您需要,然后保存的值。
没有定义'tsheet'然后在代码中使用'Worksheets(“Players”)'....使用'tsheet' – jsotola
没有必要定义'.RowSource''.ColumnCount''.BoundColumn'运行时的'.ColumnWidths'属性....这些值与工作簿一起保存....将它们设置为一个单独的子程序,只运行一次,然后保存该工作簿。如果您想对这些值进行任何更改,请重新运行子文件 – jsotola