プロが教えるわが家の防犯対策術!

msgboxを出すと中央に出てしまい邪魔なのでいちを変えたいのですが何か良い方法はありますか?よろしくお願いします。

A 回答 (4件)

メッセージボックスの性格からすれば、ユーザーがメッセージボックスを閉じなければ呼び出し元のウィンドウをアクティブにすることはできません。


(質問者さんがイメージしている)メッセージボックスを表示させながら、ユーザーが他のウィンドウも操作できるようにしたいのであれば、MsgBox ではなく、Form を使った方が簡単です。
Form なら表示位置もサイズも決められます。
    • good
    • 3

MsgBox の用途上、問題になる仕様とは思えませんが・・・。



1、MsgBoxでは一過性の表示で即閉じるメッセージのみを表示。
2、何らかの参照すべき情報は専用フォームで表示。
3、単なる警告等で1、2秒で自動的に閉じて欲しいメッセージも専用フォームで表示。

と、表示方式を使い分ければ宜しいかと・・・。
    • good
    • 0

Windowsのメッセージをフックすれば可能ですが、APIやフックについての知識がないと難しいかも。


一応、サンプルらしきものは見つけました。(私は検証していませんが。)
http://homepage1.nifty.com/rucio/main/technique/ …
    • good
    • 0

「msgbox 表示位置」でGoogleで検索して出てきたVB6の結果



3.メッセージボックスを使い倒す
http://homepage1.nifty.com/rucio/main/technique/ …

VB.NETは知らないが(汗
    • good
    • 1

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

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

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

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

QExcel VBAメッセージボックスの表示位置が右下になってしまう

ExcelのVBAでメッセージボックスを作成しましたが、
表示される位置がなぜが画面右下の端っこになってしまいます。
通常通り画面中央にメッセージボックスが表示されるにはどうすればよいでしょうか?
またこうなってしまった原因はなんでしょうか?
VBA初心者です。よろしくお願いします。

Aベストアンサー

UserFormのプロパティ
StartUpPositionの値を1に変更

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

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

Aベストアンサー

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

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

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

Aベストアンサー

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

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

Qvbaでmsgboxの位置を指定

http://oshiete.goo.ne.jp/qa/5253604.html
を参考に、http://homepage1.nifty.com/rucio/main/technique/MsgBox.htmをやってみたのですが
うまくいきません。

検証はエクセル・アクセス2007で行いました。

//////////////////////////////////////////////////////////////////
Option Explicit

Dim App As Object

Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long

Private 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 wFlags As Long) As Long

Const WH_CBT = 5
Const HCBT_ACTIVATE = 5
Public Const SWP_NOSIZE = &H1 '「サイズを指定しない」オプション
Public Const SWP_NOZORDER = &H4 '「Zオーダーを指定しない」オプション
Public Const SWP_NOACTIVATE = &H10

Dim HookHandle As Long '元のCBTProcプロシージャへのハンドル

Dim m_Left As Long 'メッセージボックスのX座標
Dim m_Top As Long 'メッセージボックスのY座標
Public Sub SetMsgBox(Left As Long, Top As Long)

m_Left = Left
m_Top = Top
HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.Hinstance, App.ThreadID)

End Sub
Private Function CBTProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Dim Ret As Long

If nCode = HCBT_ACTIVATE Then
Ret = SetWindowPos(wParam, 0, m_Left, m_Top, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE)
Ret = UnhookWindowsHookEx(HookHandle)

End If

CBTProc = Ret

End Function
//////////////////////////////////////////////////////////////////
を標準モジュールに貼りつけました。

Dim App As Objectについては、参考のページにはありませんでしたが
エラーになるので勝手にObjectにしました。

そしてこのコードを書いた標準モジュールに

Sub test()
SetMsgBox 0, 0
MsgBox "この例では左上に表示されます。"
End Sub

を足しました。

そして実行すると、
HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.Hinstance, App.ThreadID)
の部分で
オブジェクト変数または With ブロック変数が設定されていません。(Error 91)
になります。


VBAでの位置の指定方法を教えてください!!!

http://oshiete.goo.ne.jp/qa/5253604.html
を参考に、http://homepage1.nifty.com/rucio/main/technique/MsgBox.htmをやってみたのですが
うまくいきません。

検証はエクセル・アクセス2007で行いました。

//////////////////////////////////////////////////////////////////
Option Explicit

Dim App As Object

Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
...続きを読む

