|    | 
     ▼かず さん: 
 
サンプルコードの解説を補足します 
 
 では、1.'から順に見ていきましょう。 
 まず、1行目でEventステートメントを使ってイベントを宣言しています。このクラスは 
Rowslnsertというイベントを発行して、そのイベントプロシージヤは、CancelというBoolean d 
の引数を参照渡しで受け取りますよ、といった宣言になります。 
 CheckRowsInsertメソッドは、この後解説するタイマー処理によって繰り返し実行され、行 
が挿入されたタイミングでイベントを発行するメソッドです。ここで重要なのは、Static変数 
「myRow」が最終行を表すRangeオブジェクトへの参照を保持していることです。初めて実行 
されるときだけは変数「myRow」が「Nothing」なので、その場合には最終行を表すRange オ 
ブジェクトへの参照を格納するだけの処理を行いますが、2回目以降にはいよいよチェックを行 
います。 
 このチェックには、On Error Resume Nextステートメントを使って、実行時エラーを無視す 
るようにしてから、変数「myRow」に参照が格納されているRangeオブジェクトの何らかのプ 
ロパティを取得してみるのが簡単です。ここではRowプロパティを取得していますが他のプロ 
パティでもかまいません。 
 このとき、行が挿入されていれば最終行は存在しなくなっているのでエラーが発生します、 
ですから、「エラーの発生=行が挿入された」と判断できるわけです。エラーの発生の有無は、 
Err関数を使って参照を取得できるErrObjectオブジェクトのNumberプロパティで判断でき 
ます。エラーが発生していなければNumberプロパティの値が「O」となるからです。 
 そして、行が挿入されたと判断したらRaiseEventステートメントを使ってRowslnsertイベン 
トを発行します。引数Cancelには変数[myCancel]を指定し、イペントプロシージヤによって、 
変数.[myCancel」の値が「True」に変更される(引数Cancelに「True」が設定される)と、 
ApplicationオブジェクトのUndoメソッドを使って、行挿入の操作を元に戻します。 
 
 次に、2.のコードをご覧ください。これはタイマープロシージヤと呼ばれるプロシージヤで、 
この後解説するWin32API関数のSetTimer関数の引数IpTimei'Funぺこ、このプロシージヤの 
アドレスを指定すると、繰り返し非同期で実行されるようになります。 
 宣言部については決まり事として覚えておいてください。ここで行っている処理は、 
clsRowsInsertEventオブジェクトのCheckRowsInscrtメソッドを実行するといったものですI 
clsRowsInsertEventオブジェクトへの参照は、3.のコードで定義しているThisWorkbookク 
ラスのRowsInsertEventClassプロパティを使って取得します。 
 
 最後に3.・のコードの要点をまとめます。 
 まず、このブックモジュールでclsRowsInsertEventオブジェ列ヽが発行するイベントをハンド 
ルするために、モジュールレベルのオブジェクト変数「mvRowsInsertEventClass」を、 
 
 WithEventsキーワードを付けて、cIsRowsInsertEvent型で宣言します。 
 そして、そのclsRowsInsertEventオブジェ列ヽのRowslnsertイペントプロシージャに、 
 行挿入時に実行する処理を記述します。ここでは、キャンセルするかどうかの問い合わせのみ 
 を行っています。 
 タイマー処理の開始はブックのOpenイベントプロシージャで、終了はBeforeCloseイベント 
ブロシージャで行います。 
 タイマー処理を開始するのはWin32API関数のSetTimerで、引数HwndとnlDEventには0を、 
 uElapseにはタイマー処理を実行する問隔(ミリ秒)を、lpTimerFunc にはタイマープロシージャ 
のアドレスを指定します。プロシージャのアドレスはAddressOf演算子を使って取得し 
ます。なお、サンプルではnElapseに「O」を指定していますが、当然ですがOミリ秒ごとに処理 
を繰り返すといった非現実的なことは不可能です。このような場合処理できる極めて微小な時間 
単位で処理が繰り返されます。 
 SetTimer関数の戻り値はタイマーIDと呼ばれる識別子で、 
KillTimer関数のnIDEventに指定することでタイマー処理を終了できます。サンプルで、ブックの 
BeforeCloseイベントプロシージャの処理に保存確認のロジックを内包しているのは、Beforecloose 
 
イペントプロシージャの処理によってタイマー処理(イベント発行のための監視)を完了してから、 
Excelの機能によって保存確認が行われた場合にキャンセルすると、イベントをハンドルできない状態 
で開かれたままになるからです。 
さて、3.のコードの最後で定義しているRowsInsertEventClassプロパティの内容はまったく 
難しいものではありません。 
 
モジュールレベル変数[my RowsInsertE vent Class]が「Nothing」であれば新たにインスタンスを 
生成してから、その参照を返すプロパティです。しかし1つだけ重要なことがあります。 
このようにして外部にclsRowsInsertEventオブジェクトヘの参照を返す(公開する)場合には、 
 
clsRowsInsertEventクラスのInstancingがデフォルトのPrivate]のままではいけないからです。 
このような場合には、あらかじめ[プロパティ]ウインドウを使ってInstancingを[PublicNotCreatable] 
に設定しておきます。 
 
ポイント 
 タイマー処理中に実行時エラーが発生すると、Excelが即座に落ちてしまいます。万が一にもそのよう 
なことがないように、絶対に実行時エラーが発生しない処理でない限り、必ずOn Error Resume Next 
ステートメントを付けるようにしましょう。 
 
-- 
 | 
     
    
   |