質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

4144閲覧

ユーザーフォームのクリックされたコマンドボタンのを結果を取得する

pegy

総合スコア243

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/08/19 05:21

UserForm1にCommandButton1とCommandButton2が存在し、どちらがクリックされたかによってBeforeCloseイベントの処理を分岐させたいのですがうまくいきません。。
イメージとして以下の様なイメージでコードを書いているのですが、ThisWorkBookモジュールでPatternの値を取得してくれません、解決方法にお力添え頂けますでしょうか。
宜しくお願い申し上げます。

vba

1'ThisWorkBookモジュール 2Private Sub Workbook_BeforeClose(Cancel As Boolean) 3 Dim Pattern As String 4 UserForm1.Show 5 if Pattern=A Then 6 '処理 7 Endif 8End Sub 9 10'ユーザーフォームモジュール 11Private Sub CommandButton1_Click() 12 Unload Me 13 Pattern = "A" 14End Sub 15 16Private Sub CommandButton2_Click() 17 Unload Me 18 Pattern = "B" 19End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解決済みですが、

こんな方法もあるということで、
別案を出しておきます。

UserForm1のモジュール

vba

1Option Explicit 2Private vPattern As String 3 4Public Property Get Pattern() As Variant 5 Me.Show vbModal 6 Pattern = vPattern 7 Unload Me 8End Property 9 10Private Sub CommandButton1_Click() 11 vPattern = "A" 12 Me.Hide 13End Sub 14 15Private Sub CommandButton2_Click() 16 vPattern = "B" 17 Me.Hide 18End Sub

ThisWorkBookモジュール

vba

1Private Sub Workbook_BeforeClose(Cancel As Boolean) 2 Select Case UserForm1.Pattern() 3 Case "A" 4 '処理A 5 Case "B" 6 '処理B 7 End Select 8End Sub

ユーザーフォームにプロパティ(Property)を実装して、それを参照するようにすれば、関数のように扱えてシンプルになります。動作原理については、下記で詳細に解説していますので、参考にしてください。

ユーザーフォームで入力ダイアログを作成する - hatena chips

また、グローバル変数(標準モジュールのPublic変数)を置く必要もなくなります。

グローバル変数は、コードが分散して可読性が落ち、バグの可能性が高くなるのでできれば避けると言うのが定説です。


上記の方法かちょっと難解だという場合は、
グローバル変数ではなく、
ThisWorkBookのモジュールレベル変数として宣言したほうがいいでしょう。

ThisWorkBookモジュール

vba

1Option Explicit 2Public Pattern As String 3 4Private Sub Workbook_BeforeClose(Cancel As Boolean) 5 UserForm1.Show 6 If Pattern = "A" Then 7 '処理A 8 End If 9End Sub

ユーザーフォームモジュール

vba

1Private Sub CommandButton1_Click() 2 ThisWorkbook.Pattern = "A" 3 Unload Me 4End Sub 5 6Private Sub CommandButton2_Click() 7 ThisWorkbook.Pattern = "B" 8 Unload Me 9End Sub

投稿2019/08/19 13:14

編集2019/09/10 12:56
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

標準モジュールを追加してしてください。
モジュールの先頭へ以下の行を追加してください。

Option Explicit
Public Pattern As String

さらに、ThisWorkBookモジュールの
Dim Pattern As Stringは削除してください。

投稿2019/08/19 05:52

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2019/08/19 06:21

コメントありがとうございます。 なるほど、public scopeの変数は標準モジュールに定義すればよいのですね。 大変助かりました!改めて御礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問