Excel VBA 質問スレッド №1590 (未解決)

ユーザーフォームとエクセルシートの相互値渡し

投稿者 : 甘納豆     投稿日時 : 2023/09/29(Fri) 09:00:05     OS : Windows 11     EXCEL : Office 365
苦戦しております。。よろしくお願いいたします。


■ブック内の状態
シート①…原本(2行1セットで15セットを1チームとして項目設定しています。1チームごとに記載項目変更し、全部で10チーム準備しています。)
シート②…シート名「行の表示管理」
■VBA内
ユーザーフォーム①…「行の調整フォーム」としてマルチページを設定。タブ1で1チーム目の表示設定。タブ2で2チーム目の表示設定。10チーム分のタブを作成)
ユーザーフォーム②…タブ1(1チーム目)の行の表示設定を管理(オブジェクト名「frm2」)
ユーザーフォーム③…タブ2(2チーム目)の行の表示設定を管理(オブジェクト名「frm3」)


10チーム分のタブ。

シート①に「行の調整フォーム」のフォームコントロールを設置。クリックするとユーザーフォーム①を呼び出す。(標準モジュールにコード記載)
ユーザーフォーム①のタブ①に設置した「コマンド1」でユーザーフォーム②を呼び出す。(「行の調整フォーム」内にコード記載)

ユーザーフォーム②の配置は以下です。
わかりやすさのため、オプションボタンにもオブジェクト名を付けており、“1チーム目1行目の表示”“1チーム目1行目の非表示”という安直なオブジェクト名です。
【1行目 〇表示 〇非表示】…groupnameA1(プロパティで設定)
【2行目 〇表示 〇非表示】…groupnameA2(プロパティで設定)



【15行目 〇表示 非表示】…groupnameA15(プロパティで設定)

シート②で管理すること
■1チーム目
1行目 表示=TRUE、非表示=FALSE←セル番地A1、B1
2行目 表示=TRUE、非表示=FALSE←セル番地A2、B2
3行目 表示=FALSE、非表示=TRUE←セル番地A2、B2



ユーザーフォーム②は「保存して閉じる」ときにシート②に値を渡す。
再度、「行の調整フォーム」からタブ①の「コマンド1」をクリックしたときに現状の表示・非表示をフォームに戻す。

↑ここがうまくできません。
コードはユーザーフォーム②に書いていて、エラーは出ませんが、反映されません。
以下、記載しているコードです。

Private Sub frm2_Initialize()
  Dim ws1 As Worksheet
  Set ws1 = Worksheets("行の表示管理")
  1チーム目1行目の表示.Value = ws1.Cells(1, 1)
 1チーム目1行目の非表示.Value = ws1.Cells(1, 2)
 1チーム目2行目の表示.Value = ws1.Cells(2, 1)
 1チーム目2行目の非表示.Value = ws1.Cells(2, 2)
 1チーム目3行目の表示.Value = ws1.Cells(3, 1)
 1チーム目3行目の非表示.Value = ws1.Cells(3, 2)
End Sub


何がおかしいのかわからず、調べてもわかりませんでした。。
教えていただけるとありがたいです。

また、コードを簡潔にできるのであれば合わせてご指導いただけると大変勉強になります。

不足情報があればご指摘ください。
よろしくお願いいたします。

スポンサーリンク
[返信 1] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : hideru     投稿日時 : 2023/09/29(Fri) 10:27:17
■[質問] 甘納豆さん(2023-09-29 09:00:05)の記事
> ■VBA内
> ユーザーフォーム①…「行の調整フォーム」としてマルチページを設定。タブ1で1チーム目の表示設定。タブ2で2チーム目の表示設定。10チーム分のタブを作成)
> ユーザーフォーム②…タブ1(1チーム目)の行の表示設定を管理(オブジェクト名「frm2」)
> ユーザーフォーム③…タブ2(2チーム目)の行の表示設定を管理(オブジェクト名「frm3」)
> ・
> ・
> 10チーム分のタブ。

