こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBA 赤ペン先生をお願いします

皆さんこんにちは。
エクセル2013使用しているVBA初心者です。

エクセルVBAでコードをど根性&こちらで質問させていただいた時のご回答を元に
作成してみたのですが思うような動作になりません。
下記のコードが美しくないのも重々承知しておりますが
下記内容で修正するべき個所を教えていただけないでしょうか。

やりたい事は
・ユーザーフォーム5でフレームが2個あり
 1個は作成書類を7個から1つ選択
 もう1個は支社を7個から1つ選択
 →「次へ」のボタンを押すと「○○と△△支社を選択しています。お客様情報に~」のメッセージ表示
 →OK→処理を続行します→OKならユーザーフォーム4(お客様情報)を開く
  キャンセル→処理を中断します→ユーザーフォーム5を再度表示して選択し直せるように・・・
 
という事をやりたいのですが知識不足の上いくら参考書等を探しても
これだ!というものにたどりつけずに困っています。

「○○と△△支社が選択されています」の箇所も
myMSG & vbCrLf & "と" & myMSG & だと「△△と△△支社が選択されています」に
なってしまうのは理解出来ているのですが代わりにいれるコードも分かりません。

また、「メッセージ表示のOK」を押して「処理を続行しますのキャンセル」を押しても
ユーザーフォーム5に戻ることはなくユーザーフォーム4に
進んでしまう始末です。

毎度拙い質問文で申し訳ございませんが
どうか皆様のお知恵をお借りできないでしょうか。
※コードはコマンドボタン1(次へ)に書いてあります。

----------------------------------------------------------------------------------
Private Sub CommandButton1_Click()
Dim myMSG As String
Dim i As Integer
For i = 1 To 14
If Me.Controls("OptionButton" & i).Value = True Then
myMSG = Me.Controls("OptionButton" & i).Caption
End If
If (OptionButton1 Or OptionButton2 Or OptionButton3 Or OptionButton4 Or OptionButton5 Or OptionButton6 Or OptionButton7) = False Then
MsgBox ("作成する書類を選択して下さい")
Me.Hide
UserForm5.Show

End If
If (OptionButton8 Or OptionButton9 Or OptionButton10 Or OptionButton11 Or OptionButton12 Or OptionButton13 Or OptionButton14) = False Then
MsgBox ("支社を選択して下さい")
Me.Hide
UserForm5.Show
End If
Next i
intRtn = MsgBox(myMSG & vbCrLf & "と" & myMSG & "支社" & vbCrLf & "が選択されています。" & vbLf & _
"お客様情報に移動します。", _
vbOKCancel + vbExclamation + vbDefaultButton2, _
"作成書類選択")
If intRtn <> vbOK Then
MsgBox ("処理をキャンセルしました。")
Me.Hide
UserForm5.Show
End If
intRtn = MsgBox("処理を続行します。", vbOKCancel + vbExclamation + vbDefaultButton2, _
"作成書類選択")
Unload UserForm5
UserForm4.Show
If intRtn <> vbOK Then
MsgBox ("処理をキャンセルしました。")
Me.Hide
UserForm5.Show
End If


End Sub
Private Sub UserForm5_QueryClose(Cancel As Integer, CloseMode As Integer) 'Formが閉じるとき
If CloseMode = 0 Then '×ボタンを押された場合
End 'プログラムの実行を終了
End If
End Sub

投稿日時 - 2015-03-18 13:58:08

QNo.8938181

困ってます

質問者が選んだベストアンサー

その後考えて、2つ目のユーザーフォームを追加してみます。
コントロールの数やCaptionなどは、質問者の要求に比べて少なく、私の勝手にした例ですが、参考にして得るところがあれば使ってください。
処理推移は
1。UserForm1に一度選択入力する。「次へ」でUserForm2を表示。
2。Userform2にUserform1の選択を引き継ぐ。
3.UserForm2をみて,「Ok」か「やり直し」の選択をする。
4.「OK」の場合、エクセルシートでの処理条件として使うための、
  Sheet1のA1,B1に2種類の情報をセットする。
