作成日 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を 省略したとは見なされません。)

1.フォームはクラス
2.Meについて
3.Meではなくフォーム名を使ったらどうなるのか

1.フォームはクラス

 [オブジェクト]ブラウザで調べるとわかりますが、クラスです。
 インスタンスを生成する事もできます。

 例えば、UserForm1というフォームを作成したら、
  Dim f As New UserForm1
のようにしてインスタンスを生成できます。
このページのトップへ

2.Meについて

 Javaでいうところの、thisとほぼ同じ。
(VB・VBAのMeはprivateフィールド・メソッドにアクセスできないが、javaのthisはできる。)

 とりあえず、エクセルVBAのヘルプにあるMeの説明を載せようと思ったけど、なんとなくやめた。

 Meというのは、自分自身への参照のことです。
 日本語にすると、「私」、「僕」、「俺」、「儂(わし)」、「朕(ちん)」のような一人称になると思う。

このページのトップへ

3.Meではなくフォーム名を使ったらどうなるのか

 ソースを組んで、やった方が早い。

 以下のサンプルをダウンロードして、以下の4つのメソッドからフォームを表示して、ボタンを押してみてください。
 ボタンを押して、テキストボックスの値が"aiueo"になればOK、ならなければNGです。
   サンプル(ファイル名:test_Me.xls)

 以下はサンプルのクラス図です。(というより、ソースかも。)
サンプルソースのクラス図
図1 サンプルソースのクラス図
ノートの中にコードを記しました。
(普通、こんな事やらない気がするけど、ここではソースを示したかったのであえてやりました。そのおかげで、見にくい、、、。)


 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"にしろという命令ではないです。


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.の登録商標または商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

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