外出自粛中でも楽しく過ごす!QAまとめ>>

いつもお世話になっております。

メッセージボックスに表示する文字の大きさを大きくしたいと思っています。
ネットで調べてみたのですが、太字にするというのがあったのですが
フォントサイズを変更するというのが見つかりませんでした。


マクロでセル内の文字サイズを変更する場合、
------------------
Columns("X").Font.Size = 16
------------------

で設定できるので、「Font.Size = 値」つまり
------------------
MsgBox Font.Size = 16 "おはよう"
------------------

で設定できそうな気がします。
ですが、やってみたところ構文エラーで実行できませんでした。

もしかして、メッセージボックスの中のフォントサイズは変更できないのでしょうか?

すいませんが詳しい方、説明の上手な方、直接、コードで説明できる方、
お手数ですが教えて下さい。よろしくお願いします。

質問者からの補足コメント

  • No.4 WindFallerさんへ

    お礼に書いたとおり、
    ユーザーフォームの「Label1」のフォント設定をプロパティウインドウから変更する
    場合について画像を貼り付けておきます。

    あとNo.4さんの教えてくれた、
    ユーザーフォームの様々な設定方法 http://excel-ubara.com/excelvba3/ 
    はすごく参考になります。
    こちらも参考にどうぞ。

    「メッセージボックスに表示する文字を大きく」の補足画像1
      補足日時:2016/08/05 00:04

このQ&Aに関連する最新のQ&A

A 回答 (5件)

No.3 の補足です。


ユーザーフォームについて、作り方、表示方法などは、ここでは書ききれないので次のサイトに細かく説明されているようなので紹介しておきます。
http://excel-ubara.com/excelvba3/

ユーザーフォームを使えば、ボタンの配置や文字などもかなり自由に出来ますが、その分どうしてもやらなければいけないことが増えてしまいます。ですが背景に絵とかも設定できるので凝ったものが作れます。
    • good
    • 4
この回答へのお礼

ご解答ありがとうございます。

リンク先を確認しました。
このページはユーザーフォームについて
詳しく書かれていてすごく参考になります。

「ユーザーフォームの方がいいかも、、、」とは思っていたのですが、
メッセージボックスの方が手軽なイメージがあったので、
今回、質問させて頂きました。

ですが、みなさんのおっしゃるとおり、
ユーザーフォームの方が手軽ですし、
教えて頂いたリンク先も参考にすると
レイアウト上ほとんど希望のものができそうです。

今回はご解答頂きありがとうございました。
機会がありましたらまたお願いします。

お礼日時:2016/08/04 23:52

#3さんのおっしゃるような、たぶん、UserForm のことだとは思いますが、そちらのほうが良いように思います。



#2さんのリンク先 https://oshiete.goo.ne.jp/qa/800236.html #1
「メインのフォーム以外にフォームモジュールを追加して、そのフォームをメッセージボックスそっくりに作って、(ラベルとか、ボタンとかで)、」

確かに、フォームのラベルが、MsgBox に一番似ているのでやってみようとしましたが、私には、DialogのLabel のフォントさえ変えられない始末です。果たしてできたのでしょうか。


Dim ds As DialogSheet
 Set ds = DialogSheets("Dialog1")
 With ds
''  .Labels(1).Charactors.Font.Size =16 'これはできません。
  .Labels(1).Text = "Hello World!"
  .Show
 End With
'//

Sub TestRichTextBox()
With UserForm1
  .RichTextBox1.Font.Size = 16
  .RichTextBox1.Text = "Hello World! (RichTextBox)"
  '--------------------------
  .TextBox1.Font.Size = 16
  .TextBox1.Text = "Welcome Japan (TextBox)"
  .Show 0
End With
End Sub

このように、RichTextBox でも、TextBox でも、UserForm なら問題はありません。(RichTextBox は、ActiveX のCompabilityの変更が必要です)

今さら、VB6のテクニックだけを追いかけて、APIやDll やOCX のコントロールで、文字サイズを求めるというのは、VB6を持つ人も少ないだろうし、Windows 7にさえ、通常ではインストールできません。

