人気マンガがだれでも無料♪電子コミック読み放題!!

いつもお世話になっております。
エクセルにて処理が終了した時点で、VBAを使い自動的にメールを送るマクロを組みました。しかし、ユーザーからのリクエストにより、自動送信する前にメール内容を確認したいとのことで、一度このメール内容でOKかどうか聞いてから、送信するように書き換えました。そのMsgBoxは当然エクセル上に現れるのですが、特にシングルディスプレイユーザーの場合、送信用のメールが前面に出てしまい、エクセル上に表示されたMsgBoxに気が付かない人もいますので、送信用メールが作成されたら、エクセルを前面に出してMsgBoxの指示に従わせたいのですが、どう書けばいいのか分かりません。とりあえず、私がトライしてみた文字ールは下記のとおりですが、エクセルは前面には出ません(ただし、エクセルプログラム全体が点滅?しますが)。
~前略~

With myMail
.To = "abc@xxxxx.com"
.Cc = "123@xxxxx.com"
.Subject = Filename '指定済みです
.Body = strBody '指定済みです
.display '.sendの代わりにいったんここで表示させました
End With

Windows("XYZ.xls").Activate 'このワークブックで作業をしてます。全面にはでてきません。

mymsg = MsgBox("このメール内容で送信してもよろしいですか?"~中略~,vbYesNo + vbQuestion, "送信確認")
If mymsg = 6 Then
myMail.send

~後略~

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

A 回答 (3件)

Windows("XYZ.xls").Activate


のところに
VBA.AppActivate Excel.Application.Caption
を追加してみてください。
    • good
    • 10
この回答へのお礼

xls88さん、
即答感謝いたします。先ほどユーザー(と言っても同僚ですが)からのOKの返事がきました。
ありがとうございます。

お礼日時:2009/01/18 14:57

こんにちは



>Windows("XYZ.xls").Activate 'このワークブックで作業をしてます。全面にはでてきません。
         ↓
通常は、AppActivate("Microsoft Excel") の引数は、Application.Caption を使います。
しかし、うまくいかないこともありますので、その場合は、このようにします。

'-----------------------------------

Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub Test()
  Dim hwnd As Long
  Const FCLASSNAME As String = "XLMAIN"
  hwnd = FindWindow(FCLASSNAME, vbNullString)
  If hwnd > 0 Then
    SetForegroundWindow hwnd
  End If
End Sub


なお、"XLMAIN" は、Excelのクラス名
Outlook は、"rctrl_renwnd32" です。
    • good
    • 0
この回答へのお礼

Wendy02さん、
本当にいつもありがとうございます。
私にはとても思いつかない、モジュールです。。。
おっしゃる通り、Application.Captionでうまくいきました。
これでうまくいかなかったときには、上記を使わせていただきます。
システム上残念ながら、お二人に20Pを差し上げることができません。
今回は、ご回答順でPを付することにいたしますことを、ご了承ください。
ありがとうございました。

お礼日時:2009/01/18 15:00

先に確認メッセージを表示させて、OKをクリックしてから送信動作(With myMail以降)を行うようにしたら良いだけじゃないので

しょうか?
    • good
    • 1
この回答へのお礼

それはProcedure上無理なんですよ。
ありがとうございました。

お礼日時:2009/01/18 14:55

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

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

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

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

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

QエクセルVBAのフォームを最前面にする方法を教えてください。

エクセルVBAなのですが、UserForm1を最前面に表示して、
他のどのウインドウをアクティブにしても消えない状態にしたいのですが、
どのようなコードを書けばできるでしょうか。
VB.NETで表すとMe.TopMost = Trueとなると思うのですが、
エクセルVBAだとそのような書き方はないようです。

もうしわけございませんがご教示頂きたく、お願いいたします。m(__)m

Aベストアンサー

あらかじめ、フォームのプロパティの[ShowModal]をFalseにしておいて、以下のような方法ではダメでしょうか?
画面のアクティブイベントを利用するのは、個人的に嫌いなのですが。。。


Private Declare Function GetForegroundWindow Lib "user32" () 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
Private Const HWND_TOPMOST As Long = -1
Private Const SWP_NOSIZE As Long = &H1&
Private Const SWP_NOMOVE As Long = &H2&


