2017-06-19 65 views
0

我認爲這並不複雜,但是作爲VBA新手,在Google和Google玩了幾天之後,我一直無法找到答案不同的代碼。Excel VBA - 從可變數量的用戶表單複選框創建數組

我有一個宏:

  1. 打開一個文件中的任何文件夾路徑被命名爲
  2. 搜索特定的文本文件中查找特定部分的開始,即A100
  3. 發現本節的結尾,即A110(根據文件長度可變)
  4. 將此範圍內的單元格複製並粘貼到另一個特定範圍,即O1:O10
  5. 使用複選框填充用戶窗體在這個新的可變長度範圍

每個小區我現在需要用戶點擊他們想要的複選框,然後這些複選框字幕保存爲一個數組,然後我就可以在後面的宏呼籲。

也就是說,如果他們點擊狗,貓,鳥和從複選框,輸出會因爲範圍和複選框數量的可變長度的狗,貓,鳥

,我想不通如何讓它循環遍歷每一個並連接正確的值。

我認爲有可能是一種方法,切出的值複製粘貼也與填充用戶窗體,但是這是我能想出給出的範圍的可變長度部分的唯一途徑。

以下是在粘貼範圍後生成用戶窗體的代碼。

Private Sub UserForm_Initialize() 

Dim curColumn As Long 
Dim i   As Long 
Dim codeRow  As Long 
Dim chkBox  As msforms.CheckBox 

curColumn = 15 
codeRow = Range("O20").End(xlUp).Row 

For i = 1 To codeRow 
Set chkBox = Me.Controls.Add("Forms.CheckBox.1", "CheckBox_" & i) 
chkBox.Caption = Worksheets(1).Cells(i, curColumn).Value 
chkBox.Left = 5 
chkBox.Top = 5 + ((i - 1) * 20) 
Next i 

End Sub 
+1

ListBox控件可以有複選框https://stackoverflow.com/questions/10944064/change-individual-listbox-item-font-in -excel – Slai

+0

您可以隨時迭代Me.Controls集合並檢查控件的類型/名稱......但是,當然,整潔的解決方案是列表框,具有以下設計時屬性:'MultiSelect = 1','ListStyle = 1',並在運行時,將'RowSource'屬性設置爲您的'Range(「O1:O」&coderow)' –

+0

謝謝!完美工作。將在下面發佈更新的代碼。 –

回答

0

插入模塊代碼。

Public vCheck() 

波紋管形式的代碼。

Private Sub UserForm_Initialize() 

Dim curColumn As Long 
Dim i   As Long 
Dim codeRow  As Long 
Dim chkBox  As msforms.CheckBox 

curColumn = 15 
codeRow = Range("O20").End(xlUp).Row 

ReDim vCheck(0) 
For i = 1 To codeRow 
Set chkBox = Me.Controls.Add("Forms.CheckBox.1", "CheckBox_" & i) 

ReDim Preserve vCheck(1 to i) 
vCheck(i) = Worksheets(1).Cells(i, curColumn).Value 
chkBox.Caption = vCheck(i) 
chkBox.Left = 5 
chkBox.Top = 5 + ((i - 1) * 20) 
Next i 

End Sub 
0

Listbox是要走的路。這裏是爲他人尋求幫助,同樣的問題,更新後的代碼:

Private Sub UserForm_Initialize() 

Dim myLBox  As msforms.ListBox 
Dim codeRow As Long 
codeRow = Range("O20").End(xlUp).Row 

ListBox1.RowSource = "O1:O" & codeRow 

End Sub 

Private Sub CommandButton1_Click() 
Dim rRange As Range 
Dim lCount As Long 'Counter 

On Error GoTo ErrorHandle 

Set rRange = Range("P1") 

With ListBox1 
    For lCount = 0 To .ListCount - 1 
     If .Selected(lCount) = True Then 
     rRange.Offset(lCount, 0).Value = .List(lCount) 
     End If 
    Next 
End With 

BeforeExit: 
Set rRange = Nothing 
Unload Me 

Exit Sub 
ErrorHandle: 
MsgBox Err.Description 
Resume BeforeExit 
End Sub