チェックボックスはフォームコントロールとActiveXコントロールにも両方あると思います。
ActiveXコントロールであればVBAにてイベントプロシジャーに記載したり、プロパティ値を設定可能なのですが
①フォームコントロールではクリックイベント等どこに記述可能なのでしょうか?
②他のオブジェクト(例えばコマンドボタン)等のイベントでフォームコントロール(チェックボックス)のValue値の変更は可能なのでしょうか?
③ActiveXコントロールのチェックボックスであれば、例えばシートに張り付けた場合、チェックボックスオブジェクトはシートオブジェクトの直下にきます。
フォームコントロールで埋め込んだチェックボックスはどの直下になるのでしょう?(アプリケーション?ブック?シート?それ以外?)
④上記①②が不可能の場合、ActiveXコントロールのチェックボックスとフォームコントロールのチェックボックスは見た目が異なりますが(ActiveXコントロールの方は影がついて立体的に見える。
まず、チェックボックスのこの影の部分はSpecialEffectプロバティを0(fmButtonEffectFlat)に置き換えれば消えますが、フォームコントロールのチェックボックスと比べ線の太さが異なります。ActiveXコントロールのチェックボックスの□の線の太さをフォームコントロールのチェックボックスの□の線の太さと同じくらいに変更って可能(どこのプロバティ)なのでしょうか?
No.3ベストアンサー
- 回答日時:
貴重な返事をありがとうございました。
ある意味では、Excel VBAは特殊・特例だと覚えておいて良いと思います。
理由は、シートモジュール(正式にはオブジェクト・モジュール)が限りなく多いのです。(物理的には、百数十個だと思います)そんな環境下では、クラスでインスタンスを設けるか、もしくは、標準モジュールに書くか、どちらかだと思うのです。しかし、VBAでは、本格的なクラスを使えないのも問題が残ります。
これは、VB(旧VB6含む)にはない環境だからです。例えば、Word VBAになると、ふつう、ThisDocument に入れれば済むことですが、Excelの場合、いちいち、オブジェクトモジュールで、Me やシート名を入れるという手間を忘れると、エラーを起こすことがあるからです。
VBは、VS2005の時に、技術学校に習いに行ったら、クラスは飛び越していましたので、わざわざ、作って講師に見せて上げました。あれから、また再び大きく変わったようです。
さて、もうひとつ書籍の話に触れておくのですが、基本の教科書というのは、97の頃に出た『Office VBA プログラマーズ・ガイダンス』*というのがあるのですが、今は、この本を読んでいる人は皆無に等しいのです。逆引き辞典をお好きではないというのは、なんとなく分かるのですが、今一度、原点を振り返って、この先をどう進めていくのか、今のVBAの全体の流れを見直したほうがよろしいかと思います。私の印象では、だいぶ、まずい状況になっているなって感じています。(*現在は「VBA 開発の基礎知識」という名称のようですが、本にはなっていないようです。)
別項で、Code VBAやRibbon の CallBack のことを書きましたが、事もあろうに、Microsoft 側が、自社外のものを推奨していることと、それが、有償であること、もうひとつ、アジアの言語は、なんとなく蚊帳の外のような気がしてならないのです。特に、日本はガラパゴス化されているようです。日本のマスコミの力が弱いという理由もあるように思います。英語が得意な人でも、なかなか、Microsoft のマニュアルの英文は読みにくいはずです。
まだ、仕事の人生が、十分に残っていらっしゃるようなら、是非、この先の見通しを探ってみたほうがよろしいかと存じます。そういう私は、今は完全に dead end(袋小路) に入り込んでしまっています。
No.2
- 回答日時:
こんばんは。
>やはり標準モジュールなのですね。
標準モジュールを使うのは、あくまでも、省スペース・省コードのためです。
例えば、Sheet1 で使って、Sheet2 で使う時に、標準モジュールのコードは共有できます。
また、コントロール配列があるのは、フォームコントロールのみで、ActiveX では、擬似的にクラスで作るだけです。しかし、そのために、コードが煩雑になったりするのなら、何のためにするのか、ということになりかねません。
クラスモジュールを使うというと、かなり凝った作りになるけれども、VBAには、Win APIやリボンのCallBack など、いろいろな使い方があると思うし、そういう場合は、標準モジュールを使わざるを得ないと思うのです。
それと、それをコードを読む側になると、クラスからですと、地続きになっていればまだ救われますが、ペインが、バラバラになっているので、他人からはさっぱり何を書いているのか分からないです。Git で、VBAコードを出している人が、そういうコードの作りをしていました。途中で、コードを読むのは諦めました。
ところで、そんなテクニックをどこで覚えましたか?
時々、旧VB6のユーザーなどで、クラスをつかって全部を書く人はいるけれども、私は、そこまではしません。Excel VBAのみでは、ほとんど出てこないはずです。
自分は会社内のプログラム部門にいたことがあったので、そこでExcelVBAは書籍で覚えました。(10年くらい前なので、まだ会社内にExcel使いこなす人がなく、独学で覚えましたね。本何冊も買って・・・)その際、外部講師の研修を会社が斡旋してくれたのでその際に見つけたのはVBのクラスモジュール作成の講習でした。
そのときクラスモジュールの作成方法の基本を教えてもらったのですが、その記述が、VBAのオブジェクトモデル構成と同じだったため、覚えやすかったです。
自分も、基本シートモジュール等にはあまりステートメントは記述しません。イベントプロシジャーを記述したら、基本Dimでクラスモジュールを定義し、実際の処理はクラスモジュール側に書き込みます。標準モジュールの代わりに汎用クラスモジュールを使用しているといった方がいいかもしれません。
標準モジュールですと、シートモジュール側(呼び出す側)で標準モジュールのプロシジャーを呼び出すのですが、複数標準モジュールを作成した際、どこの標準モジュールに記載しているのかプログラムでわからないため、クラスモジュールならDimでクラスモジュールを定義するため、どこに飛ぶのかわかるのが便利です。また、標準モジュールですと、共通で使う変数は全体におよびますから、管理が大変になるのでその点クラスモジュールならそのクラスモジュール内ですし、それを他のモジュールで使用する場合はプロパティ化すればいいですからね。
基本、FunctionプロシジャーやSubプロシジャーはそこに記述したモジュールのメソッドにあたり、Functionプロシジャーは一つの結果しか出さないけど、処理した結果、複数の結果を求めたい場合はProperty Let,Get,Setを利用すればできるんだとか、イベントをクラスモジュール側にもってこれば、わざわざ各シートにイベントを何回も記述しなくても、同じ動作なら、シートを読み込んだときにそのイベント対象のオブジェクトをプロパティにセットすれば省略できるね。とか、自分プログラムを作成するとき、基本処理別に区別していく方なのでクラスモジュールを覚えたときには便利でしかたなかったです。
No.1
- 回答日時:
こんにちは。
>チェックボックスはフォームコントロールとActiveXコントロール
まず、私は、Excel 2013ですが、ActiveX は抜けがあるので、フォームコントロールにしてしまっています。
① クリックイベント等
基本的には標準モジュールです。厳密にいうと、そのオブジェクトの、On_Action プロパティに入れることです。VBAの経歴の長い人でも、On_Action プロパティに入れることを知らない人がいます。つまり、対象となるマクロは、そのオブジェクトの On_Acttion のマクロであって、そのオブジェクトを物理的にクリックしたりすることではありません。
②チェックボックスの値(On, Off)の変更
'//ボタンにつけたマクロ
Sub Button1_Click()
With ActiveSheet
If .CheckBoxes(1).Value = xlOn Then
.CheckBoxes(1).Value = xlOff
Else
.CheckBoxes(1).Value = xlOn
End If
End With
End Sub
③フォームコントロールで埋め込んだチェックボックス
>ActiveXコントロールのチェックボックスは、シートオブジェクトの直下
「通称、『シートモジュール』」と言います。
フォームコントロールのチェックボックスは、基本的には、①の通り、標準モジュールです。理由は、省スペースのためです。当該シートモジュールに書いても構いませんが、フォームコントロール用のマクロは、汎用性が高いために、標準モジュールになります。
10個でも、100個でも、一つのマクロで済むことが多いからです。同じことを、ActiveX コントロールのオブジェクトにさせようとすると、とても面倒な手続きが必要です。
その時に使うコマンドが、Application.Caller です。
④ 考え方こともありませんので、わかりません。
ActiveX コントロールの主要なオブジェクトは、頻繁にトラブルを起こして、ただのオブジェクトに変わってしまう(抜けと言っています)ので、基本的にはもう使いません。
ありがとうございます。
やはり標準モジュールなのですね。
自分は標準モジュールに記載するのはあまり好きではありません。
基本的にオブジェクトは上位オブジェクトに帰属し、イベントはその上位オブジェクト内に記述し、プログラムは基本クラスモジュール単位で記述することにしているからです。(基本VBEを見るだけで個別にプログラムがどこで行われているかわかるようにしています)
例えば、汎用のクラスモジュールを作成、そこにイベントプロシジャーやメソッド、それを利用するオブジェクトの器をプロパティに設定しておけば、そのクラスモジュールを定義し、NEWでインスタンスを作成、そのメソッドを呼び出すこととしたり、WithEventで定義しておけば、イベントだってクラスモジュールに記載し、そのクラスモジュールをDimで宣言し、そのクラスモジュールのプロパティに対象オブジェクトをSETすればいいだけですし、個別に設定する部分はRaiseEventで指定しますしね。
そういう意味ではフォームコントロールってたとえばシートに作成したとすれば、「え?シートに作成したんだから、シートオブジェクトの直下にあるんじゃないの?作成したシートのクラスモジュールのメンバーじゃないの?」と、とまどうのです。
自分は標準モジュールってエクセルの場合、関数定義しか使っていませんね。それもほとんどクラスモジュールを定義して、NEWでインスタンスを作成、実際の処理はそのクラスモジュールのメソッドが行ってます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル・VBA CheckBoxのオブ...
-
カメラスクロールするのを動画...
-
ExcelVBAでListViewが使用できない
-
Labelコントロールの(左右)余...
-
EXCELでactivexコントロールを...
-
VBAのフォームでTextBoxがいっ...
-
chr関数の呼び出しで「プロ...
-
C# Form上に配置されたコントロ...
-
Shapeコントロールの.NET移行方法
-
vb.netで画面のコントロールId...
-
VB.NET開発。ラジオボタンとコ...
-
エクセル コントロールツール...
-
ACCESS2010のVBAでフォーム内ク...
-
間違えて配置してしまったコン...
-
VB.NETで複数のTextBoxのTextプ...
-
Winsockのオブジェクトエラー
-
チェックボックスをオンにした...
-
コントロールの絶対位置を取得...
-
フォーム上の現在アクティブな...
-
もしフォームヘッダーにコント...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
ExcelVBAでListViewが使用できない
-
エクセルVBAでオプションボタン...
-
vb.netで画面のコントロールId...
-
C#で角が丸いテキストボックス
-
VBA ユーザーフォームの Keypre...
-
ユーザーフォームで動的(Me.Con...
-
フォーム上の現在アクティブな...
-
Excel VBA で Richtextboxを使...
-
ACCESS2010のVBAでフォーム内ク...
-
Groupboxの配下のコントロール...
-
コントロールを移動できない
-
コンボボックスの文字によるif...
-
(VBA)スピンボタンの大量...
-
Labelコントロールの(左右)余...
-
イメージコントロールに 読み込...
-
間違えて配置してしまったコン...
-
OCXって何ですか?
-
アクセス特有の書き方?
おすすめ情報