プロが教えるわが家の防犯対策術!

標準モジュールから
UserForm1.Show Modal を実行して

'-------ここからフォーム1コード
Private Sub UserForm_Initialize()
myRowN = Worksheets("元").Range("a65536").End(xlUp).Row '最終行取得
.
.
Call ChangeMe
End Sub

Private Sub ChangeMe()
TextBox1.ControlSource = "a" & myRowN
TextBox2.ControlSource = "b" & myRowN
TextBox3.ControlSource = "c" & myRowN
'それぞれシートにある文字をテキストボックスに入れる
End Sub

で、コマンドボタン1、2を押すたびに上下に移動するのですが、マクロ実行段階ではフォームには何も表示されずボタンを押した時点でフォームの文字が反映されます。
フォームが開いた時にデータが反映されるにはどうすればいいのでしょう?

A 回答 (2件)

こんにちは。

KenKen_SP です。

コードのザッと見た限りですが....

ご質問文のコードでは、UserForm_Initialize イベント内の変数 myRowN は
UserForm_Initialize プロシージャ内でのみ有効です。サブプロシージャ
ChangeMe 側の変数 myRowN は ChangeMe プロシージャ内でのみ有効です。

このように、変数には有効範囲があります。これを、

  「変数のスコープ」

と呼びます。Private だから...と言うのとは、ちょっと違いますね。

UserForm_Initialize 側から ChangeMe を呼び出したとき、ChangeMe の変数
myRowN は空なので失敗するのだと思います。

「変数 スコープ」

このキーワードで WEB 検索してみて下さい。きっと、役立つと思いますよ。

では、具体的にどうするのかと言えば、次のような方法になります。Windows
プログラムでは「広域変数をなるべく使わない」という基本があって、特段の
理由がない場合は、通常は方法2の引数を使います。


【方法1】 モジュールレベルの変数にする-------------------------------

Private myRowN as Long '<--- モジュール内の全てのプロシージャからアクセス可

Private Sub UserForm_Initialize()
myRowN = Worksheets("元").Range("a65536").End(xlUp).Row '最終行取得
.
.
Call ChangeMe
End Sub

Private Sub ChangeMe()
TextBox1.ControlSource = "a" & myRowN
TextBox2.ControlSource = "b" & myRowN
TextBox3.ControlSource = "c" & myRowN
'それぞれシートにある文字をテキストボックスに入れる
End Sub


【方法2】 引数で渡す ---------------------------------------------------

Private Sub UserForm_Initialize()
myRowN = Worksheets("元").Range("a65536").End(xlUp).Row '最終行取得
.
.
Call ChangeMe(myRowN) '<-- 引数を渡す
End Sub

Private Sub ChangeMe(lngRowNum As Long) '<---※引数を受けるプロシージャ
TextBox1.ControlSource = "a" & lngRowNum
TextBox2.ControlSource = "b" & lngRowNum
TextBox3.ControlSource = "c" & lngRowNum
'それぞれシートにある文字をテキストボックスに入れる
End Sub
    • good
    • 0
この回答へのお礼

大変丁寧なご返答ありがとうございます!
さっそく試してみます
ほんとうにありがとうございました

お礼日時:2006/08/21 20:33

Private Subなのでモジュール間の変数の引き継ぎは行われないのが理由ではないですか。

以下のようにサブモジュールを分けなければ動作しました。

Option Explicit
Private Sub UserForm_Initialize()
Dim myRowN As Long
myRowN = Worksheets("元").Range("a65536").End(xlUp).Row '最終行取得
TextBox1.ControlSource = "a" & myRowN
TextBox2.ControlSource = "b" & myRowN
TextBox3.ControlSource = "c" & myRowN
'Call ChangeMe
End Sub

先頭のOption Explicitを着けたら「変数が定義されていません」というエラーとなって動かないはずです。でもこのオプションは必ず記述する方がよいと思いますよ
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
試してみます

お礼日時:2006/08/21 20:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!