作成日 2005/10/10
最終更新日 2005/10/23
エクセルVBAやVB6.0でフォーム上のコントロールにアクセスするとき、「Me」って使ってる?
フォーム(
UserForm1)上にテキストボックス(
TextBox1)があったとする。
で、
UserForm1内のコードで
TextBox1のテキストを変えたいときに、
UserForm1.TextBox1.Text = "aaabbbccc"
のようにしている人はいないだろうか。
Me.TextBox1.Text = "aaabbbccc"
のように、
Meを使った方がいいです。(※1、※2、※3)
※1:偉そうな事言ってますが、だるまもエクセルVBAをやり始めたときはMeなんで知りませんでした。
※2:Meですが、オブジェクト指向の勉強をした事がないと、知らない可能性が高いです。
※3:TextBox1,Text="aaabbbccc"とするとMeを省略したと見なされます。(UserForm1を
省略したとは見なされません。)
[オブジェクト]ブラウザで調べるとわかりますが、クラスです。
インスタンスを生成する事もできます。
例えば、UserForm1というフォームを作成したら、
Dim f As New UserForm1
のようにしてインスタンスを生成できます。
Javaでいうところの、thisとほぼ同じ。
(VB・VBAのMeはprivateフィールド・メソッドにアクセスできないが、javaのthisはできる。)
とりあえず、エクセルVBAのヘルプにあるMeの説明を載せようと思ったけど、なんとなくやめた。
Meというのは、自分自身への参照のことです。
日本語にすると、「私」、「僕」、「俺」、「儂(わし)」、「朕(ちん)」のような一人称になると思う。
ソースを組んで、やった方が早い。
以下のサンプルをダウンロードして、以下の4つのメソッドからフォームを表示して、ボタンを押してみてください。
- Module1.フォームの表示1()
- Module1.フォームの表示2()
- Module2.フォームの表示1()
- Module2.フォームの表示2()
ボタンを押して、テキストボックスの値が"aiueo"になればOK、ならなければNGです。
サンプル(ファイル名:test_Me.xls)
以下はサンプルのクラス図です。(というより、ソースかも。)
|
図1 サンプルソースのクラス図 |
ノートの中にコードを記しました。
(普通、こんな事やらない気がするけど、ここではソースを示したかったのであえてやりました。そのおかげで、見にくい、、、。) |
Module1.フォームの表示2()では、うまく動作しなかったと思います。(ボタンを押しても、テキストボックスの値が変化しない。)
さらに、Module1.フォームの表示2()のソースを下記のように変更して、以下の事を試してください。
- Module1.フォームの表示2()を実行する。
- いったん画面が表示されたら、ボタンを押して、画面を閉じます。
- すると、また画面が表示されますが、そのとき、テキストボックスの値はどうなっているか?
Public Sub フォームの表示2()
Dim f As New UserForm1
f.Show
UserForm1.Show
End Sub
|
まとめ
※これ以降の説明は、既に理解している人にしか理解できないかもしれません。(説明能力がな
くて、申し訳ございません。)
なんで、こんな事になるのかですが、フォーム(UserForm1)を作成すると、標準モジュールに
Public UserForm1 As New UserForm1
が宣言されたような状態になります。
UserForm1.TextBox1.Text="aiueo"
というのは、
グローバル変数UserForm1が指し示すフォームのTextBox1のテキストを"aioue"に変更しろという命令なのであって、
自分のTextBox1のテキストを"aiueo"にしろという命令ではないです。
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メールをお願いします。
Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。