2017-09-30 5 views
0

シート上のチェックボックスのいずれかをクリックするとコードが実行される方法を見つけようとしています。私は、クラスモジュールを作ることについて話している記事は複数見てきましたが、動かすことはできません。ANYチェックボックスでイベントが発生する

私は列Cに一致するように列Bを設定するコードを持っています。私が手作業でC10に入力するものは、C10が数式:= D9であってもB10に入力されます。したがって、私はD10にTRUEと入力することができ、C10の式はTRUEになり、コードはB10にTRUEを設定します。素晴らしいです...トリックはD10にリンクされたチェックボックスを持つことです。チェックボックスをクリックすると、D10はTRUEと表示され、C10の式はTRUEと表示されますが、それは表示されている限りです。 VBAコードは、チェックボックスのクリックを認識しません。シートをクリックすると(選択変更)、コードが実行されますので、別のイベントが必要です。

イベントを「Checkbox1_Click()」に変更するのは簡単ですが、クリックするとすべてのチェックボックスが機能します。私は検索や異なることを試して何日後に幸運を持っていないよ。ここ

は、私は任意の助けをいただければ幸いこれまで

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
Dim i As Long 


For i = 3 To 11 
    Range("B" & i).Value = Range("c" & i) 
Next i 
    End Sub 

を実行しているコードです。

+0

私は複数のボタンを処理するための掲示いくつかのコードは、あなたのニーズに合わせてそれを適応させることができるかどうかを確認... https://stackoverflow.com/questions/46381935/change-activex- ....ですコマンドボタンの色 - バックカラーの後ろに戻る/ 46396731#46396731 – jsotola

+0

btw:クラスモジュールのコードを実行することができないと言ったが、クラスを参照するコードを投稿しなかったモジュール。 – jsotola

+0

ループを使って値を割り当てているのはなぜですか? "Range(" B3:B11 ")= Range(" c3:c11 ")。値 ' – jsotola

答えて

0

これは

' this goes into sheet code 

Private Sub Worksheet_Activate() 
    activateCheckBoxes 
End Sub 

に動作します。

' put all this code in class a module and name the class module "ChkClass" 

Option Explicit 

Public WithEvents ChkBoxGroup As MSForms.CheckBox 

Private Sub ChkBoxGroup_Change() 
    Debug.Print "ChkBoxGroup_Change" 
End Sub 

Private Sub ChkBoxGroup_Click() 
    Debug.Print "ChkBoxGroup_Click"; vbTab; 
    Debug.Print ChkBoxGroup.Caption; vbTab; ChkBoxGroup.Value 
    ChkBoxGroup.TopLeftCell.Offset(0, 2) = ChkBoxGroup.Value 

End Sub 

。ここ

' this code goes into a module 

Option Explicit 

Dim CheckBoxes() As New ChkClass 
Const numChkBoxes = 20 
' 

Sub doCheckBoxes() 
    makeCheckBoxes 
    activateCheckBoxes 
End Sub 

Sub makeCheckBoxes()  ' creates a column of checkBoxes 

    Dim sht As Worksheet 
    Set sht = ActiveSheet 

    Dim i As Integer 
    For i = 1 To sht.Shapes.Count 
    ' Debug.Print sht.Shapes(1).Properties 
     sht.Shapes(1).Delete 
     DoEvents 
    Next i 

    Dim xSize As Integer: xSize = 2  ' horizontal size (number of cells) 
    Dim ySize As Integer: ySize = 1  ' vertical size 

    Dim t As Range 
    Set t = sht.Range("b2").Resize(ySize, xSize) 

    For i = 1 To numChkBoxes 
     sht.Shapes.AddOLEObject ClassType:="Forms.CheckBox.1", Left:=t.Left, Top:=t.Top, Width:=t.Width - 2, Height:=t.Height 
     DoEvents 
     Set t = t.Offset(ySize) 
    Next i 

End Sub 

Sub activateCheckBoxes()  ' assigns all checkBoxes on worksheet to ChkClass.ChkBoxGroup 

    Dim sht As Worksheet 
    Set sht = ActiveSheet 

    ReDim CheckBoxes(1 To 1) 

    Dim i As Integer 
    For i = 1 To sht.Shapes.Count 

     ReDim Preserve CheckBoxes(1 To i) 
     Set CheckBoxes(i).ChkBoxGroup = sht.Shapes(i).OLEFormat.Object.Object 

    Next i 

End Sub 
+0

ユーレカ!できます!!!!どうもありがとうございます!クラスモジュールの一番下に小さなコードを追加して、チェックボックスのいずれかがクリックされたときにいつでも列Bを列Cに一致させるようにしました。神はあなたを祝福します! – csmith222

+0

私の主な目的のためにこのコードを使って次のステップについてもう一つの質問があります。私はこれを別の質問として投稿し、このページに戻って参考にするべきだと推測しています。 – csmith222

0

すべてのチェックボックスの_Click()イベントに、Worksheet_SelectionChangeイベントを実行することを知らせるだけです。あなたはすべての_Click()サブに次の行を追加する必要がありそうするために:

Call Worksheet_SelectionChange(Range("a1")) 

を、あなたのコードでTargetを使用していないので、SelectionChangeサブに渡されているものの範囲は無関係であることに注意してください。

+0

あなたの努力に感謝しますが、アイデアの一部は、このシートに100を超えるので、各チェックボックスごとにコードを書く必要はありませんでした。思考に私の指が震える!それはいい考えです。私はあなたの答えをアップアップしたいと思いますが、明らかに、他の人が私の投票を受けることができるように、このサイトの評判は十分ではありません。 : -/ – csmith222

関連する問題