2017-08-20 7 views
1

何らかの理由で、ワークシートのフォームコントロールのチェックボックスをループしてVBAコードをループさせて、「すべて選択」チェックボックスを表示できません。何であったかExcelのVBA - ループのフォームコントロールのチェックボックスが機能しない

Sub SelectAll_Click() 

Dim CB As Shape 
Dim sh As Worksheet 

Set sh = ActiveSheet 
For Each CB In sh.Shapes 
    If CB.Type = msoFormControl Then 
    If CB.FormControlType = xlCheckBox Then 
     MsgBox CB.Name, vbOKOnly 
     If CB.Name <> Application.ActiveSheet.CheckBoxes("cbSiteAll").Name Then 
     CB.Value = Application.ActiveSheet.CheckBoxes("cbSiteAll").Value 
     MsgBox xCheckBox.Name & ": " & xCheckBox.Value, vbOKOnly 
     End If 
    End If 
    End If 
Next CB 
End Sub 

メッセージボックスは、私がしようとするために入力してデバッグ:

方法1:

Sub SelectAll_Click() 

Dim CB As CheckBox 
For Each CB In ActiveSheet.CheckBoxes 
    If CB.Name = ActiveSheet.CheckBoxes("cbSiteAll").Name Then 
    MsgBox CB.Name & ": " & CB.Value, vbOKOnly 
    CB.Value = ActiveSheet.CheckBoxes("cbSiteAll").Value 
    Else 
    MsgBox CB.Name & ": " & CB.Value, vbOKOnly 
    End If 
Next CB 
End Sub 

方法2私はおそらくこれを行うことで動作し、次の2種類の方法に出くわしましたハプニング。上記の両方の場合、ループが始まりますが、私が得るメッセージボックスは、マクロを割り当てたボックスに関連しています。チェックボックスのチェックは、ループが少なくともチェックボックスのチェックを付けた項目を認識したとしても、チェックボックスのチェックは機能しますが、チェックボックスとしてループしているようには見えません。

上記を踏まえて、私はこの特定の問題に対処する答えを探し、無駄に自分自身に論理を働かせるためにかなりの時間を費やしました。悲しいかな、私は彼らが助けることができるかどうかを確認するためにインターネットに渡します。

ありがとうございました。

+0

方法2が動作しますおそらく変更を(自分のサブルーチン名から判断) '' cbSiteAll "'を '' SelectAll "'に変更します。私はこれが最も簡単な方法かどうかを知るために頻繁にフォームコントロールを使用しませんが、それが私のために働いたことは分かります。おかげさまで – YowE3K

+0

ループが正しく機能するようになると、私はそのビットに到達します。私のチェックボックスはグループ化されているので、コードはループしていなかった。理由は分かりませんが、私が持っていたループの問題を修正したようです。 – pmc086

+0

メソッド1は、CB.Name = ActiveSheet.CheckBoxes( "cbSiteAll")を変更すると機能します。名前Then'を 'CB.Name <> ActiveSheet.CheckBoxes(" cbSiteAll ")にします。 '' cbSiteAll ''チェックボックスの値を変更するだけです。 – YowE3K

答えて

2

Shapeオブジェクトには、GroupItemsプロパティが含まれています。このプロパティは、まだShapeオブジェクトですが、実際には図形(https://msdn.microsoft.com/VBA/Excel-VBA/articles/shape-groupitems-property-excel)のコレクションです。だから、Shapesのリストを反復すると、「トップレベル」の図形にしかアクセスできません。つまり、グループ化された図形はGroupItemsプロパティでのみアクセスできます。

ループをFor Each...ループに含めるワークシートにグループ化された図形がある場合、1つの解決策は再帰的に繰り返すことです。以下のコードのような何か:あなたはApplication.ActiveSheet.CheckBoxes(CB.Name).Value` `に` CB.Value`を変更し、場合

Option Explicit 

Public Sub RunMe() 
    RecursiveLoop Sheet1.Shapes 
End Sub 

Private Sub RecursiveLoop(col As Object) 
    Dim shp As Shape 

    For Each shp In col 
     If IsGrouped(shp) Then 
      RecursiveLoop shp.GroupItems 
     Else 
      Debug.Print shp.Name 
     End If 
    Next 
End Sub 

Private Function IsGrouped(shp As Shape) As Boolean 
    Dim grp As GroupShapes 

    On Error Resume Next 
    Set grp = shp.GroupItems 
    On Error GoTo 0 

    IsGrouped = (Not grp Is Nothing) 
End Function 
+0

ありがとう!これは今や理にかなっています。上のコードは、グループ化されていないアイテムが存在しないことを知らない場合、そのアイテムを逃すのを防ぐのに適しています。 – pmc086

0

私は、上記の答えにつきましたが、私は残りのチェックボックスをグループ化していました。上記のコードのループでそれらが取り上げられるのを躊躇させました。私はそれらをグループ解除し、すべてのコードが突然動作します。私はなぜVBA/Excelがこれをしているのか分かりませんが、誰かが私が理由を知りたいと説明してもらえるかどうかは分かりません。

ありがとうございました。

関連する問題