[[20110621221532]] 『チェックボックスにチェックがついていたら実行』(koko) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『チェックボックスにチェックがついていたら実行』(koko)
 お世話になります。

 フォームコントロールのチェックボックスをA1〜A3まで配置
チェックボックスのリンクするセルをそれぞれC1、C2、C3に設定
B1〜B3に test1 test2 test3 と文字入力
A列のチェックボックスにチェックをつけて
チェックがついた行のB列に入力されているマクロ名のみ実行したくて
下記のコードを書きました。
うまく動いてくれました。
なので問題がないといえばないのですが、自分のスキルを知って
いるので信用できません。
このコードに問題はないでしょうか?
チェックボックスを使ってマクロ実行のコードの書き方は他にないですか?
指摘箇所がありましたら、宜しくお願い致します。

 Sub test1()
MsgBox "これはtest1です"
End Sub

 Sub test2()
MsgBox "これはtest2です"
End Sub

 Sub test3()
MsgBox "これはtest3です"
End Sub

 Sub test()
Dim i As Integer
For i = 1 To 3
If Range("c" & i).Value = True Then
Application.Run Range("b" & i).Value
End If
Next i
End Sub


 >このコードに問題はないでしょうか?
 問題はないですねえ
 >チェックボックスを使ってマクロ実行のコードの書き方は他にないですか?
 方法は、いくつかあると思います。

 VBAコードで処理するなら、情報をセルに出さずにチェックボックスから
 取得する方法

 新規ブックにて

 標準モジュール(Module1)に

 Sub ready()
    Dim g0 As Long
    Dim r As Range
    With ActiveSheet
       For g0 = 1 To 3
          Set r = Cells(g0, 1)
          With .CheckBoxes.Add(r.Left, r.Top, r.Width, r.Height)
             .Name = "chktest" & g0
             .Caption = "チェック" & g0
          End With
       Next
    End With
 End Sub

 上記Readyを実行してください。

 アクティブシートにチェックボックスが3個作成されます。

 別の標準モジュールに

 Sub test1()
    MsgBox "これはtest1です"
 End Sub
 Sub test2()
    MsgBox "これはtest2です"
 End Sub
 Sub test3()
    MsgBox "これはtest3です"
 End Sub
 Sub test()
    Dim g0 As Integer
    With ActiveSheet
       For g0 = 1 To 3
          With .CheckBoxes("chktest" & g0)
             If .Value = xlOn Then
                Application.Run Replace(.Name, "chk", "")
             End If
          End With
       Next
    End With
 End Sub

 チェックボックスにチェックを入れたり、はずしたりして、testを実行してください。

 これは、チェックボックス自体が持つチェックされたか否かのプロパティを参照し、
 チェックボックスのオブジェクト名と実行するプロシジャー名を
 関連付けた例です。

 どれを使うかは、仕様にもよりますので・・・。

 ichinose


 もたもたレスを書いていたらichinoseさんからパーフェクトなアドバイスがあったので撤回して。
 フォームツールのコントロールは、それを作成した時のシート上のシェープの連番が自動的に付加されて
 たとえば、チェック 5 とか チェック 23 とか、自分のコードの中では指定しにくい名前になる。
 (できあがった チェック 5 とか チェック 23 をコードで個別に指定すれば別だけど)
 でも、この名前はichinoseさんのready()の中で示唆されているように、自分が扱いやすい名前に変更できる。
 かつ、マクロ以外に、以下の手作業によっても可能。

 ・チェックボックスを選択
 ・画面左上の名前ボックスに チェック 5 等が表示される。
 ・名前ボックスをマウスでクリック => 名前が選択状態になる
 ・好きな名前を打ち込みEnter  たとえば 判定Box_1 とか 判定Box_2 とか

 これでマクロの中で、判定Box_○ という名前を指定して処理ができるし、この ○ を
 数値の変数で与えながらループ処理もできる。

 もう1つ、ichinoseさんのコードでは紹介がなかったことを追加で。
 ActiveSheet.CheckBoxes("その名前").TopLeftCell というプロパティがある。
 これは、シート上のチェックボックスの左上隅があるセルのオブジェクト。
 で、そのセルアドレスを、以下のように取得できる。

 MsgBox ActiveSheet.CheckBoxes("判定Box_2").TopLeftCell.Address(False, False)

 以上、ジャスト参考まで。

 ぶらっと立ち寄り


 ichinoseさんへ
 >>このコードに問題はないでしょうか?
 >問題はないですねえ
有難うございます。自信がちょっとだけ増えました。
 >VBAコードで処理するなら、情報をセルに出さずにチェックボックスから
 > 取得する方法
セルに出考さないで処理って出来るんですね。
ちらっとは考えたのですが、どうやっても自分では無理でした。
より完璧に近づいたコードができそうです。
有難うございます。

 ぶらっと立ち寄りさんへ
ちょっと難しかったですが、やっと理解できたような気がします。
>MsgBox ActiveSheet.CheckBoxes("判定Box_2").TopLeftCell.Address(False, False)
これって色々と活用できそうですね。
大変勉強になりました。
有難うございます。
 (koko)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.