2017-06-19 19 views
0

これは私が作っているよりも複雑ではないと思いますが、VBAの初心者であると私は数日間のグーグルグーグルで答えを見つけることができませんでした異なるコード。Excel VBA - 可変数のuserformチェックボックスから配列を作成

  1. は、特定のセクションの開始を見つけるために、ファイル内の特定のテキストのための
  2. 検索を命名されているもののフォルダのパスでファイルを開き、すなわちA100
  3. 見つけた:

    私はマクロを持っていますA110(ファイルに応じて長さが変わる)

  4. この範囲のセルを別の特定の範囲、つまりO1にコピーして貼り付けます。O10
  5. ユーザーフォームにチェックボックスを設定しますこの新しい可変長範囲内の各セルについて

これで、ユーザーは、どのチェックボックスをクリックする必要がありますか、これらのチェックボックスのキャプションは、後でマクロで呼び出すことができる配列として保存する必要があります。彼らは犬、猫、およびチェックボックスから鳥をクリックした場合

すなわち、出力があるので、チェックボックスの範囲と数の可変長の犬、猫、鳥

だろう、私は把握することはできませんそれぞれをループさせて正しい値を連結する方法。

私はおそらく、userformにも値を貼り付けるためのコピー貼り付けを切り捨てる方法があると思いますが、これは範囲の可変長を考慮してその部分を見つけ出す唯一の方法でした。

以下は、コピー貼り付け後にユーザーフォームを生成するコードです。

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

リストボックスでした。ここでは同じ問題で助けを求めて他人のために更新されたコードは次のとおりです。

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 
関連する問題