[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『CheckBoxをクリックすると動くマクロ』(TEST)
こんばんは。 さっそくですが、マクロについて教えて下さい。
シート1に100を超える項目の日毎の集計データがあります。 シート2にコマンドボタンと項目ごとのチェックボックスを作り、(両方ともコントロールツールボックスのものです) 抽出したい期間の日付を入力し、抽出したい項目にチェックを入れて コマンドボタンを押すと、チェックボックスにチェックが入っている項目の指定した期間のデータを シート3に抽出するようにしています。
この動きをするマクロ自体は出来たのですが、 チェックボックスの数が多いため、チェックしているチェックボックスの文字の色を変えて 解りやすくしたいです。
Private Sub CheckBox1_Click() If CheckBox1.Value = True Then CheckBox1.ForeColor = &HFF& Else CheckBox1.ForeColor = &H0& End If End Sub
Private Sub CheckBox2_Click() ・ ・ と延々と書けば良いんでしょうが、何かうまい方法がないかと思い質問させて頂きました。
もう一つコマンドボタンを作って Private Sub CommandButton2_Click() Dim i As Long For i = 1 To 109 If ActiveSheet.OLEObjects("CheckBox" & i).Object.Value = True Then ActiveSheet.OLEObjects("CheckBox" & i).Object.ForeColor = &HFF& Else ActiveSheet.OLEObjects("CheckBox" & i).Object.ForeColor = &H0& End If Next i End Sub
としても動くことは確認できましたが、出来ればチェックボックスを押した時点で色付けをしたいです。
良い方法があればご指導下さい。
これは、経験上ですが、 100個超えるコントロールの配置という仕様に至った場合、一度、仕様を見直してください。 (他に方法があるんじゃないか?って) 勿論、それでもこの仕様しかない という結論になる場合もありますけどね!!
リストボックスで複数のメンバ選択を可能にする方法で対処できませんか? 新規ブックにて試してください。 標準モジュールに
'================================================================================== Sub sample() With Range("a1:a26") .Formula = "=char(64+row())" .Value = .Value End With With ActiveSheet.OLEObjects.Add(ClassType:="Forms.ListBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=215.25, Top:=39.75, Width:=365.25, Height _ :=437.25) .Object.MultiSelect = 1 .Object.ListStyle = 1 .ListFillRange = "=a1:z26" .Visible = False DoEvents .Visible = True End With End Sub
上記コードを実行して作成されたリストボックスの項目(A〜Z)を選択して下さい。 複数選択が可能ですし、チェックボックスもあるので、おおよそ同じことが出来ます。 選択されたものがどの項目なのかは、Selected プロパティで確認できます。 詳しくは、Helpを参照してください。
因みにチェックボックスの数がもっと少ない場合、
ここで記述したようなクラスモジュールをシートのコントロール用にアレンジする方法もありますが、 シートの場合は、ちょっとしたことで、内部の変数が初期化されてしまうことがあるので、要注意です。
この場合、私ならコマンドバー「コントロールツールボックス」のチェックボックスではなく、 コマンドバー「フォーム」のチェックボックスを使います。 これだとApplication.Callerというプロパティでどのチェックボックスをチェックしたかが確認できます。
TESTさんが記述された内容からですと、最初に書いたリストボックスの使用がよいと思いますが、 検討してみてください。
追伸
非常に質問内容がわかりやすい記述だと思います (やりたいことの概略仕様の記述、コードの提示、更に希望とは違うが、御自分が書けるコードの提示)。 こういう方は、きっと仕上がったプログラムの仕様書(マニュアル)もわかりやすいものを作るんだろうなあ と勝手に思ってしまいました。
ichinose
レスありがとうございます。 異動で引越したばかりで自宅にネット環境がないもので、返事が遅れてすみません。
>追伸 とんでもないです。 まだまだ勉強中で知らないことばかりでした。 あと、前日に同様の質問があったようで、検索不足ですみませんでした。
本題に移って、教えて頂いたことをやってみました。 チェックボックスでは シート3に抽出するときに、シート2でチェックしたチェックボックスのCaptionを シート1の項目から探してデータがあるセルを認識させていたんですが、
リストボックスでは Selectedプロパティで選択している項目(番号)が解るので、 そこからListプロパティで選択している項目(文字)を認識させれば 今作っているコードをほとんど変えずに抽出マクロも動きました。 色は勝手に変わってくれますし良いですね。
フォームのチェックボックスでも 教えていただいたCallerのヘルプに、チェックボックスをクリックした時に そのオブジェクト名を認識する方法があったので、 それを基に、クリックするだけでチェックボックスの色を変えるようにできました。
リンク先のClassモジュールについては 上に書いたようなことでも調べながらやっているレベルでして、正直今の自分には難しく せっかく提示して頂きましたが今回は試せていません。
おかげさまで抽出しようとしている項目を解りやすくするという目的をクリアできました。 それで、リストボックスとフォームのチェックボックスどちらにするかなんですが、 個人的な見た目上の好みで申し訳ないですが、フォームのチェックボックスの方が好きです。 100個超えるコントロールの配置は辞めたほうが良いとのことですが、 どういう問題があるのでしょうか? ファイルが壊れる可能性が大きくなるというようなことであれば リストボックスにしようかと思っています。
(TEST)
>100個超えるコントロールの配置は辞めたほうが良いとのことですが、 私は、あまりシートをユーザーに触らせるようなプログラムは仕事では書かなくなってしまったのですが、 (もっともコードを書くのは私ではないのですが)、 ユーザーフォームでは私の拙い経験では、まだ100個を超えるようなコントロールの配置というのは経験がありません。
当初案では何度か100個を超える場合があっても、仕様決定の過程でもっとコントロールの使用が少ない 仕様に変更されています。 私が申し上げたかったのは、100個を超えるようなコントロールの配置になった場合、 一度仕様を見直してみたらいかがですか? ということで止めなさい ということではありません。 100個程度なら、今のPCのリソースなら、問題はないと思いますが、それでも見直してみてください。
今回のようにリストボックスを使うという案が出てくるかも知れません。 それでも
>見た目上の好みで申し訳ないですが、フォームのチェックボックスの方が好きです。
見た目の分かりやすさも仕様決定の重要な要素ですよね? 再検討の結果の結論なら、それでよいと思いますよ!!
他にもVBAのばあいなら、 一つのプロシジャーの行数が一画面に収まらない場合は、コードを一度見直しています。 どこかに無駄なコードがないか、プロシジャー分割しなければならない箇所を見過ごしていないか? 等です。この場合も見直した結果、どうしても一画面に収まらない場合はありますけどね?
なんていう指標を自分なりに持っています (これは、私が以前勤務していたソフト会社で代々受け継がれていたことです)。
これらは、今も私の一つの目安になっています。参考になればと思い、記述しました。
ichinose
ご返答ありがとうございます。 良い勉強になりました。
コントロールの数が多いと、何となく漠然とですけど良くはないんだろうなとは思っていましたが、 プロシジャーの行数は気にしてなかったです。 今回のファイルにも今回質問させて頂いた内容とは別に シート1にデータを集計するマクロがあるんですが、それなんかは5画面分くらいあります。 >どこかに無駄なコードがないか、プロシジャー分割しなければならない箇所を見過ごしていないか? こういう視点から見直してみたいと思います。 もっと簡潔に出来ないかと色々な方法を考えながら作業をするのは勉強になりそうですしね。
GW中なのにありがとうございました。
(TEST)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.