| 
    
     |  | ▼そう さん: >ところで、教えていただいた解説の中で OnAction を使用すると各モジュール間の結合度が強くなってしまうことが懸念されるとあるのですが、これはいったいどんな不具合に関わってくるのでしょか?
 
 不具合ねえ・・、
 
 プログラムの構造的な問題ですから、このプログラム作成後の問題です。
 
 
 プログラムのメンテナンスを行うのにそれがしやすい構造になっているか
 
 再利用可能な構造、つまり、他のプログラムで簡単に運用できるような構造になっているか
 
 
 こんな目的のための判断です。
 
 
 >と言うのも、もしなるべく OnAction でプロシージャを呼び出すこと自体(呼び出したいプロシージャがフォームモジュールではなく標準モジュールに置かれていても)避けるべきで、極力呼び出したいプロシージャはフォームモジュール内に置いてイベントプロシージャで処理をした方が安全(?)なのならば、今後もこの教えていただいた書き方を活かして行きたいと思っているのですが・・・・・・。
 
 「OnActionプロパティは使うべきではない」という事ではないですよ!!
 
 今回、問題対象になっているコマンドバー(ポップアップメニュー)を
 標準モジュールで一括管理するようなプログラム構造ならば、
 その中でOnactionプロパティに標準モジュールのプロシジャー名を指定することは
 まったく問題ないと思います。
 
 むしろ、事象によっては、Onactionプロパティの方が、安定した動作が保証されます。
 
 Private WithEvents btn_FirstStringConv As Office.CommandBarButton
 Private WithEvents btn_SecondStringConv As Office.CommandBarButton
 
 これらの変数が何かのタイミングで初期化されてしまうという現象が発見されています。
 (シートやExcelの機能を自由にユーザーが使えるような仕様で その間も上記のような
 イベントを発生させるようなオブジェクト変数の中身をきちんと保持させたい
 場合は、要注意です。
 今回の場合だと、ユーザーフォームがモーダレスで表示するような仕様だと問題が発生する可能性があります。私は、モーダル表示を前提にしての投稿です)
 
 
 が、
 
 今回の場合は、Onactionプロパティに直接ユーザーフォーム内のプロシジャーが
 指定できないので中継役として標準モジュールのプロシジャーを使っているのですよね?
 
 そもそもコマンドバーのボタンクリック時の処理として、
 ユーザーフォーム内のプロシジャーを指定したいということは、このコマンドバーが
 ユーザーフォームと深く関わっているからだと思います。
 (ユーザーフォームが表示されている時だけ、使用可能なコマンドバーで、
 しかもその機能が当該ユーザーフォームに特化した機能の場合)
 
 もし、標準モジュールを中継にした場合、
 
 
 このユーザーフォームの仕様書には、
 
 但し書きとして、
 
 「このユーザーフォームを運用の際は、
 標準モジュールに中継としてのプロシジャーとして、
 
 以下のプロシジャーを記述しなけれなならない」
 
 なんて、記述が必要になってしまいます。
 
 Excelが提供しているWorkbookやWorksheetやRange等のオブジェクトに
 こんな但し書きがあったら、使いづらいことこの上ないですよね?
 
 ユーザーフォームもオブジェクトです。
 
 出来る限り、こういう但し書きが要らない仕様にするべきだという
 立場からの意見です。
 
 
 但し、前述したような不具合に対処するためなら、これらの構造的なことは
 目をつぶらなければならないでしょうねえ・・・。
 
 プログラム構造に重きをおくあまり、バグ連発ではお話になりませんから・・・。
 
 
 |  |