[[20090203174351]] 『VBA)モジュール間の呼び出し』(ひら) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA)モジュール間の呼び出し』(ひら)

現在、自分で作成していないVBAの解読を行っています。
モジュール間の呼び出しについて、わからないことがあり質問させていただきました。

標準モジュールとクラスモジュールで、同じ名前のプロシージャがあります。

標準モジュール内のあるプロシージャで、そのプロシージャを呼び出したとき、
どちらのモジュールのプロシージャが呼び出されるのでしょうか?
両方同時に呼び出されるのでしょうか?
呼び出しの際、宣言、指定がありません。

呼び出したプロシージャ・・・Public

同じ名前の
     標準モジュールのプロシージャ・・・Private
     クラスモジュールのプロシージャ・・・Public

質問がわかりづらくて申し訳ないですが、回答よろしくお願いします。

エクセルのバージョン:Excel2003
OSのバージョン:WindowsXP


 そのままコピペしたらいいのでは

 Class1のクラスモジュールに

 '======================================================
 Option Explicit
 Sub aaa()
    MsgBox "class1のaaa"
 End Sub

 標準モジュール(Module1)に

 '======================================================
 Sub samp()
    Dim cls As New Class1
    Call aaa
    call cls.aaa
 End Sub
 '=========================================================
 Private Sub aaa()
    MsgBox "標準モジュールのaaa"
 End Sub

 として、sampを実行してみてください。この結果で理解できますか?
 試してみてください

 ichinose

回答ありがとうございます!
同じモジュール内のものは宣言なしで呼び出せるんですね。

Callで呼び出すのではなく、各プロシージャの処理結果を求める場合でも同じですか?

標準モジュール

 Public Sub Open()=======

 Dim rc As Boolean
 Dim wb As WorkBook

 set wb = WorkBooks.Open(ファイル名)
 rc = LoadAFile(wb) ←←←←←←←←←←この部分

 wb.Saved = True
 Call wb.Close
 Set wb = Nothing

 if rc Then
 表示させる処理
 end if

 Private Function LoadAFile(Byref wb As Workbook) As Boolean======= 

 LoadAFileにTrueかFalseが入る処理

クラスモジュール

 Public Function LoadAFile(Byref wb As Workbook) As Boolean======

 LoadAFileにTrueかFalseが入る処理
 (標準モジュールのプロシージャの処理とは異なる)

上のようなコードになっています。どちらの処理も行われるということでしょうか?
ほとんど分かっていないので、質問が分かりにくいと思いますが、よろしかったら回答お願いします。


結果としては、標準モジュールのそれということですが、

 標準モジュールの

 Public Sub Open()

 を選択した状態で F8キーを押してください。

 上記の Public Sub Open() 黄色く塗りつぶされます。

 繰り返しF8キーを押してください。実行されるステートメントが黄色く塗りつぶされます。

 この操作を繰り返せば、どのプロシジャーが呼び出されているか確認できると思います。

 尚、クラスモジュールというのは、インスタンスを作成しないと(オブジェクトの生成)中の
 プロシジャー(プロパティ、メソッドと言います)を実行できないことは知っていますよね?

 投稿されたコード内にインスタンスを作成しているコードがなかったので ちょっと気になりました。

 それと・・・、

 >同じモジュール内のものは宣言なしで呼び出せるんですね。 

 同じモジュール内に同じプロシジャー名がなければ、
 標準モジュールであれば、モジュールが違っても、プロシジャ−名だけで呼び出せます。
 (但し、その場合は、Private ステートメントは、記述しないこと)
 逆にこれが出来てしまうから、メンテナンス的に厄介な場合があります。

 例1

 標準モジュール(Module1)に

 '=============================================================
 Option Explicit
 Sub samp()
    Call aaa
    Module2.aaa
 End Sub
 '==============================================================
 Sub aaa()
    MsgBox "sampと同じモジュールのaaa"
 End Sub

 標準モジュール(Module2)に

 '===============================================================
 Option Explicit
 Sub aaa()
    MsgBox "sampと違うモジュールのaaa"
 End Sub

 このように複数の標準モジュールに同じ名前のプロシジャーがある場合、
 同じモジュール内のプロシジャーがモジュール名の指定なしで呼び出されます。

 例2

 標準モジュール(Module1)に

 '=============================================================
 Option Explicit
 Sub samp()
    Call aaa
 End Sub

 標準モジュール(Module2)に
 '===============================================================
 Option Explicit
 Sub aaa()
    MsgBox "sampと違うモジュールのaaa"
 End Sub

 この場合は、モジュール名を省略しても、Module2のaaaが呼び出されます。

 標準モジュールとオブジェクトモジュール
 (クラスモジュール、UserFormのモジュール、Thisworkbook、各Sheetのモジュール)
 の違いをよく調べてみてください。

 ichinose


 回答ありがとうございます!
 もっとモジュールについて調べてみます。

 英文の翻訳をやっているような気分で毎日取り組んでいます。(英語苦手)
 また質問させていただく際も、よろしくお願いします。
 ありがとうございました!


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.