フォーム①はマルチページを使いながらフォーム②~⑪はたぶんほとんど同じものと思われるというチグハグ感がありますが、それはさておき。

> シート①に「行の調整フォーム」のフォームコントロールを設置。

 ここは何を言ってるのか分かりませんが、これもさておき。

> 1行目 表示=TRUE、非表示=FALSE←セル番地A1、B1

 ここは「表示であれば A1 が TRUE で B1 が FALSE」、非表示ならその逆という意味ですか?

> ユーザーフォーム②は「保存して閉じる」ときにシート②に値を渡す。

 ここの「閉じる」は Unload してますか? ひょっとして Me.Hide してません? だとしたら次は frm2_Initialize() は実行されませんよ。

[返信 2] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/29(Fri) 10:31:49
■[返信 1] hideruさん(2023-09-29 10:27:17)の記事
> > 1行目 表示=TRUE、非表示=FALSE←セル番地A1、B1

>  ここは「表示であれば A1 が TRUE で B1 が FALSE」、非表示ならその逆という意味ですか?

 聞き方が正確ではなかったです。
 要するに A1 は“1チーム目1行目の表示”オプションボタンの値(TRUE/FALSE)で B1 は“1チーム目1行目の非表示”の値、ということですか? 「表示=」なんてのが付いている訳ではないですよね?

[返信 3] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/29(Fri) 10:38:33
■[質問] 甘納豆さん(2023-09-29 09:00:05)の記事

> また、コードを簡潔にできるのであれば合わせてご指導いただけると大変勉強になります。

 五月雨式にすみませんが、最後に書いてあったので見逃しました。
 提示されているコードは以下しかありませんが、これを簡潔にしようと思ったらまず「1チーム目1行目の表示」といったオブジェクト名を変えた方がよいかと。シート側のセルのアドレスに対応した番号なりを付ければ For ループで回せるでしょう。まあ今の名前でもできなくはないですが。

> Private Sub frm2_Initialize()
> Dim ws1 As Worksheet
> Set ws1 = Worksheets("行の表示管理")
> 1チーム目1行目の表示.Value = ws1.Cells(1, 1)
>  1チーム目1行目の非表示.Value = ws1.Cells(1, 2)

[返信 4] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : 甘納豆     投稿日時 : 2023/09/29(Fri) 10:48:10
ご回答ありがとうございます。

おっしゃる通り、まどろっこしい感じのフォームになっていますが
言わんとしていることを読み取っていただきありがとうございます。

できるだけ1枚にプリントアウトしたいので、使用していない行を非表示にしたいのが一番の理由です。
チームごとに使用する行数が違うので、タブを②~⑪にわけるという方法しか思いつきませんでした。



■[返信 1] hideruさん(2023-09-29 10:27:17)の記事
> ■[質問] 甘納豆さん(2023-09-29 09:00:05)の記事
> > ■VBA内
> > ユーザーフォーム①…「行の調整フォーム」としてマルチページを設定。タブ1で1チーム目の表示設定。タブ2で2チーム目の表示設定。10チーム分のタブを作成)
> > ユーザーフォーム②…タブ1(1チーム目)の行の表示設定を管理(オブジェクト名「frm2」)
> > ユーザーフォーム③…タブ2(2チーム目)の行の表示設定を管理(オブジェクト名「frm3」)
> > ・
> > ・
> > 10チーム分のタブ。

> フォーム①はマルチページを使いながらフォーム②~⑪はたぶんほとんど同じものと思われるというチグハグ感がありますが、それはさておき。

> > シート①に「行の調整フォーム」のフォームコントロールを設置。

>  ここは何を言ってるのか分かりませんが、これもさておき。


◆シート①に「行の調整フォーム」というフォームコントロールを設置して、クリックするとフォーム①(マルチページ)を呼び出す意図です。