説明のうまい下手は関係がないでしょうけれども、私も何度も、この質問には遭遇はしています。当時は、レジストリを書き換えるという回答が多かったとは思いますが、手動で変えるものです。今は場所もはっきりしません。残念ながら、あまり期待した結果には結びつかないように思います。
    • good
    • 2
この回答へのお礼

ご解答ありがとうございます。
No.3さんへのお礼で書いたようにメッセージボックスのフォントの変更がここまで複雑だとは知りませんでした。
なのでNo.3さん、WindFallerさんのアドバイス通り、ユーザーボックスを利用しようと思います。

ユーザーボックスの場合、ラベルとテキストボックスがあり、
どちらもプロパティのフォントで手軽にフォントサイズを変更できますので。

メッセージボックスにこだわっているわけではないので、
ユーザーボックスを利用しようと思います。

いつも丁寧なご解答ありがとうございます。機会がありましたら、またお願いします。

追記
補足コメントのところにユーザーフォームのテキストボックスとラベルの
フォントサイズの変更方法を貼り付けておきます。
参考になれば幸いです。

お礼日時:2016/08/04 23:45

フォームを使って独自のメッセージボックスを作ってしまうのが一番だと思います。

    • good
    • 2
この回答へのお礼

ご解答ありがとうございます。
まさかメッセージボックスのフォント設定がこんなに複雑だとは知りませんでした。
アドバイスとおりユーザーフォームを利用することにします。

今回はアドバイスありがとうございます。機会がありましたらまたお願いします。

お礼日時:2016/08/04 19:04

こんにちは



既出の質問を検索すると何度か繰り返し質問されているようです。
https://oshiete.goo.ne.jp/qa/384428.html
https://oshiete.goo.ne.jp/qa/800236.html

同じような不便さを感じて、アドインやDLLを作成なさっている方もいらっしゃるようです。
http://www.h3.dion.ne.jp/~sakatsu/ktMsgBox_Serie …
http://homepage2.nifty.com/nonnon/Download/NonMs …
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

http://bit.ly/2aEii4D http://bit.ly/2aSCymZ の件、
アドバイスありがとうございます。

さすがにここまで必要ないので、
No.3さん、No.4さんのアドバイス通り、
ユーザーフォームを利用しようと思いまいます。

正直なところ、まさかフォントのサイズを設定するのに、
ここまでの設定が必要だと思っておりませんでしたので。

あと既出の質問の件ですが、「教えて!goo」の「Q&Aを検索」に
キーワードを入力してみたのですが的外れなものがヒットして、
あまり精度がよくありません。

おっしゃる通り「先に既出の質問を見たい」という気持ちはあるので、
もし何かコツがあるのでしたら、教えて頂ければありがたいです。

いつもご解答頂きありがとうございます。機会がありましたらまたお願いします。

お礼日時:2016/08/04 18:30

特定のメッセージだけ大きくしたいのでしたら見当違いですが、すべてのメッセージボックスのフォントサイズを変更するのであれば下記の方法で可能です。



OSのバージョンによって微妙に違いますが、Windows10の場合だとディスプレイの設定から「ディスプレイの詳細設定」を選択し、その中にある「テキストやその他の項目のサイズ調整」を選択してメッセージボックスのフォントサイズを変更することができます。
他のバージョンでもディスプレイの設定から入っていけばどこかで設定できるようになっています。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

>特定のメッセージだけ大きくしたいのでしたら見当違いですが

ご指摘の通り、こちらで触れているのは以下のコマンドで表示する
マクロのMsbBox(メッセージボックス)という機能のことです。
------------------
MsgBox "おはよう"
------------------

ですが使用しているタブレットがWindows10ですので参考になりました。
ご解答ありがとうございます。

追記
ご興味がおありでしたら、
「開発」タグ、「Visual Basic」、「挿入」、で以下の通りコマンドをコピペして、

Sub Macro1()
MsgBox "おはよう"
End Sub

と入力してから「マクロ」、「Macro1」を実行してみてください。
ご参考までに。