Aベストアンサー

mitarashi さんの回答が無ければ投げ出していました。。
あれぇ? メッセージボックスではなくてExcelが移動してしまうよ??
Sub test()
SetMsgBox 0, 0
MsgBox "この例では左上に表示されます。"
End Sub
は、VBE上で実行してはダメなんですね。。
Excelに戻ってマクロの実行で test を行ったら出来ました。

Access2010 だとどうかなと?調べて以下のように加えたら出来ました。
意味は全く理解していません (^^ゞ コピペッタンしただけです。
子供が絵本見ながら脳外科の手術を行っているようなものです orz


'VB6 の App.ThreadID の代わり
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

'VB6 の App.hInstance の代わり ExcelではApplication.hInstance のみで可、 Access用
Private Const GWL_HINSTANCE = (-6)
Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long


'HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.hInstance, App.ThreadID) 'VB6
'HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, Application.hInstance, GetCurrentThreadId) 'Excel
HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, GetWindowLong(hWndAccessApp, GWL_HINSTANCE), GetCurrentThreadId) 'Access

mitarashi さんの回答が無ければ投げ出していました。。
あれぇ? メッセージボックスではなくてExcelが移動してしまうよ??
Sub test()
SetMsgBox 0, 0
MsgBox "この例では左上に表示されます。"
End Sub
は、VBE上で実行してはダメなんですね。。
Excelに戻ってマクロの実行で test を行ったら出来ました。

Access2010 だとどうかなと?調べて以下のように加えたら出来ました。
意味は全く理解していません (^^ゞ コピペッタンしただけです。
子供が絵本見ながら脳外科の手術を行っているようなものです orz...続きを読む

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
'-------------------------------------
 
 

QMsgBoxについて

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

Aベストアンサー

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

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

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

Qメッセージボックスを前面に表示させるには?

Sub 教えて()
Dim ExAp As Application
Dim ExBk As Workbook
Dim ExSh As Worksheet

Set ExAp = CreateObject("Excel.Application")
Set ExBk = ExAp.Workbooks.Add
Set ExSh = ExBk.Worksheets(1)
ExAp.Visible = True
ExAp.WindowState = xlMaximized

ThisWorkbook.Worksheets(1).Activate
MsgBox "前面表示させたいお!"

Set ExAp = Nothing
Set ExBk = Nothing
Set ExSh = Nothing

End Sub
これを実行するとメッセージボックスが隠れてしまいます。
どうしたらよいでしょうか?

Aベストアンサー

自身のアプリケーションにフォーカスを持ってくる
という方法ですが、2種類、3通りの方法があります。
(1)自身のVisibleを切り替える
Application.Visible = False
Application.Visible = True
MsgBox "前面表示させたいお!"
(2)APIを使う方法
(A)WindowsAPIを定義する方法
Declare Function SetForegroundWindow Lib "USER32" _
    (ByVal Hwnd As Long) As Long
Sub 教えて()
SetForegroundWindow Application.Hwnd
MsgBox "前面表示させたいお!"
End Sub
(B)ExecuteExcel4Macroを使う方法
ExecuteExcel4Macro "CALL(""USER32""," _
    & """SetForegroundWindow"",""JJ""," _
    & Application.Hwnd & ")"
MsgBox "前面表示させたいお!"

(1)は簡単ですが、タスクバーでの自身のアイコン位置が
最後尾になってしまう弱点があります。
(2)はSetForegroundWindowで自身のアプリケーションに
フォーカスを取り戻しています。
(A)は正規のAPI定義手法を使っています。
(B)は以前のAPI呼び出しです。

自身のアプリケーションにフォーカスを持ってくる
という方法ですが、2種類、3通りの方法があります。
(1)自身のVisibleを切り替える
Application.Visible = False
Application.Visible = True
MsgBox "前面表示させたいお!"
(2)APIを使う方法
(A)WindowsAPIを定義する方法
Declare Function SetForegroundWindow Lib "USER32" _
    (ByVal Hwnd As Long) As Long
Sub 教えて()
SetForegroundWindow Application.Hwnd
MsgBox "前面表示させたいお!"
End Sub
(B)ExecuteExcel4Macroを使う方法
ExecuteExce...続きを読む

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)
で切り上げです。

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

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Qエクセル マクロで指定フォルダを開く

エクセルにて
指定フォルダを開く、マクロがあれば教えて頂けないでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub


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

人気Q&Aランキング