> > 1行目 表示=TRUE、非表示=FALSE←セル番地A1、B1

>  ここは「表示であれば A1 が TRUE で B1 が FALSE」、非表示ならその逆という意味ですか?

> > ユーザーフォーム②は「保存して閉じる」ときにシート②に値を渡す。

>  ここの「閉じる」は Unload してますか? ひょっとして Me.Hide してません? だとしたら次は frm2_Initialize() は実行されませんよ。


ご推測の通り、表示のTRUE/FALSE、非表示のTRUE/FALSEをシート②に渡しています。

Unloadしてまして、オプションボタンの情報→シート②への値渡しはできています。

その後、表示行数を調整したくてfrm2を開いたときに現状の表示/非表示設定を反映させたくて、投稿時のコードなのですが、シート②→オプションボタンへの値がきません。。

[返信 5] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/29(Fri) 11:19:50
■[返信 4] 甘納豆さん(2023-09-29 10:48:10)の記事
> > > シート①に「行の調整フォーム」のフォームコントロールを設置。
> >
> >  ここは何を言ってるのか分かりませんが、これもさておき。


> ◆シート①に「行の調整フォーム」というフォームコントロールを設置して、クリックするとフォーム①(マルチページ)を呼び出す意図です。

 (フォームコントロールの)ボタンを設置ということですね。理解しました。

> Unloadしてまして、オプションボタンの情報→シート②への値渡しはできています。

> その後、表示行数を調整したくてfrm2を開いたときに現状の表示/非表示設定を反映させたくて、投稿時のコードなのですが、シート②→オプションボタンへの値がきません。。

 むむむ。となると不可解ですね。念のための確認ですが、frm2_Initialize は正しく実行されていますでしょうか。

[返信 6] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : 甘納豆     投稿日時 : 2023/09/29(Fri) 11:59:41
■[返信 5] higeruさん(2023-09-29 11:19:50)の記事
> ■[返信 4] 甘納豆さん(2023-09-29 10:48:10)の記事
> > > > シート①に「行の調整フォーム」のフォームコントロールを設置。
> > >
> > >  ここは何を言ってるのか分かりませんが、これもさておき。
> >
> >
> > ◆シート①に「行の調整フォーム」というフォームコントロールを設置して、クリックするとフォーム①(マルチページ)を呼び出す意図です。

>  (フォームコントロールの)ボタンを設置ということですね。理解しました。

> > Unloadしてまして、オプションボタンの情報→シート②への値渡しはできています。
> >
> > その後、表示行数を調整したくてfrm2を開いたときに現状の表示/非表示設定を反映させたくて、投稿時のコードなのですが、シート②→オプションボタンへの値がきません。。

>  むむむ。となると不可解ですね。念のための確認ですが、frm2_Initialize は正しく実行されていますでしょうか。



エラー表示もなく、実行されます。
ただただシート②からの値が返ってこない状態です。

ちなみに、オプションボタンの表示/非表示情報→シート②のコードの中身と、シート②→オプションボタンの表示/非表示情報のコードの中身は「=」の左右をひっくり返しているだけなので、私のレベルでは問題点の原因を推測することもできず・・・


ユーザーフォーム①(「行の調整フォーム」)を呼び出すときのコードは標準モジュールに記載。
シート①内に各チームごとにタイトルを設定できるようにフォームの各タブ内にテキストボックスを設置していて、
行の調整フォームを開いたときにテキストボックスにセルの値が返るようCallしています。


Sub 行の調整フォーム_Click() 'シート①に設置したフォームコントロールをクリック
 行の調整フォーム.Show vbModeless ’ユーザーフォーム①を呼び出し
 Call 行の調整フォーム_Initialize ’各タブのテキストボックスにシート①の指定した場所の値を返す
 ActiveSheet.Protect
End Sub



タブ1のコマンドボタンからfrm2を呼び出すときのコードは「行の調整フォーム」のモジュールに記載していて


