2017-09-24 1 views
1

현재 동일한 목록이있는 40 개의 콤보 상자가있는 userform을 만드는 중입니다. 내 문제는 콤보 상자가 가득 채워서 userform.show을 느리게 만듭니다. 이러한 콤보 상자에 채워지는 목록은 매우 긴 목록 (46542 개의 행과 목록 길이가 다를 수 있음)이며 목록은 3 개의 열로 구성됩니다.여러 콤보 상자를 채우면 VBA 사용자 폼이 느려집니다.

나는 전체 목록을 CONCATENATE로 바보짓을하고 있지만 그다지 변화를주지는 않습니다. 또한 내가 콤보 박스에서 선택할 때 값을 가질 필요가 있기 때문에 콤보 박스의 모든 3 개의 열과 함께 행 번호를 선택할 때 함께 할 수 있습니다. combobox에서 1 대신에 comboxbox 텍스트 필드에 1을 쓰면 모든 3 열을 반환하므로 실제로 첫 열이 CONCATENATE이고 드롭 다운에 숨겨진 열이 4 개 있다는 것을 의미합니다.

제 궁금한 점은 프로세스를 더 가볍게 만드는 방법이 있습니까? 그래서 여기

코드입니다 : 그것은 combox40

내 예전의 코드가 꽤 빨리 일하고 충돌하지만이 연결된 된 열을하지 않았다까지

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 

이 코드는 계속

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 속성 .... 이러한 값은 통합 문서와 함께 저장됩니다 ....워크 북을 한 번만 실행 한 다음 통합 문서를 저장하는 별도의 서브 루틴에 설정하십시오. 그 값을 변경하고 싶다면 sub를 다시 실행하십시오. – jsotola

답변

3

대신

ComboBox3.List = tsheet.Range("A2:l" & 
Worksheets("Players").Cells(Rows.Count, 1).End(xlUp).Row).Value 
이 같은

사용 무언가 (변형으로 ARR 선언) : -

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 on Exit에 나타나는 텍스트 상자로 전송하도록 할 수 있습니다. Tbx를 다시 클릭하면 목록에 다시 액세스 할 수 있도록 Cbx로 대체됩니다. 정의 폼 초기화에서

Dim ArrPlayers() as integer 

:리스트 박스 변경 이벤트

'To Do: add code to populate listbox with players 
ReDim ArrPlayers (0 To 39) 

:

+0

안녕하세요 Variatus가 입력 해 주셔서 감사합니다. 만약 내가 당신을 이해하고 나는 그다지 확신 할 수 없다 : 그렇다면 텍스트 박스가 없기 때문에 움직일 수 없다. 단지 드롭 다운이 있고 텍스트 필드를 말할 때 나는 콤보 박스의 텍스트 필드를 의미한다. 사용자가 모두를 선택하고 저장 버튼을 누르면 combox의 텍스트 필드가 시트로 전송되기 때문에 40 개가 있습니다. userform은 다음과 같습니다 : 골프 콤파스의 시작 시트 - 모든 콤보 박스는 모든 선수와리스트를 가지고 있습니다. 따라서 선수는 각 시작 위치에 따라 선수를 선택합니다. 따라서 40 Cbx – Anker

+0

위의 코드에서 thx를 볼 수 있습니다. 일하는 나는 그것을 돕는 시간을내어 그 thx처럼 그것을 만들기 위해 좋은 의미가 있습니다.) 정말 combobox에 대한 루프를 만드는 방법을 잘 모르겠다 – Anker

+0

Tbx와 똑같은 크기의 Cbx가 정확히 같은 위치에 있다면 상단에있는 하나는 모든 사용자가 보거나 사용할 수 있습니다. 당신은 좋은 측정을 위해 컨트롤 중 하나를 숨기거나 필요할 때까지 Cbx가 실제로 필요하지 않기 때문에. 40 Tbx가 있습니다. 사용자가 그 중 하나를 클릭하면 Cbx가 그 자리에 나타납니다. 그가 다른 곳을 클릭하면 Cbx의 결과가 Tbx로 전송되고 사용자가 클릭 한 Tbx 대신 Cbx가 사라지거나 다시 나타납니다. – Variatus

1

모듈에서는 콤보 제어

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 속성을 사용

텍스트 상자 변경 이벤트에 1,363,210
txtPosition.text = ArrPlayers(lstPlayers.ListIndex) 

:

ArrPlayers(lstPlayers.ListIndex) = cInt(txtPosition.text) 

그런 다음 값을 저장해야합니다.

관련 문제