Private Sub UserForm_Activate()
Call SetWindowPos(GetForegroundWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

あらかじめ、フォームのプロパティの[ShowModal]をFalseにしておいて、以下のような方法ではダメでしょうか?
画面のアクティブイベントを利用するのは、個人的に嫌いなのですが。。。


Private Declare Function GetForegroundWindow Lib "user32" () 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
Private Const HWND_TOPMOS...続きを読む

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

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

Aベストアンサー

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

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

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

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...続きを読む

QAppActivateの使い方

現在開いているエクセルファイルをアクティブにしたいです。
バージョンは2003です。

アクセスVBAから
Sub test()
Dim rc As Long
rc = Shell("C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE", 1)
AppActivate "aaa.xls"
End Sub

を実行すると、
新規にアプリケーションが開いて、空のBOOK1が表示されます。
本当は、aaa.xlsをアクティブにしたいのですがうまく出来ません。

aaa.xlsは既に開いている状態です。
aaa.xlsはデスクトップにあります。

http://officetanaka.net/excel/vba/statement/AppActivate.htm
を見ながらやってみたのですがうまく出来ません。

新たなアプリケーションは立ち上げたくないけど
aaa.xlsはアクティブにしたいです。

Aベストアンサー

Win7 + Office2010 では下記のような感じで動きました。
aaa.xls を開いてなければ開き、
開いていたら、そのExcelアプリを最前面にして、
aaa.xls をアクティブにしてます。
こちらでは、aaa.xlsを単独で開いていた場合に、
AppActivateでは、プロシージャの呼び出し、または引数が不正です
になってしまいます。
環境に依存する部分が有りそうなので下記でも不十分かもしれません。

Sub てすと()
Dim myXL As Object
Dim myXLPath As String
Dim myXLName As String
Dim WSH As Object

Set WSH = CreateObject("WScript.Shell")
myXLPath = WSH.specialfolders("desktop")
myXLName = "aaa.xls"

If Dir(myXLPath & "\" & myXLName) = "" Then
MsgBox myXLPath & "\" & myXLName & " は見つかりません"
Set WSH = Nothing
Exit Sub
End If

Set myXL = GetObject(myXLPath & "\" & myXLName).Parent
myXL.Visible = True

If myXL.activeworkbook.Name = myXLName Then
myXL.workbooks(myXLName).Activate
Else
myXL.workbooks.Open (myXLPath & "\" & myXLName)
End If

myXL.UserControl = True
Set myXL = Nothing: Set WSH = Nothing
End Sub

Win7 + Office2010 では下記のような感じで動きました。
aaa.xls を開いてなければ開き、
開いていたら、そのExcelアプリを最前面にして、
aaa.xls をアクティブにしてます。
こちらでは、aaa.xlsを単独で開いていた場合に、
AppActivateでは、プロシージャの呼び出し、または引数が不正です
になってしまいます。
環境に依存する部分が有りそうなので下記でも不十分かもしれません。

Sub てすと()
Dim myXL As Object
Dim myXLPath As String
Dim myXLName As String
Dim WSH As Object

Set WSH = CreateObject...続きを読む

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ベストアンサー

こんにちは。

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

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

Qエクセルで別ブックをバックグラウンドでオープンする方法

最初にメニュー画面となるブックを開いた後、データブックをバックグランドのみで開きたいのですが、エクセルVBAで単純にOPENを行うと画面上にデータブックが表示されてしまいます。操作作業者に画面が次々入れ替わることを見せたくないのですが、ブックをバックグラウンドだけで開く方法はあるのでしょうか。VBAについては素人で宜しくお願いします。

Aベストアンサー

ごめんなさい。解決済みと思って見ていませんでした。 まだですか?

後で開いた3つのブックは、VBAで操作しないのですか。
操作するのでしたら、ブックをオブジェクト変数に入れておいた方が操作しやすい
と思うのですが・・・ 一応何処でどのように使うのか判りませんので・・・

こんな感じで如何でしょうか。

ブックを開いてから非表示にするまでの瞬時の画面のことですね。
それなら、その間、ScreenUpdating = False でどうでしょうか。

Public Bk1 As Workbook
Public Bk2 As Workbook
Public Bk3 As Workbook
Dim PathName As String

Sub Auto_Open()
PathName = ThisWorkbook.Sheets("メニュー").Range("C28").Value
ファイル読込 "初期値.xls", Bk1
ファイル読込 "データ1.xls", Bk2
ファイル読込 "データ2.xls", Bk3
End Sub

Sub ファイル読込(BkName, ObjBk)
Application.ScreenUpdating = False
Set ObjBk = Workbooks.Open(Filename:=PathName & "\" & BkName)
Windows(BkName).Visible = False
Application.ScreenUpdating = True
End Sub

ごめんなさい。解決済みと思って見ていませんでした。 まだですか?

後で開いた3つのブックは、VBAで操作しないのですか。
操作するのでしたら、ブックをオブジェクト変数に入れておいた方が操作しやすい
と思うのですが・・・ 一応何処でどのように使うのか判りませんので・・・

こんな感じで如何でしょうか。

ブックを開いてから非表示にするまでの瞬時の画面のことですね。
それなら、その間、ScreenUpdating = False でどうでしょうか。

Public Bk1 As Workbook
Public Bk2 As Workbook
P...続きを読む

QEXCELマクロで、開いてはいるがアクティブでないファイルをアクティブにする方法?

いつもこちらのサイトではお世話になっております。EXCELのマクロについて教えてください。

ファイルを2つ開いているとき、アクティブになっていないほうのファイル名を取得し、そのファイルをアクティブにしたいと考えています。

条件1)
アクティブにしたいファイル名は必ず「グラフ」で始まり、「.xls」で終わります。

条件2)
ファイルは2つともEXCELファイルです。



すみませんが、どうしてもやりかたが思いつかず、教えてください。

Aベストアンサー

#1です。

なるほど、こちらの認識不足でした。

If wb.Name <> ActiveWorkbook.Name Then

     ↓

If wb.Name <> ActiveWorkbook.Name And Windows(wb.Name).Visible Then

で、非表示ブックを対象外にします。

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

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

Aベストアンサー

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


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

人気Q&Aランキング