2016-07-27 1 views
-1

ループとして以下をどのように作成しますか。シート上のループスルーチェックボックス

基本的にループへの最初のリストはselectStatus、selectSite、これらはシート上のチェックボックスあるだろう。 (下のコードには2つしか含まれていませんが、完全なマクロには約60のループがあります)

2番目のループは "Header 1"、 "Header 2"などの値になります。最初のものはチェックボックス名で、2番目は対応するSQLヘッダーで、最後に文字列を作成します。

Sub TEST2() 

    If Sheets("controlSheet").selectStatus.Value = True Then 
    a = "Header 1, " 
    Else 
    a = "" 
    End If 

    If Sheets("controlSheet").selectSite.Value = True Then 
    a = a + "Header 2, " 
    Else 
    a = a + "" 
    End If 

    End Sub 
+2

申し訳として暗いoDictHeadersに、私はあなたが少しさらに、この、特にあなたのコードを詳しく説明しなければならないと思います。それはかなり不明です(私には少なくとも)。 –

+0

私はTomに同意します。私はあなたが何をしているのか理解できません。あなたは何をループするのですか? –

+0

ああ、私は今理解していると思う。チェックボックスには60個の異なる名前があり、これらのうちどれがチェックされているかに応じて、 '' Header X、 ''で 'a 'を追加したいとします。そして、すべてのチェックボックスをループするには、ループが必要です。 –

答えて

1

ここで、コントロール名とヘッダー名の間のマッピングのリストを保持するオブジェクトを作成できるヘッダーが1つあります。質問があれば教えてください。

オブジェクト

Function GetHeaders() As Object 
    If oDictHeaders Is Nothing Then 
     Set oDictHeaders = CreateObject("Scripting.Dictionary") 

     oDictHeaders("SelectSite") = "Header 1" 
     oDictHeaders("SelectStatus") = "Header 2" 
     oDictHeaders("SelectOther") = "Header 3" 
    End If 

    Set GetHeaders = oDictHeaders 
End Function 


Function GetListOfHeaders() As String 
    Dim sOutput As String 
    Dim oDict As Object 
    Dim ctl As Object 

    sOutput = "" 

    Set oDict = GetHeaders() 

    For Each ctl In Sheet1.OLEObjects 
    Debug.Print TypeName(ctl.Object) 
     If TypeName(ctl.Object) = "CheckBox" Then 
      If ctl.Object.Value = True Then 
       sOutput = sOutput & ", " & oDict(ctl.Name) 
      End If 
     End If 
    Next ctl 

    GetListOfHeaders = Mid(sOutput, 2) 
End Function 

Sub Test() 
    MsgBox (GetListOfHeaders()) 
End Sub 
+0

これは完璧に動作します!ありがとうございました。将来的には、SQLテーブルからそれらをまっすぐに引っ張っていくのが楽しみです。 もう一度ありがとう! –

+0

@LawrenceFerguson喜んで私は助けることができました。他のユーザーがそれが閉じられていることを知るように、質問に回答としてマークを付けてください。ソリューションを連鎖させることができます。 SQLテーブルから取得されたキーと値のペアを使用して、ディクショナリオブジェクトにデータを取り込むことができます。これにより、新しいチェックボックス/フィルタを追加しても、コードを修正するためにVBAに入る必要がなくなる、よりダイナミックなソリューションが可能になります。ワークブックに新しいチェックボックスを追加するだけで、マッピングを格納しているSQLテーブルに対応する行を追加することができます。 – user3561813

1

これは、ActiveXチェックボックスを処理する必要があります。

注:これが(つまり、インデックスによって最初 1は、「ヘッダ1」、「ヘッダ2」と第二、ヘッダー」とN番目に対応させていただきますあなたのチェックボックスが正しくインデックス付けされている必要がありn "など)。それらが故障している場合は、それを制御する追加のロジックが必要です(その場合はthe other answer for a good solutionを参照)。

Option Explicit 
Sub LoopActiveXCheckBoxes() 

Dim ws As Worksheet 
Dim obj As OLEObject 
Dim cb As CheckBox 
Dim i As Long 
Dim a As String 

Set ws = Sheets("controlSheet") 
For Each obj In ws.OLEObjects 
    If TypeName(obj.Object) = "CheckBox" Then 
     i = i + 1 
     If obj.Object.Value = True Then 
      a = a & "Header " & CStr(i) & "," 
     End If 
    End If 
Next 
If Len(a) > 0 Then a = Left(a, Len(a) - 1) 

End Sub 

フォームコントロールのチェックボックスの場合、これは機能しますが、私はあなたがActiveXを使用していると確信しています。

Sub LoopCheckBoxes() 

Dim ws As Worksheet 
Dim cb As CheckBox 
Dim i As Long 
Dim a As String 

Set ws = Sheets("controlSheet") 
For Each cb In ws.CheckBoxes 
    i = i + 1 
    If cb.Value = 1 Then 
     a = a & "Header " & CStr(i) & "," 
    End If 
Next 
If Len(a) > 0 Then a = Left(a, Len(a) - 1) 

End Sub 
+0

こんにちは、私はあなたが私が何をしようとしていると思う、私はそれについては非常に明確ではなかった!ヘッダー1,2,3、nなどの代わりに、それは単なる例でした。各ヘッダーはBLBINL、BLBCOD、BLWARC ...のようになります。基本的にSQLテーブルのヘッダーです。 はい、私は論理的な順序でそれらを持つことを計画しましたので、selectSiteが最初にリストにあり、対応するヘッダー "BLBCOD"が第2リストの最初になります。 –

+0

あなたの実際の問題を代表する例を提供していない場合は、このような答えを得て、実際に問題を解決するわけではありません。マッピングを実装する必要がある場合は、[その他の回答](http://stackoverflow.com/a/38617888/1467082)を使用します。 –

+0

また、SQLのヘッダーを配列に読み込んで、ヘッダー "&...'文字列をハードコーディングする代わりに索引付けすることもできます。 –

関連する問題