2017-06-19 117 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