Private Sub 1チーム目の行の調整_Click() 'タブ1に設置しているコマンドボタンをクリックすると、1チーム目の行の表示/非表示を設定するためのfrm2を呼び出す
 frm2.Show vbModeless
 End Sub


そして、frm2のモジュールに

Private Sub frm2_Initialize()
  Dim ws1 As Worksheet
  Set ws1 = Worksheets("行の表示管理")
  1チーム目1行目の表示.Value = ws1.Cells(1, 1)
 1チーム目1行目の非表示.Value = ws1.Cells(1, 2)
 1チーム目2行目の表示.Value = ws1.Cells(2, 1)
 1チーム目2行目の非表示.Value = ws1.Cells(2, 2)
 1チーム目3行目の表示.Value = ws1.Cells(3, 1)
 1チーム目3行目の非表示.Value = ws1.Cells(3, 2)
End Sub

↑これが15行目まで続く感じですが、この時にシート②の値がオプションボタンに戻らないのです。


私が省いている説明内容から何か問題点を見つけていただければ思い、現状詳細を記載しましたm(__)m

お手数をおかけします。。

[返信 7] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/29(Fri) 12:21:29
■[返信 6] 甘納豆さん(2023-09-29 11:59:41)の記事
> >  むむむ。となると不可解ですね。念のための確認ですが、frm2_Initialize は正しく実行されていますでしょうか。

> エラー表示もなく、実行されます。

 しつこいですが、ステップ実行させて確認しているということでよいですか。

> 1チーム目1行目の表示.Value = ws1.Cells(1, 1)

 vbModeless なのでイミディエイトウィンドウが使えますが、frm2 を表示した後で上の一文を直接実行してもだめですか?

[返信 8] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : 甘納豆     投稿日時 : 2023/09/29(Fri) 12:52:37
■[返信 7] higeruさん(2023-09-29 12:21:29)の記事
> ■[返信 6] 甘納豆さん(2023-09-29 11:59:41)の記事
> > >  むむむ。となると不可解ですね。念のための確認ですが、frm2_Initialize は正しく実行されていますでしょうか。
> >
> > エラー表示もなく、実行されます。

>  しつこいですが、ステップ実行させて確認しているということでよいですか。

> > 1チーム目1行目の表示.Value = ws1.Cells(1, 1)

>  vbModeless なのでイミディエイトウィンドウが使えますが、frm2 を表示した後で上の一文を直接実行してもだめですか?


ありがとうございます。ステップ実行してみました。
frm2が開くとき(開く直前)にシート②から各オプションボタンに値を返したいのに、実行するとすぐにfrm2が出てきました。。

[返信 9] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : 甘納豆     投稿日時 : 2023/09/29(Fri) 13:07:46
higeru様

オブジェクト名(frm2)と書いていたものを「Private Sub UserForm_Initialize()」に変えたら実行できました。。

そして
frm2.Show vbModeless
の部分も、これで実行できなかったのでvbModalに変えました。。

かなり不勉強だなと痛感しましたので精進します。
(なでこれがOKであれがNGなのか、根本原因を理解できていないです・・)


ありがとうございます!

[返信 10] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/29(Fri) 13:10:11
■[返信 9] 甘納豆さん(2023-09-29 13:07:46)の記事
> オブジェクト名(frm2)と書いていたものを「Private Sub UserForm_Initialize()」に変えたら実行できました。。

 あ! 気付いてませんでした。^^; そこ変えちゃダメですぅ。

[返信 11] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/29(Fri) 13:15:51
■[返信 9] 甘納豆さん(2023-09-29 13:07:46)の記事
> frm2.Show vbModeless
> の部分も、これで実行できなかったのでvbModalに変えました。。

 これは直接の関係はありません。

■[返信 10] higeruさん(2023-09-29 13:10:11)の記事
> ■[返信 9] 甘納豆さん(2023-09-29 13:07:46)の記事
> > オブジェクト名(frm2)と書いていたものを「Private Sub UserForm_Initialize()」に変えたら実行できました。。

