標準モジュールから
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を押すたびに上下に移動するのですが、マクロ実行段階ではフォームには何も表示されずボタンを押した時点でフォームの文字が反映されます。
フォームが開いた時にデータが反映されるにはどうすればいいのでしょう?
No.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
No.1
- 回答日時:
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を着けたら「変数が定義されていません」というエラーとなって動かないはずです。でもこのオプションは必ず記述する方がよいと思いますよ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
VBA プロシージャの名前の取得
-
Access VBAで行ラベルが定義さ...
-
callで順に実行されるプロシー...
-
Accessでグローバル変数を宣言...
-
エクセルVBAでUserFormを起動し...
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
ACCESS2007インポート時の空白...
-
ブックオープン時にテキストボ...
-
Accessのプロシージャ名が勝手...
-
Excel:ThisWorkbookオブジェク...
-
或るプロシージャの呼び出し元判定
-
エントリ ポイントが見つかりま...
-
SQL ServerのストアドでUPDATE...
-
PL/SQLのエラーについて
-
【Excel VBA】 WorksheetやRa...
-
Oracle : BLOB型フィールドへの...
-
VBAをF1~F12で実行させたい
-
DB2でのストアドプロシージャの...
-
excel/vba/public変数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
VBA プロシージャの名前の取得
-
【Excel VBA】 WorksheetやRa...
-
callで順に実行されるプロシー...
-
或るプロシージャの呼び出し元判定
-
Excel VBAで「プログラム実行」...
-
Accessでグローバル変数を宣言...
-
excel/vba/public変数
-
OutlookVBAで作成したマクロに...
-
ACCESS2007インポート時の空白...
-
ACCESS マクロをモジュールに変...
-
Excel:ThisWorkbookオブジェク...
-
VBAのプロシージャー間で、変数の受...
-
PL/SQLのエラーについて
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
Oracle : BLOB型フィールドへの...
-
エクセルVBAが対応できるプログ...
-
Access VBA ラベル印刷開始位置...
おすすめ情報