[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.