うちのカレーにはこれが入ってる!って食材ありますか?

チェックボックスはフォームコントロールとActiveXコントロールにも両方あると思います。
ActiveXコントロールであればVBAにてイベントプロシジャーに記載したり、プロパティ値を設定可能なのですが
①フォームコントロールではクリックイベント等どこに記述可能なのでしょうか?
②他のオブジェクト(例えばコマンドボタン)等のイベントでフォームコントロール(チェックボックス)のValue値の変更は可能なのでしょうか?
③ActiveXコントロールのチェックボックスであれば、例えばシートに張り付けた場合、チェックボックスオブジェクトはシートオブジェクトの直下にきます。
フォームコントロールで埋め込んだチェックボックスはどの直下になるのでしょう?(アプリケーション?ブック?シート?それ以外?)
④上記①②が不可能の場合、ActiveXコントロールのチェックボックスとフォームコントロールのチェックボックスは見た目が異なりますが(ActiveXコントロールの方は影がついて立体的に見える。
まず、チェックボックスのこの影の部分はSpecialEffectプロバティを0(fmButtonEffectFlat)に置き換えれば消えますが、フォームコントロールのチェックボックスと比べ線の太さが異なります。ActiveXコントロールのチェックボックスの□の線の太さをフォームコントロールのチェックボックスの□の線の太さと同じくらいに変更って可能(どこのプロバティ)なのでしょうか?

A 回答 (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(袋小路) に入り込んでしまっています。
    • good
    • 0
この回答へのお礼

貴重なご意見ありがとうございました。VBAの考え方等とても勉強になりました。ベストアンサーとさせていただきます。

お礼日時:2017/08/06 17:45

こんばんは。



>やはり標準モジュールなのですね。
標準モジュールを使うのは、あくまでも、省スペース・省コードのためです。
例えば、Sheet1 で使って、Sheet2 で使う時に、標準モジュールのコードは共有できます。
また、コントロール配列があるのは、フォームコントロールのみで、ActiveX では、擬似的にクラスで作るだけです。しかし、そのために、コードが煩雑になったりするのなら、何のためにするのか、ということになりかねません。

クラスモジュールを使うというと、かなり凝った作りになるけれども、VBAには、Win APIやリボンのCallBack など、いろいろな使い方があると思うし、そういう場合は、標準モジュールを使わざるを得ないと思うのです。

それと、それをコードを読む側になると、クラスからですと、地続きになっていればまだ救われますが、ペインが、バラバラになっているので、他人からはさっぱり何を書いているのか分からないです。Git で、VBAコードを出している人が、そういうコードの作りをしていました。途中で、コードを読むのは諦めました。

ところで、そんなテクニックをどこで覚えましたか?
時々、旧VB6のユーザーなどで、クラスをつかって全部を書く人はいるけれども、私は、そこまではしません。Excel VBAのみでは、ほとんど出てこないはずです。
    • good
    • 0
この回答へのお礼

自分は会社内のプログラム部門にいたことがあったので、そこでExcelVBAは書籍で覚えました。(10年くらい前なので、まだ会社内にExcel使いこなす人がなく、独学で覚えましたね。本何冊も買って・・・)その際、外部講師の研修を会社が斡旋してくれたのでその際に見つけたのはVBのクラスモジュール作成の講習でした。
そのときクラスモジュールの作成方法の基本を教えてもらったのですが、その記述が、VBAのオブジェクトモデル構成と同じだったため、覚えやすかったです。

自分も、基本シートモジュール等にはあまりステートメントは記述しません。イベントプロシジャーを記述したら、基本Dimでクラスモジュールを定義し、実際の処理はクラスモジュール側に書き込みます。標準モジュールの代わりに汎用クラスモジュールを使用しているといった方がいいかもしれません。

標準モジュールですと、シートモジュール側(呼び出す側)で標準モジュールのプロシジャーを呼び出すのですが、複数標準モジュールを作成した際、どこの標準モジュールに記載しているのかプログラムでわからないため、クラスモジュールならDimでクラスモジュールを定義するため、どこに飛ぶのかわかるのが便利です。また、標準モジュールですと、共通で使う変数は全体におよびますから、管理が大変になるのでその点クラスモジュールならそのクラスモジュール内ですし、それを他のモジュールで使用する場合はプロパティ化すればいいですからね。


基本、FunctionプロシジャーやSubプロシジャーはそこに記述したモジュールのメソッドにあたり、Functionプロシジャーは一つの結果しか出さないけど、処理した結果、複数の結果を求めたい場合はProperty Let,Get,Setを利用すればできるんだとか、イベントをクラスモジュール側にもってこれば、わざわざ各シートにイベントを何回も記述しなくても、同じ動作なら、シートを読み込んだときにそのイベント対象のオブジェクトをプロパティにセットすれば省略できるね。とか、自分プログラムを作成するとき、基本処理別に区別していく方なのでクラスモジュールを覚えたときには便利でしかたなかったです。

お礼日時:2017/08/06 01:57

こんにちは。



>チェックボックスはフォームコントロールと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 コントロールの主要なオブジェクトは、頻繁にトラブルを起こして、ただのオブジェクトに変わってしまう(抜けと言っています)ので、基本的にはもう使いません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはり標準モジュールなのですね。
自分は標準モジュールに記載するのはあまり好きではありません。
基本的にオブジェクトは上位オブジェクトに帰属し、イベントはその上位オブジェクト内に記述し、プログラムは基本クラスモジュール単位で記述することにしているからです。(基本VBEを見るだけで個別にプログラムがどこで行われているかわかるようにしています)
例えば、汎用のクラスモジュールを作成、そこにイベントプロシジャーやメソッド、それを利用するオブジェクトの器をプロパティに設定しておけば、そのクラスモジュールを定義し、NEWでインスタンスを作成、そのメソッドを呼び出すこととしたり、WithEventで定義しておけば、イベントだってクラスモジュールに記載し、そのクラスモジュールをDimで宣言し、そのクラスモジュールのプロパティに対象オブジェクトをSETすればいいだけですし、個別に設定する部分はRaiseEventで指定しますしね。

そういう意味ではフォームコントロールってたとえばシートに作成したとすれば、「え?シートに作成したんだから、シートオブジェクトの直下にあるんじゃないの?作成したシートのクラスモジュールのメンバーじゃないの?」と、とまどうのです。

自分は標準モジュールってエクセルの場合、関数定義しか使っていませんね。それもほとんどクラスモジュールを定義して、NEWでインスタンスを作成、実際の処理はそのクラスモジュールのメソッドが行ってます。

お礼日時:2017/08/06 00:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報