プロが教える店舗&オフィスのセキュリティ対策術

Subプロージャ―の変数にInputBoxなどから文字列を引き渡すことはよくあることだと思います。同じようなことをユーザーフォームで実現する方法を教えてください。

※ユーザーフォームには選択肢がセットされたリストボックスとコマンドボタンがあります

1、Subプロージャ―TESTを実行する
2、ユーザーフォームが開く
3、ユーザーフォームのリストボックスから値を選択
4、ユーザーフォームのコマンドボタンクリックでSubプロージャ―内の変数strにリストボックスで選択された値を格納すると同時にユーザーフォームを閉じる
5、Debug.Printでstrの値を確認する

といったようなことをしたいです。

A 回答 (3件)

下記プロシージャは一例です



標準Module1

Option Explicit
' ユーザーフォームのリストボックスが選択された値を格納するパブリック変数
Public selectedValue As String
Sub TEST()
' ユーザーフォームを表示するコード
UserForm1.Show
'標準モジュール側で出力する場合
Debug.Print selectedValue
End Sub

FormモジュールUserForm1

Option Explicit
Private Sub CommandButton1_Click()
' ユーザーフォームのコマンドボタンがクリックされた時の処理
' リストボックスで選択された値を変数に格納
If Not ListBox1.ListIndex = -1 Then ' リストボックスが選択されているか確認
selectedValue = ListBox1.List(ListBox1.ListIndex)
End If
' ユーザーフォームを閉じる
Unload Me
End Sub

Private Sub UserForm_Initialize()
' ユーザーフォームが初期化された時の処理
' リストボックスに選択肢をセット
ListBox1.AddItem "選択肢1"
ListBox1.AddItem "選択肢2"
ListBox1.AddItem "選択肢3"
' ...選択肢を追加する場合は同様にAddItemメソッドを使用
' リストボックスの選択モードを単一選択に設定
ListBox1.MultiSelect = fmMultiSelectSingle
End Sub

'UserForm側で出力する場合
'Private Sub UserForm_Terminate()
' ' ユーザーフォームが終了する時の処理
' ' リストボックスで選択された値を出力
' Debug.Print "選択された値: " & selectedValue
'End Sub

各コントロールオブジェクト名は暫定です
変数strはVBA関数Strが存在する為 selectedValue としました
出力のタイミングは仕様にあわせてください
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
希望の処理ができそうです!

お礼日時:2023/04/16 08:04

最高に手を抜いたコードの例です。



' UserForm1 のコード
' CommandButton1 は OKボタン
' CommandButton2 は キャンセルボタン

Private Sub CommandButton1_Click()
Dim rtn As String
If Me.ListBox1.ListIndex >= 0 Then
rtn = Me.ListBox1.Value
End If
Me.Tag = rtn
Me.Hide
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub UserForm_Initialize()
Me.Tag = ""
Me.ListBox1.List _
= Array("リンゴ", "みかん", "いちご", "バナナ")
End Sub


' 呼び出し元のコード

Sub TEST()
Dim str1
str1 = SelectFromList()
Debug.Print str1
End Sub

' 標準モジュールに記述することが望ましい
Function SelectFromList()
Dim tmp
UserForm1.Show
tmp = UserForm1.Tag ' UserForm1 が閉じている場合、ここでロードされる
Unload UserForm1
SelectFromList = tmp
End Function
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
.Tag などの使い方が初めてでした。

お礼日時:2023/04/16 08:06

第108回.変数の適用範囲(スコープ,Private,Public)


https://excel-ubara.com/excelvba1/EXCELVBA408.html
パブリック変数 ・・・ 全てのモジュールの全てのプロシージャーで使用可能

上記の方法を用い標準モジュールで宣言された変数は、ユーザーモジュールでも使用可能であり、即ち代入された値は標準モジュールで呼び出す事も可能かと。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。
ご回答ありがとうございます。

お礼日時:2023/04/15 22:02

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