5. 「やり直し」の場合、UserForm1を表示。ただし当初選択の痕跡は消す。
ーーー
前回答に加えて
UserForm2を追加(VBEのメニューでは挿入)します。
UserForm2にテキストボックスを2つ設けます。
またコマンドボタンを2つ設けます。
2つのボタンのCaptionは、それぞれ「OK」と「やり直し」にします。
ーー
「OK」のボタンのクリックに対しては
Private Sub CommandButton1_Click()
Worksheets("Sheet1").Range("A1") = TextBox1.Text
Worksheets("Sheet1").Range("B1") = TextBox2.Text
UserForm2.Hide
UserForm1.Hide
End Sub
ーー
「やり直し」ボタンに対しては
Private Sub CommandButton2_Click()
UserForm2.Hide
'--
Dim Ctrl As Control
For Each Ctrl In UserForm1.Controls
If TypeName(Ctrl) = "OptionButton" Then _
Ctrl.Value = False
Next Ctrl
End Sub
のコードを作成します。
ーーー
UserForm1については、前回答とほぼ同じですが、少し変えて
各オプションボタンのプロパティのTagプロパティの行に
テキストで設定します。そのテキストは選択された後で、どれを選択したかの点で使いたい文字列を設定します。(Captionでも済むのかもしれません)
Private Sub CommandButton1_Click()
For Each x In UserForm1.Controls
If InStr(x.Caption, "Option") Then
If x.GroupName = "g1" Then
If x.Value = True Then
' MsgBox x.Caption
' x1 = X.Caption
x1 = x.Tag
End If
End If
If x.GroupName = "g2" Then
If x.Value = True Then
'MsgBox x.Caption
'MsgBox x
'x2 = X.Caption
x2 = x.Tag
End If

投稿日時 - 2015-03-19 17:35:47

お礼

imogasiさん

私の下手な説明を汲み取っていただきありがとうございました。
言葉の説明をしていただいたので初心者の私には大変分かりやすく
ありがたかったです。
今は自分でも何をどうしたら良いか分かっていないようなレベルですので
少しずつレベルアップして
せめて質問くらいはまともに書けるようにならないと・・と痛感しました。
imogasiさんにいただいたご回答を元にここ2日間ひたすら挑戦して
やりたかった事が出来ました。
2回もご回答をいただけて本当に感謝しています。

投稿日時 - 2015-03-20 09:38:20

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

ここはコードを添削するコーナ、ーではなかろう。
やりたいことを分割し整理して疑問点を絞ること。
質問を文章で簡潔に述べること。
ーーー
参考までに
UserForm1を設ける。
Frame1とFrame2をUserForm1に設ける。
Frame1にはOptionボタンを3つ、Frame2には2つ設ける(数は勝手に減らした。コードはあまり変わらないはず)
Frame1のOptionボタンにはそれぞれ、GroupNameにはg1、Frame2のOptionボタンにはそれぞれGroupNameにはg2を設定しておく(各Optionボタンのプロパティウインドウズのところで入力)。
UserForm1にコマンドボタンを1つ設ける。Captionを「次へ」にする。
Private Sub CommandButton1_Click()
For Each x In UserForm1.Controls
If InStr(x.Caption, "Option") Then
If x.GroupName = "g1" Then
If x.Value = True Then
MsgBox x.Caption
x1 = x.Caption
End If
End If
If x.GroupName = "g2" Then
If x.Value = True Then
MsgBox x.Caption
X2 = x.Caption
End If

End If
End If
Next
MsgBox x1 & " " & X2
End Sub
ーー
これでユーザーフォrムの表示(実行)で
Frame1に1つ、Frame2に1つクリックして「次へ」ボタンをクリックすると、
上記ではX1とX2に、2分野の要求が入る。
このX1,X2を以下で使ってみては。
コントロールの数などは簡略にしたが、上記でしたいことはできているのではとおもう。
ーー
1度選択したものを、それをキャンセルして再試行(再要求)する部分は質問者がまず考えること。
初心者であるならUserFormのコントロールやShowやHideやUnloadなどに凝る力はないだろう。
ワークシートのセルを使う方法を考えるべきだろう。

投稿日時 - 2015-03-18 23:51:38

ANo.1

赤ペン先生ですか。

まず、VBとVBAは違う

Excelと書いているくらいですから、Excel(マクロ)の方がカテゴリは近いです。

技術者向なのに、初心者です

間違っているのはこのあたりですかね。

投稿日時 - 2015-03-18 16:43:02

お礼

スイマセン、出直します。

投稿日時 - 2015-03-20 09:38:58

あなたにオススメの質問