お礼日時:2016/08/04 18:43

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフォントの大きさ

Msg_box 関数 でメッセージを出力しているのですが
マーク(注意、警告 etc)を用いての表現の方法しかないのでしょうか?
 例えば メッセージのフォントのサイズを各々メッセージによって
     変えれないのでしょうか?
初歩的なご質問で申し訳御座いません
宜しくお願いします

Aベストアンサー

一応サンプルを作りました。
やってみて面白かったけど、やはりオリジナルを作ったほうがかなり楽だということを実感しました。

注意:
ここの掲示板は文字がずれるので、図形が壊れます。以下の文章をメモ帳などのテキストエディタにコピって読んでください。

・・・さて本題・・・


※メッセージボックスの構造
┏━━━━━━━━━━━━━━━━┓
┣━━━━━━━━━━━━━━━━┫
┃                ┃
┃ ┏━┓ ┏━━━━━━━━┓ ┃
┃ ┃I┃ ┃MSG_AREA┃ ┃
┃ ┗━┛ ┗━━━━━━━━┛ ┃
┃                ┃
┃   ┏━━┓  ┏━━┓   ┃
┃   ┃B1┃  ┃B2┃   ┃
┃   ┗━━┛  ┗━━┛   ┃
┗━━━━━━━━━━━━━━━━┛
[I]・・・アイコン(クラス名:Static)
[MSG_AREA]・・・メッセージ表示領域(クラス名:Static)
[B1/B2]・・・ボタン(クラス名:Button)
という構造になっています

メッセージボックスは指定のスタイルによりアイコンの有無・ボタンの数が変化します。
また、メッセージ文字数により、メッセージの表示領域が変更され、ダイアログのサイズも算出されます。
しかもこの大きさの計算は、ダイアログオブジェクトが創生される前に行われるため、フォントを指定したあと、独自で再配置をしなければなりません。この計算ロジックは非常にややこしいものです。


※VBのMsgBox関数(またはAPIMassegeBox関数)内部で行われていると思われる手順(フックしてSpyで調べました)
1.MSGの文字数/ボタンの数/アイコンの有無により、ダイアログの大きさの算出・各オブジェクトの配置位置の算出
2.ダイアログ本体を創生
3.ボタンをダイアログ内部に創生(複数のボタンが存在するとき、左側のボタンから創生)
4.アイコンがあるならアイコンを創生
5.メッセージを創生
6.ボタンにフォーカスをセット
7.画面に表示する(サンプルではここで操作しています)
という順序のようです。


サンプルは、画面に表示する直前にフォントを指定しています。上記で述べたとおり、各オブジェクトはすでにできあがってしまっているので、再配置が必要になります。(サンプル内のsetResize関数を作りこんでください)


以下を標準モジュールに貼り付けて、Sub Mainから実行するようにしてください。
[myMsgBox関数]がオリジナルMsgBoxを呼ぶための関数です。



Option Explicit

Public Const WH_CBT = 5

'太文字([400/700]にしているけど、フォントによって違うかも?)
Public Enum MY_BOLD
  MYB_FLASE = 400
  MYB_TRUE = 700
End Enum
'斜体
Public Enum MY_ITALIC
  MYI_FLASE = 0
  MYI_TRUE = 1
End Enum
'下線
Public Enum MY_UNDERLINE
  MYU_FLASE = 0
  MYU_TRUE = 1
End Enum
'取消し線
Public Enum MY_STRINKEOUT
  MYS_FLASE = 0
  MYS_TRUE = 1
End Enum


Public Const HCBT_ACTIVATE = 5 ' ウィンドウがこれからアクティブになる通知メッセージ

Public Const WM_SETFONT = &H30 'フォントを指定
Public Const WM_GETFONT = &H31 'テキストボックス、ラベル等が現在使っているフォントのハンドル

Public Const LF_FACESIZE = &H20
Public Const POINT_PER_INCH = 72
Public Const LOGPIXELSY = 90 '縦方向の1論理インチあたりのピクセル数

