|
こんばんは。
>mymsgboxで 戻り値を 例えば1にするには
>どうしたらいいでしょうか?
>準備したuserform1のモジュールには、
>
>'==================================================
>Public btn_id As Long
>Public WithEvents btn As MSForms.CommandButton
>'==================================================
>Private Sub btn_Click()
btn_id = 0 '←ここを1にします
> Me.Hide
>End Sub
一日、温泉に浸かって、頭がボーッとしているので
間違いがあるかもしれませんが(いい訳)、
「OK」、「Cancel」ボタンも追加しました。
>前準備として
>コントロールを一つも配置しないユーザーフォーム(Userform1)を
>作成しておいて下さい。
これは、前回と同じです。
標準モジュールに
'==========================================================
Sub test()
Dim ans As Long
ans = mymsgbox("Mymsgboxのテストです。「OK」ボタン又は、" & _
"「Cancel」ボタンを押して下さい。", 1)
mymsgbox IIf(ans = 0, "OK", "Cancel") & " が押されました", , 200, 200
ans = mymsgbox("Mymsgboxのテストです。" & vbLf & _
"「OK」ボタン又は、" & vbLf & _
"「Cancel」ボタンを押して下さい。", 1, 100, 100)
mymsgbox IIf(ans = 0, "OK", "Cancel") & " が押されました", , 200, 200
End Sub
'=======================================================================
Function mymsgbox(mes As String, Optional ByVal boxtype = 0, Optional ByVal myleft = 0, Optional ByVal mytop = 0) As Long
'input :mes ---表示文字列
' boxtype-- 0--「OK」ボタンのみ 1--「OK」「CANCEL」
' myleft 水平位置 mytop 垂直位置
'output :mymsgbox 押されたボタンを返す
' ok--0 cancel--1
'
Dim lbl As MSForms.Label
Dim btn1 As MSForms.CommandButton
Dim btn2 As MSForms.CommandButton
Load UserForm1
With UserForm1
.StartUpPosition = 0
.top = mytop
.left = myleft
Set lbl = .Controls.Add("Forms.Label.1")
With lbl
.top = 10
.left = 10
.Caption = mes
.Width = Len(mes) * 11
.AutoSize = True
End With
Set btn1 = .Controls.Add("Forms.CommandButton.1")
With btn1
.Caption = "OK"
.top = lbl.top + lbl.Height + 10
.AutoSize = True
End With
Select Case boxtype
Case 0
.Width = lbl.left + lbl.Width + 10
.Height = btn1.top + btn1.Height + 30
btn1.left = .Width / 2 - btn1.Width / 2
Set .btn1 = btn1
Case 1
Set btn2 = .Controls.Add("Forms.CommandButton.1")
With btn2
.Caption = "Cancel"
.top = lbl.top + lbl.Height + 10
.AutoSize = True
End With
btn1.Width = Application.Max(btn1.Width, btn2.Width)
btn2.Width = btn1.Width
.Width = Application.Max(lbl.left + lbl.Width + 10, btn1.Width + 4 + btn2.Width + 30)
.Height = btn1.top + btn1.Height + 30
btn1.left = .Width / 2 - btn1.Width - 2
btn2.left = .Width / 2 + 2
Set .btn1 = btn1
Set .btn2 = btn2
End Select
.Show
mymsgbox = .btn_id
Unload UserForm1
End With
End Function
>準備したuserform1のモジュールには、
'==============================================================
Public btn_id As Long
Public WithEvents btn1 As MSForms.CommandButton
Public WithEvents btn2 As MSForms.CommandButton
'===============================
Private Sub btn1_Click()
btn_id = 0
Me.Hide
End Sub
'===============================
Private Sub btn2_Click()
btn_id = 1
Me.Hide
End Sub
'===============================
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then '閉じるボタンを無効にする
Cancel = True
End If
End Sub
これでtestを実行して下さい。
ボタンの数が多くなるようならクラスモジュールを使用する
案も考えられますが、増えても3つまでなら上記のような方法でもよいかな?
と思います。
|
|