作成日 2005/9/28
最終更新日 2005/10/8

エクセルVBAやVB6.0で引数にオブジェクト型を指定したときのByValとByRefについて

 SubプロシージャやFunctionプロシージャの引数で使う、ByValとByRefの意味なんて、 VB・VBAの超初心者ではない限り知っていると思います。
(ByValが値渡しで、ByRefが参照渡し。)
 しかし、引数が基本型(※1)の場合はいいのですが、オブジェクト型(※2)の場合、意味を知っている人は少ないと思います。(※3)
 ということで、いい加減に解説します。

 え、そんなこと知らなくてもいいんじゃないかって?
 でも、知らなかったら、例えば、引数にワークシートを指定したいとき、引数はシート名(String型)にしちゃうけど、 Worksheetクラスにした方が処理速度、可読性がいいと思う。(※4、5)

※1:Boolean,Byte,Integer,Long,Single,Double,Currency,Date,String。(JavaではStringはオブジェクト型なんだけど。)
※2:オブジェクトを参照するためのアドレスを格納する型。サイズは4バイト。
※3:偉そうな事言ってますが、だるまもエクセルVBAでマクロを組み始めたときは全く知りませんでした。
知ったのはJavaを勉強させられ(?)、オブジェクト指向が多少わかってきてからです。
※4:だるまもオブジェクト指向を全く理解していないときは、シート名で渡していた。
※5:これはVB6.0はやったことはあるけど、エクセルVBAはやったことがないという人にはピンとこないかもしれない。
ブック、シート、セル等、よく使うものはすべてオブジェクト型なので、こういうことがよく起こる。

1.オブジェクト型について
2.オブジェクト型にはどんなものがあるの?
3.オブジェクト型をByValで渡すとどうなるの?
4.オブジェクト型をByRefで渡すとどうなるの?
5.参考文献

1.オブジェクト型について

 とりあえず、エクセルVBAのヘルプからの引用。
オブジェクト型 (Object) の変数は、32 ビット (4 バイト) の変数です。オブジェクトを参照するためのアドレスを格納します。オブジェクト型として宣言した変数には、Set ステートメントを使用してオブジェクトへの参照を代入することができます。
 この文章って、すでに理解している人にしか理解できない気がするけど、ここでは、 「オブジェクトを参照するためのアドレスを格納します。」 というところを押さえて。
このページのトップへ

2.オブジェクト型にはどんなものがあるの?

 VBE(Visual Basic Editor)の[オブジェクト]ブラウザを見た方が早い。
[オブジェクト]ブラウザで、クラスモジュールアイコンの記号がついているものはオブジェクト型。

 ※1:ちなみに、新規にユーザフォームやクラスモジュールを作成するというのは、新規にオブジェクト型を作成するということになります。(標準モジュールは違うと思う。)
 ※2:WorkbookやSheetなど、エクセルでよく目にするものは大抵オブジェクト型です。
このページのトップへ

3.オブジェクト型をByValで渡すとどうなるの?

 サンプルを作って、実際にやってみた方が早い。
 サンプルプログラムのダウンロード(ファイル名:test_ByVal.xls)

■適当な解説:
 オブジェクト型をByValで渡すという事は、オブジェクトを参照するためのアドレスを値渡しで渡すという事です。
 なので、mainメソッドからsubメソッドを呼び出すときに、引数にオブジェクト型を指定した場合
  1. subメソッド内で参照先を変更しても、mainメソッドに処理が戻ったとき、
    オブジェクト型変数はsubメソッドを呼び出す前と同じオブジェクトを指し示します。
  2. subメソッド内で参照先のプロパティを変更したら、mainメソッドに処理が戻ったとき、
    参照先のオブジェクトのプロパティは変更された状態です。

    (これはByValなのになんで?と思うかもしれません。)
このページのトップへ

4.オブジェクト型をByRefで渡すとどうなるの?

 サンプルを作って、実際にやってみた方が早い。
 サンプルプログラムのダウンロード(ファイル名:test_ByRef.xls)

■適当な解説:
 オブジェクト型をByValで渡すという事は、オブジェクトを参照するためのアドレスを値渡しで渡すという事です。
 なので、mainメソッドからsubメソッドを呼び出すときに、引数にオブジェクト型を指定した場合
  1. subメソッド内で参照先を変更したら、mainメソッドに処理が戻ったとき、
    オブジェクト型変数の参照先は変更されています。
    (ByRefのイメージ通りだと思います。)
このページのトップへ

5.参考文献

 
項番
著者
名前
出版社
ISBN
備考
1
ジョゼフ・オニール
独習Java第3版
翔泳社
ISBN4-7981-0797-2
第5章 クラスの作成の
練習問題5.10(169ページ)をやるとわかる
Prev Up Next  Top
このページのトップへ


このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。