Public Const HWND_TOP = 0
Public Const HWND_BOTTOM = 1
Public Const HWND_TOPMOST = (-1)
Public Const HWND_NOTOPMOST = (-2)
Public Const SWP_NOSIZE = &H1&
Public Const SWP_NOMOVE = &H2&
Public Const SWP_NOZORDER = &H4&
Public Const SWP_NOREDRAW = &H8&
Public Const SWP_NOACTIVATE = &H10&
Public Const SWP_FRAMECHANGED = &H20&
Public Const SWP_SHOWWINDOW = &H40&
Public Const SWP_HIDEWINDOW = &H80&
Public Const SWP_NOCOPYBITS = &H100&
Public Const SWP_NOOWNERZORDER = &H200&
Public Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Public Const SWP_NOREPOSITION = SWP_NOOWNERZORDER


Public Type LOGFONT
 lfHeight     As Long 'キャラクタの高さ
 lfWidth      As Long 'キャラクタの幅(0 で標準的プロポーション)
 lfEscapement   As Long '相対的出力角度(単位:1/10度)
 lfOrientation   As Long '回転角度(単位:1/10度)
 lfWeight     As Long 'キャラクタの線幅(FW_BOLD, FW_NORMAL)
 lfItalic     As Byte 'イタリックの時 Chr$(1)、通常 Chr$(0)
 lfUnderline    As Byte 'アンダーライン付きの時 1
 lfStrikeOut    As Byte '横線付きの時 1
 lfCharSet     As Byte 'キャラクタセットの指定
 lfOutPrecision  As Byte '常に OUT_DEFAULT_PRECIS = 0
 lfClipPrecision  As Byte ' 同上
 lfQuality     As Byte 'DEFAULT_QUALITY, DRAFT_QUALITY, PROOF_QUALITY
 lfPitchAndFamily As Byte 'DEFAULT_PITCH,FIXED_PITCH, VAIABLE_PITCH
 lfFaceName    As String * LF_FACESIZE 'タイプフェース名
End Type

Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByRef wParam As Long, ByRef lParam As Any) As Long
Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Public Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long


Private mHookProcWnd  As Long 'フックプロセスハンドル
Private mFontHandle   As Long '作成したフォントハンドル

Public Sub Main()
  Call myMsgBox("鈴木 宗○", vbOKCancel Or vbQuestion)
End Sub

'メッセージボックスの初期設定
Public Function myMsgBox( _
        inPrompt As String _
        , Optional inButtons As VbMsgBoxStyle = vbOKOnly _
        , Optional inTitle As String = "vs 辻本 清○" _
        , Optional inHelpFile _
        , Optional inContext _
        ) As VbMsgBoxResult
  'フック
  mHookProcWnd = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, App.hInstance, App.ThreadID)
  
  'メッセージボックスを呼ぶ
  myMsgBox = MsgBox(inPrompt, inButtons, inTitle, inHelpFile, inContext)
  
  'メッセージボックスで作成されたフォントを削除する
  Call delFont
End Function

