Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10570 / 13646 ツリー ←次へ | 前へ→

【21035】msgbox を任意の位置に表示する QP 05/1/8(土) 14:20 質問[未読]
【21036】Re:msgbox を任意の位置に表示する 鳴島亮 05/1/8(土) 14:33 発言[未読]
【21037】Re:msgbox を任意の位置に表示する QP 05/1/8(土) 14:43 質問[未読]
【21038】Re:msgbox を任意の位置に表示する QP 05/1/8(土) 14:58 発言[未読]
【21041】Re:msgbox を任意の位置に表示する IROC 05/1/8(土) 16:23 回答[未読]
【21042】Re:msgbox を任意の位置に表示する KIRI 05/1/8(土) 16:56 回答[未読]
【21053】Re:msgbox を任意の位置に表示する ichinose 05/1/8(土) 19:10 発言[未読]
【21057】Re:msgbox を任意の位置に表示する QP 05/1/9(日) 10:57 お礼[未読]
【21070】Re:msgbox を任意の位置に表示する ichinose 05/1/9(日) 19:25 発言[未読]
【21072】Re:msgbox を任意の位置に表示する QP 05/1/10(月) 8:11 お礼[未読]

【21035】msgbox を任意の位置に表示する
質問  QP  - 05/1/8(土) 14:20 -

引用なし
パスワード
   msgboxで表示されるダイヤログボックスを 任意の指定位置に
表示したいのですが できるでしょうか?

【21036】Re:msgbox を任意の位置に表示する
発言  鳴島亮  - 05/1/8(土) 14:33 -

引用なし
パスワード
   ▼QP さん:
>msgboxで表示されるダイヤログボックスを 任意の指定位置に
>表示したいのですが できるでしょうか?

残念ですが、MsgBox には 表示位置のパラメータがないようです。

他の方法として3つあげます。

1つ目、Userformをつかい表示位置指定する。

2つ目Excel97以上にある「Officeアシスタント」のバルーンをつかう。
(バルーンを特定の領域に表示されないようにする SetAvoidRectangleメソッド
があるので、その機能をうまく活用することができれば・・・)

3つ目 アドインをつかう ktMsgBoxAddin 

いろいろな所から引用しました

【21037】Re:msgbox を任意の位置に表示する
質問  QP  - 05/1/8(土) 14:43 -

引用なし
パスワード
   早速ありがとうございます。
UserFormの中で msgboxを使っているのですが
具体的にどのようにするのでしょうか?

【21038】Re:msgbox を任意の位置に表示する
発言  QP  - 05/1/8(土) 14:58 -

引用なし
パスワード
   勘違いをしてました。
userformを使えということは
msgboxを自分でuserformを使って作りなさい
ということですね。

しかし プロシージャーのforループのなかで
msgboxを出して指示を仰ぎたいので
そのような場合は 難しいですよね...
どうしたらいいんだろう。

【21041】Re:msgbox を任意の位置に表示する
回答  IROC  - 05/1/8(土) 16:23 -

引用なし
パスワード
   >しかし プロシージャーのforループのなかで
>msgboxを出して指示を仰ぎたいので
>そのような場合は 難しいですよね...

ラベルとコマンドボタンを配置して、
ユーザーフォームでメッセージボックスのようなものを作るだけですよね?
何が難しいのでしょうか?

【21042】Re:msgbox を任意の位置に表示する
回答  KIRI  - 05/1/8(土) 16:56 -

引用なし
パスワード
   こんにちは
>msgboxで表示されるダイヤログボックスを 任意の指定位置に
>表示したいのですが できるでしょうか?

普通では出来ないのでAPIを使う必要がありそうです。
E00M086 ダイアログを指定位置へ表示する
http://homepage2.nifty.com/kmado/kvba.htm
利用例としてMsgBoxを任意の位置へ表示するのがあります。

【21053】Re:msgbox を任意の位置に表示する
発言  ichinose  - 05/1/8(土) 19:10 -

引用なし
パスワード
   皆さん、こんばんは。

ユーザーフォームでMsgboxを行う簡単なサンプルです。
といっても簡単な「OK」ボタンのみの場合ですが・・・。
前準備として
コントロールを一つも配置しないユーザーフォーム(Userform1)を
作成しておいて下さい。

標準モジュールに
'=====================================================
Sub test()
   mymsgbox "MSGBOXも汎用的に作るのは、そんなに楽" & _
    "ではないですねえ!!。 これはサンプルなので「OK」ボタンのみの" & _
    "場合ですが、ボタンの数をIDによって分ける場合は更に複雑になりそうです。"
   mymsgbox "MSGBOXも汎用的に作るのは、そんなに楽" & vbLf & _
    "ではないですねえ!!。 これはサンプルなので「OK」ボタンのみの" & vbLf & _
    "場合ですが、ボタンの数をIDによって分ける場合は更に複雑になりそうです。", 100, 100
End Sub
'========================================================================
Function mymsgbox(mes As String, Optional myleft = 0, Optional mytop = 0) As Long
'input :mes ---表示文字列 myleft 水平位置 mytop 垂直位置
'output :mymsgbox 押されたボタン(今のところ、0(OKボタンが押された)を返す
  Dim lbl As MSForms.Label
  Dim btn 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 btn = .Controls.Add("Forms.CommandButton.1")
   With btn
    .Caption = "OK"
    .top = lbl.top + lbl.Height + 10
    .AutoSize = True
    End With
   .Width = lbl.left + lbl.Width + 10
   .Height = btn.top + btn.Height + 30
   btn.left = .Width / 2 - btn.Width / 2
   Set .btn = btn
   .Show
   mymsgbox = .btn_id
   Unload UserForm1
   End With
End Function


準備したuserform1のモジュールには、

'==================================================
Public btn_id As Long
Public WithEvents btn As MSForms.CommandButton
'==================================================
Private Sub btn_Click()
  btn_id = 0
  Me.Hide
End Sub


以上です。testを実行してみて下さい。
「はい」ボタンや「いいえ」ボタン等のMsgboxのバリエーションとなると
もうちょっと追加しなくてはなりませんが・・・。

確認してみて下さい

【21057】Re:msgbox を任意の位置に表示する
お礼  QP  - 05/1/9(日) 10:57 -

引用なし
パスワード
   ようやくできました!
ichinoseさんありがとうございました。

もうひとつ教えて下さい。
mymsgboxで 戻り値を 例えば1にするには
どうしたらいいでしょうか?

【21070】Re:msgbox を任意の位置に表示する
発言  ichinose  - 05/1/9(日) 19:25 -

引用なし
パスワード
   こんばんは。
>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つまでなら上記のような方法でもよいかな?
と思います。

【21072】Re:msgbox を任意の位置に表示する
お礼  QP  - 05/1/10(月) 8:11 -

引用なし
パスワード
   おはようございます。
出来ました!。ありがとうございました。
連休中にできて本当によかったです。
ボタン2個の例も今後の参考になりました。

(温泉ですか。いいなー。私も3月には行ける様
 がんばりまーす)

10570 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free