>  あ! 気付いてませんでした。^^; そこ変えちゃダメですぅ。

 間際らしい書き方だったかもですが、UserForm_Initialize の名前を変えてはいけません、ということです(UserForm1 とか UserForm2 ではなく "UserForm" ですから)。

[返信 12] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/29(Fri) 14:34:43
 今更だし本質的な問題ではありませんが、

■[質問] 甘納豆さん(2023-09-29 09:00:05)の記事
> わかりやすさのため、オプションボタンにもオブジェクト名を付けており、“1チーム目1行目の表示”“1チーム目1行目の非表示”という安直なオブジェクト名です。

“1チーム目1行目の表示”といったオブジェクト名は付けられません。少なくとも 2016 では。365 で変わったのしょうか?!

[返信 13] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : 甘納豆     投稿日時 : 2023/09/30(Sat) 08:40:29
■[返信 12] higeruさん(2023-09-29 14:34:43)の記事
>  今更だし本質的な問題ではありませんが、

> ■[質問] 甘納豆さん(2023-09-29 09:00:05)の記事
> > わかりやすさのため、オプションボタンにもオブジェクト名を付けており、“1チーム目1行目の表示”“1チーム目1行目の非表示”という安直なオブジェクト名です。

> “1チーム目1行目の表示”といったオブジェクト名は付けられません。少なくとも 2016 では。365 で変わったのしょうか?!

ありがとうございます!
正しくは「チーム①の1行目」でした。
365を使用していますが同じく最初は数字を使えません、すみません!


そしてvbmodelessだとできなくてvbmodalだとできるのは関係ないのですね、、
しかし先のコードだとダメだったんですが、ここも私の不勉強で原因不明です、、泣

[返信 14] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/30(Sat) 09:36:11
■[返信 13] 甘納豆さん(2023-09-30 08:40:29)の記事
> そしてvbmodelessだとできなくてvbmodalだとできるのは関係ないのですね、、

 はい、少なくともシート→フォームの取り込みがされない件に関しては無関係です。
 

[返信 15] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/09/30(Sat) 09:37:54
 ということで、もともとの質問に対しては解決したと思うので、新たな質問があれば別スレッド立てましょう。

[返信 16] Re : ユーザーフォームとエクセルシートの相互値渡し
投稿者 : higeru     投稿日時 : 2023/10/02(Mon) 09:53:13
■[返信 13] 甘納豆さん(2023-09-30 08:40:29)の記事
> > > わかりやすさのため、オプションボタンにもオブジェクト名を付けており、“1チーム目1行目の表示”“1チーム目1行目の非表示”という安直なオブジェクト名です。
> >
> > “1チーム目1行目の表示”といったオブジェクト名は付けられません。少なくとも 2016 では。365 で変わったのしょうか?!

> ありがとうございます!
> 正しくは「チーム①の1行目」でした。

 現状のオプションボタンの名前のままでも UserForm_Initialize は(15 行目まであるとして)以下のように簡素化できます。ただしチーム②以降はシートとの対応が不明なので "For team = 1 to 1" にしています。ところで、これオプションボタンである必然性はありますかね? チェックボックスでよくないですか?

Private Sub UserForm_Initialize()
    Dim ws As Worksheet: Set ws = Worksheets("行の表示管理")
    Dim team As Long
    For team = 1 To 1
        Dim teamName As String: teamName = "チーム" & ChrW(9311 + team)
        Dim line As Long
        For line = 1 To 15
            With ws
                Me.Controls(teamName & "の" & line & "行目の表示") = .Cells(line, 1)
                Me.Controls(teamName & "の" & line & "行目の非表示") = .Cells(line, 2)
            End With
        Next
    Next
End Sub

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2026-04-03 12:32:57 )
タイトルとURLをコピーしました