'フック関数
Private Function MsgBoxHookProc _
    (ByVal nCode As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
  
  Static staFlg  As Boolean 'ワーキングフラグ
  
  'システムがウィンドウをアクティブ化しようとしている
  If nCode = HCBT_ACTIVATE Then
    If staFlg Then
      Exit Function
    End If
    staFlg = True
    
    'フォントを設定する
    Call setFont(wParam, 30, MYB_TRUE, MYI_TRUE, MYU_TRUE, MYS_TRUE)
    
    'オブジェクトのリサイズ
    Call setResize(wParam)
    
    Call UnhookWindowsHookEx(mHookProcWnd)
    staFlg = False
  End If
  ' フック関数の継続を中止
  MsgBoxHookProc = False
End Function

Private Sub setFont( _
    inOwnerWnd As Long, _
    Optional ByVal inFontSize As Single = -1, _
    Optional ByVal inBold As MY_BOLD = MYB_FLASE, _
    Optional ByVal inItalic As MY_ITALIC = MYI_FLASE, _
    Optional ByVal inUnderLine As MY_UNDERLINE = MYU_FLASE, _
    Optional ByVal inStrikeOut As MY_STRINKEOUT = MYS_FLASE _
    )

  Dim udtLOGFONT As LOGFONT
  Dim lngDC    As Long
  Dim lngWk    As Long
  Dim lngMsgWnd  As Long 'メッセージボックスのメッセージ部分のハンドル
  
  
  'すでに作成済みのフォントを削除
  Call delFont
  
  'メッセージボックスの中の、メッセージ部分のハンドルを得る
  lngMsgWnd = getWndMsg(inOwnerWnd)
  
  'デバイスコンテキストを得る
  lngDC = GetDC(lngMsgWnd)
  
  '現在のフォントのハンドルを取得
  lngWk = SendMessage(lngMsgWnd, WM_GETFONT, 0, 0&) And &HFFFF&
  
  ' フォント属性を取得
  Call GetObject(lngWk, Len(udtLOGFONT), udtLOGFONT)
  
  '新しい設定を行う
  With udtLOGFONT
    'フォントサイズ/太字/斜体/下線/取消し線
    If inFontSize > 0 Then
      .lfHeight = inFontSize * (GetDeviceCaps(GetDC(inOwnerWnd), LOGPIXELSY) / POINT_PER_INCH) * (udtLOGFONT.lfHeight / Abs(udtLOGFONT.lfHeight))
    End If
    .lfWeight = inBold
    .lfItalic = inItalic
    .lfUnderline = inUnderLine
    .lfStrikeOut = inStrikeOut
  End With
  
  '論理フォントの作成
  mFontHandle = CreateFontIndirect(udtLOGFONT)
  'DCへの関連付け
  Call SelectObject(lngDC, mFontHandle)
  'フォントを指定
  Call SendMessage(ByVal lngMsgWnd, ByVal WM_SETFONT, ByVal mFontHandle, 0&)

End Sub

'フォントオブジェクトの削除
Private Sub delFont()
  If mFontHandle <> 0& Then
    Call DeleteObject(mFontHandle)
    mFontHandle = 0
  End If
End Sub

'メッセージボックスの中の、メッセージ部分のハンドルを得る
Private Function getWndMsg(inWnd As Long) As Long
  Dim lngWnd1 As Long
  Dim lngWnd2 As Long
  
  'メッセージボックスには「Static」クラスを持つオブジェクトが1個か2個ある
  '1個の時は メッセージ
  '2個の時は 最初のStaticはアイコン/次にメッセージ
  
  lngWnd1 = FindWindowEx(inWnd, 0&, "Static" & vbNullChar, vbNullString)
  lngWnd2 = FindWindowEx(inWnd, lngWnd1, "Static" & vbNullChar, vbNullString)
  
  '2個目が存在していたら2個目、そうじゃなけりゃ1個目のハンドルを返す
  getWndMsg = IIf(lngWnd2 <> 0&, lngWnd2, lngWnd1)
End Function

'オブジェクトのリサイズ
'(ここは作りこまないといけない。計算ロジック大変そう・・・・)
Private Function setResize(inWnd As Long)
  Dim lngWidth  As Long
  Dim lngHeight  As Long
  Dim lngWnd1   As Long
  Dim lngWnd2   As Long
  
  '本当はここで再配置ロジックを行う(ボタン/アイコン/メッセージ)の各ハンドルを得て、サイズを変更
  'ここに載っているのは、あくまでサンプルです
  'ボタン数が2個限定ですのでお間違いないように!!!!!!!!!!!!!!
  
  '画面サイズを取得
  lngWidth = (Screen.Width \ Screen.TwipsPerPixelX)
  lngHeight = (Screen.Height \ Screen.TwipsPerPixelY)
  
  'メッセージボックスを座標(0,0)へ表示/メッセージボックスを画面サイズに表示
  Call SetWindowPos(inWnd, 0, 0, 0, lngWidth, lngHeight, _
           SWP_NOZORDER Or SWP_NOACTIVATE)
  
  'メッセージ
  Call SetWindowPos(getWndMsg(inWnd), 0, 0, 0, lngWidth \ 2, lngHeight \ 2, _
           SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_NOMOVE)
          
  'ボタン1(大きさそのまま/配置変更)
  lngWnd1 = FindWindowEx(inWnd, 0&, "Button" & vbNullChar, vbNullString)
  Call SetWindowPos(lngWnd1, 0, 0, lngHeight - 50, 0, 0, _
           SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_NOSIZE)
  
  'ボタン2(大きさ変更/配置変更)
  lngWnd2 = FindWindowEx(inWnd, lngWnd1, "Button" & vbNullChar, vbNullString)
  Call SetWindowPos(lngWnd2, 0, lngWidth - 400, lngHeight - 500, 300, 300, _
           SWP_NOZORDER Or SWP_NOACTIVATE)
End Function

一応サンプルを作りました。
やってみて面白かったけど、やはりオリジナルを作ったほうがかなり楽だということを実感しました。

注意:
ここの掲示板は文字がずれるので、図形が壊れます。以下の文章をメモ帳などのテキストエディタにコピって読んでください。

・・・さて本題・・・


※メッセージボックスの構造
┏━━━━━━━━━━━━━━━━┓
┣━━━━━━━━━━━━━━━━┫
┃                ┃
┃ ┏━┓ ┏━━━━━━━━┓ ┃
┃ ┃I┃ ┃MSG_AREA┃ ┃
┃ ┗━┛ ┗━━━━━━━━┛ ┃
┃         ...続きを読む

QMsgBoxについて

MsgBoxに表示させる文字の大きさや文字の色(赤)を指定する方法を教えて下さい、

Aベストアンサー

色を変えるまではやってませんが、、、
※太字
※斜体
※アンダーライン
※取り消し線
※フォントサイズ
の設定を可能としたメッセージボックスのサンプルを載せました。
VBの標準機能のみでは無理で、APIでMSGBOXを作り直すようなものなので、極めて面倒です。

フォームで作ることをお勧めします。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=384428

QMSGBOXのフォント大きさ変更

msgboxのフォント変更に関しては、既に質問NO.384428「フォントの大きさ」に解決策が示されています。
その回答の中の、「msgboxとそっくり同じ物はちょっと面倒ですが、フォントサイズを変えて、表示するだけでしたら、Formとラベルとボタンだけですので、そんなに難しくはないと思います。」という方法に関して、出来れば具体的に教えていただきたいのですが。

Aベストアンサー

私の回答ですよね?
考え方は#1さんのおっしゃる通りなので、サンプルを作ってみました。
(私はUnloadしてますが)

どの程度、メッセージボックスに似せればいいのか分からなかったので、
少々長くなってしまいました。

テストをあまりしてませんので、バグがあるかもしれません。
そのまま使わない方がいいかも・・・
★は設定しておけば、プログラム内に書かなくてよいです。

'******* Form1(Main Form) 適当です。********
Private Sub Command1_Click()
  If (MsgBox2("testです" & Chr(13) & "いいですか?", vbYesNo, "Test") = vbYes) Then
    MsgBox "Yes"
  Else
    MsgBox "No"
  End If
End Sub

'******* Form2(MsgBox)********
'Command1(0)~Command1(2)
'Label1
'を貼り付けてください。
Private Sub Command1_Click(Index As Integer)
  Select Case Command1(Index).Caption
    Case "OK"
      MsgNo = vbOK
    Case "Cancel", "キャンセル"
      MsgNo = vbCancel
    Case "中止"
      MsgNo = vbAbort
    Case "再試行"
      MsgNo = vbRetry
    Case "無視"
      MsgNo = vbIgnore
    Case "はい"
      MsgNo = vbYes
    Case "いいえ"
      MsgNo = vbNo
  End Select
  Unload Me
End Sub

'******* Module1(標準モジュール)********
Public MsgNo As Long

Public Function MsgBox2(Prompt As String, Optional buttons As VbMsgBoxStyle = vbOKOnly, Optional Title As String) As VbMsgBoxResult
  Dim BCnt As Integer 'ボタン数
  Dim Y As Long '最後のボタンの右位置
  Load Form2
  With Form2
    'タイトル設定
    If (Title <> "") Then
      .Caption = Title
    Else
      .Caption = App.EXEName
    End If
    'メッセージ設定
    With .Label1
      .Move 200, 200 '★
      .AutoSize = True '★
      .Caption = Prompt
      'ボタンの設定
      Select Case buttons
        Case vbOKOnly
          Y = Button_Set(.Top + .Height, "OK")
        Case vbOKCancel
          Y = Button_Set(.Top + .Height, "OK", "Cancel")
        Case vbAbortRetryIgnore
          Y = Button_Set(.Top + .Height, "中止", "再試行", "無視")
        Case vbYesNoCancel
          Y = Button_Set(.Top + .Height, "はい", "いいえ", "キャンセル")
        Case vbYesNo
          Y = Button_Set(.Top + .Height, "はい", "いいえ")
        Case vbRetryCancel
          Y = Button_Set(.Top + .Height, "再試行", "キャンセル")
      End Select
    End With
    'フォームのサイズおよび表示位置設定
    If (.Label1.Left + .Label1.Width > Y) Then
      Y = .Label1.Width + .Label1.Left * 2
    Else
      Y = Y + .Label1.Left * 2
    End If
    .Move (Screen.Width - .Width) / 2, (Screen.Height - .Height) / 2, Y, .Command1(0).Top + .Command1(0).Height + 500
    'メッセージボックス表示
    .Show vbModal
  End With
  MsgBox2 = MsgNo
End Function

Private Function Button_Set(ByVal CapY As Long, ByVal Cap0 As String, Optional ByVal Cap1 As String = "", Optional ByVal Cap2 As String = "") As Long
  Dim Y As Long
  With Form2
    With .Command1(0)
      .Top = CapY + 200
      .Left = 200 '★
      .Caption = Cap0
      Y = .Left + .Width
    End With
    With .Command1(1)
      If (Cap1 <> "") Then
        .Top = CapY + 200
        .Left = .Parent.Command1(0).Left + .Parent.Command1(0).Width + 200 '★
        .Caption = Cap1
        Y = .Left + .Width
      Else
        .Visible = False
      End If
    End With
    With .Command1(2)
      If (Cap2 <> "") Then
        .Top = CapY + 200
        .Left = .Parent.Command1(1).Left + .Parent.Command1(1).Width + 200 '★
        .Caption = Cap2
        Y = .Left + .Width
      Else
        .Visible = False
      End If
    End With
  End With
  Button_Set = Y
End Function

プログラムの書き方に文句は言わないように!

私の回答ですよね?
考え方は#1さんのおっしゃる通りなので、サンプルを作ってみました。
(私はUnloadしてますが)

どの程度、メッセージボックスに似せればいいのか分からなかったので、
少々長くなってしまいました。

テストをあまりしてませんので、バグがあるかもしれません。
そのまま使わない方がいいかも・・・
★は設定しておけば、プログラム内に書かなくてよいです。

'******* Form1(Main Form) 適当です。********
Private Sub Command1_Click()
  If (MsgBox2("testです...続きを読む

QVBSの「MsgBox」について

こんにちは。
VBSをかじり始めなので、的外れだったらご容赦を。

例えば、

MsgBox"こんにちは"

を実行したとき、
「こんにちは」の部分を
太字にしたり、色をつけたり、等、目立つような表示に
することは可能なのでしょうか?
(また、画像を挿入したりとか)

よろしくお願いします。

Aベストアンサー

以前に似たような質問があり、答えております。
参考URLを見てください。

※MsgBoxについて
http://oshiete1.goo.ne.jp/kotaeru.php3?q=405473

※ダイアログにプレビュー表示
http://oshiete1.goo.ne.jp/kotaeru.php3?q=157966


画像を差し込むことも可能ですが、メッセージボックスを加工するより、フォームを利用したほうが、ずーっと楽です。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング