ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュの【VBA】自分で定義したイベントをハンドルしたいです

  • mixiチェック
  • このエントリーをはてなブックマークに追加
VBAでの質問です。

/*質問はここから*/

シート上に表示してあるListObject内のデータに、
変更(ソートも含む)が加えられた時に
イベントを発生させて、任意の処理をしたいと考えています。

/*質問はここまで*/

/*具体的にしたいことはここから*/

エクセルでXMLのデータを処理しています。
サーバーから取得したデータをシート上にマップしているのですが、
ユーザーに見られたくないor変更されたくない情報も含まれているので、
.xsdファイルを使用して任意のデータだけを表示させます。
取得した時点でのXMLデータ(=原本)はDOMDocumentか何かで
ユーザーの触れないところに確保しておきます。
ここで、ユーザーがListObjectに変更やソートをくわえた際に
イベントを発生させて内部のDOMのデータを変更します。
最後にDOMのデータをサーバーにあげてDBを変更します。

/*具体的にしたいことはここまで*/

/*補足
ListObjectを表示しているシートに
Sub Worksheet_Change〜〜〜〜〜
と記述すればシートのイベントは取得できるので
代替案としては考えていますが、
できればListObjectに対する変更(ソートも含む)のイベントを取得したいです。

質問文が長くて申し訳ありませんが、
よろしくお願いします。

コメント(2)

自分でイベントを定義できるのは、クラスモジュールだけ。
定義してしまえば、ハンドルするのは簡単(オブジェクトモジュールで可能)。

Excel がイベントを実装していない処理に、イベントを付けることは出来ない。その仕組みがないため。

出来ることは、1)Excel が実装しているイベントを利用するか、2)イベントを発生させたい処理をフックするか、ぐらい。

1) は、シートの Change イベントを利用する。ここから ListObject の変更であることを検出して、イベント発生メソッドを呼び出す。つまり、Excel のシート基準の枠組みから、自作マクロの ListObject 基準の枠組みへの橋渡しを作ると言うこと。

2) は、ListObject に変更を加える操作を置き換えてしまう。たとえば、メニューにある行挿入コマンドを、自作マクロのものと置き換えてしまえば、ユーザーが行挿入しようとしていることが判り、イベントを発生させることが可能。ただし、すべての操作を網羅する必要があって現実的ではない。それに、この場合でも、値の変更を検出するためには、シートの Change イベントを利用する必要があるので、1) の方が処理が単純になる。


通常、Excel でデータ編集の完全コントロールを行いたい場合は、ユーザーにシートを編集させてはいけない。ユーザーフォームで行うべき。

なぜなら、[コントロール ツールボックス]コマンドバーにある[デザイン モード]ボタンを押し込んでいれば、どのイベントも発生しないため、ユーザーの操作に一切介入が出来ない。
藤代千尋さん

回答ありがとうございます。
お返事が送れてすいません。

一番可能性のある1)の方法ですが、

ワークシートのChangeイベントを発生させて、
ListObjectの範囲内であれば処理をする

これはできたのですが、
データのソートを行った際には、Changeイベントは拾えませんでした。

やはりフォーム上ではなくシート上で行いたいので、
以下のことを考えて見ました。

ソートイベントを取得するために、
ListObjectの上端セルに自作のコンボボックスを置いて
オートフィルタと同じことをさせる。。。
考えましたが、書きながら強引な気もしてきました。

でもコレができれば一応解決なのかもしれないと。。

フォーム上で行うことも視野にもう少し検討してみます。
ありがとうございました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。