2017-09-24 96 views
1

目前我正在制作带有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 
+0

没有定义'tsheet'然后在代码中使用'Worksheets(“Players”)'....使用'tsheet' – jsotola

+0

没有必要定义'.RowSource''.ColumnCount''.BoundColumn'运行时的'.ColumnWidths'属性....这些值与工作簿一起保存....将它们设置为一个单独的子程序,只运行一次,然后保存该工作簿。如果您想对这些值进行任何更改,请重新运行子文件 – jsotola

回答

3

而不是

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替代,以便您可以再次访问该列表。

+0

嗨Variatus感谢您的意见。如果我理解你是正确的,我不确定那:)然后这是不可能的,因为没有文本框只有下拉,当我说textfield我的意思是组合框的文本框的原因我其中有40个是因为当用户选择其中的所有内容并按下保存按钮时,所有这些combox的文本字段将被传输到表单中。 userform是这样的:它是一个高尔夫开始表,意思是所有的组合框都有一个列表,所有的玩家然后他选择每个开始位置的玩家,因此40 Cbx – Anker

+0

但thx代码上面我会看看如果我可以得到那个工作我很有道理,使它像thx花时间来帮助队友;)我真的不知道如何使这个循环combobox – Anker

+0

如果你有一个相同大小的Tbx和Cbx完全相同的位置上面的所有用户都可以看到或使用。您可能会隐藏其中一个控件以获得更好的测量结果,或者因为Cbx在您需要之前并不真正需要。所以,你有40个Tbx。当用户点击其中的任何一个时,Cbx就会出现在它的位置上。当他在别的地方点击时,Cbx的结果被转移到它下面的Tbx中,并且Cbx或者消失或者重新出现在用户点击的Tbx位置。 – Variatus

1

使用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 
1

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) 

您需要,然后保存的值。