ユーザーフォーム入門
標準モジュールとフォーム間のデータ受け渡しⅠ

Excelマクロのユーザーフォームの基礎、エクセルVBAの入門解説
公開日:2013年5月以前 最終更新日:2019-12-15

第9回.標準モジュールとフォーム間のデータ受け渡しⅠ


ユーザーフォーム入門として基礎から解説します。
フォームが起動された時、起動したシートのアクティブセルの行数を知る方法について解説します。


前回までに作成したVBA

標準モジュール
Sub FormShow()
  frmSample.Show
End Sub

フォームモジュール
Private Sub UserForm_Initialize()
  Dim i As Long
  With Worksheets("顧客マスタ")
    i = ActiveCell.Row
    Me.txtコード.Text = .Cells(i, 1)
    Me.txt漢字名称.Text = .Cells(i, 2)
    Me.txtカナ名称.Text = .Cells(i, 3)
  End With
End Sub

Private Sub btnOk_Click()
  Dim lastRow As Long
  With Worksheets("顧客マスタ")
    lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
    .Cells(lastRow, 1) = Me.txtコード.Text
    .Cells(lastRow, 2) = Me.txt漢字名称.Text
    .Cells(lastRow, 3) = Me.txtカナ名称.Text
  End With
  Unload Me
End Sub

以上でした。
正しく動作していますが、ActiveCell.Row これが・・・
シート名が固定なのは、まあ良しとしても、
フォームモジュール側で、ActiveCell.Row、これを使うのはちょっと面白くない感じです。

フォーム側でアクティブセルの行数を知る方法

フォームが起動された時、起動したシートのアクティブセルの行数を知る事が出来れば良いのです。
その方法は何通りかあり、バリエーションを考えたら無数にありますが、
以下のパターンを把握すれば良いでしょう。

1.シートのセルを使う
2.標準モジュールのグローバル変数を使う
3.標準モジュールからフォームのコントロールを操作する
4.Subプロシージャーの引数を使う
5.Functionプロシージャーの戻り値を使う


単純に、フォームモジュールと標準モジュールのデータ受け渡しとしては、
フォームにPublic変数やPublicプロパティを定義して、そこで設定する事も可能です。
しかし、今回のような場合は、
UserForm_Initializeで初期化されてしまうので、この方法は使えません。

1.は前回作成したものとほぼ同じ意味なので解説は省略します。
2.3.は、変数を定義する場所の違いだけですが、
使い方に若干の違いがありますので、それぞれ参考コードで解説します。

そして、4.5.は、なかなか解説している書籍・サイトがないでしょうから、
次回に少し詳しく解説する予定です。

では、今回は、2.3.の2通りの解説をします。

標準モジュールのグローバル変数を使う

まずは、標準モジールから、

Option Explicit
Public ActiveRow As Long
Sub FormShow()
  ActiveRow = ActiveCell.Row
  frmSample.Show
End Sub

Publice ActiveRow As Long
このように、グローバル変数を定義し、この変数に値を入れて受け渡しします。

そして、フォームモジュールでは、

Private Sub UserForm_Initialize()
  Dim i As Long
  With Worksheets("顧客マスタ")
    i = ActiveRow
    Me.txtコード.Text = .Cells(i, 1)
    Me.txt漢字名称.Text = .Cells(i, 2)
    Me.txtカナ名称.Text = .Cells(i, 3)
  End With
End Sub

ActiveRow
これは、省略せずに書くと、
Module1.ActiveRow
モジュール名.変数
このように書きますが、モジュール名は省略しても良いでしょう、
ただし、同一変数が他のモジュールに無い事が大前提です。

標準モジュールからフォームのコントロールを操作する

まずは、標準モジュールから、

Sub FormShow()
  Dim i As Long
  i = ActiveCell.Row
  frmSample.txtコード = Cells(i, 1)
  frmSample.txt漢字名称 = Cells(i, 2)
  frmSample.txtカナ名称 = Cells(i, 3)
  frmSample.Show
End Sub

このように、標準モジュール側からフォームのコントロールに取得・設定することも可能です。

この場合は、今回の処理内容ではフォームの、
UserForm_Initialize
ここでは何も処理する事がなくなりますね。



同じテーマ「ユーザーフォーム入門」の記事

第6回.テキストボックス(TextBox)の追加
第7回.テキストボックス(TextBox)の値をセルへ
第8回.セルの値をテキストボックスへ
第9回.標準モジュールとフォーム間のデータ受け渡しⅠ
第10回.標準モジュールとフォーム間のデータ受け渡しⅡ
第11回.コンボボックス(ComboBox)の追加
第12回.リストボックス(ListBox)の追加
第13回.チェックボックス(CheckBox)の追加
第14回.オプションボタン(OptionButton)の追加
第15回.ここまでの整理と全VBA
第16回.アクティブコントロールに色を付ける


新着記事NEW ・・・新着記事一覧を見る

カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