プロが教える店舗&オフィスのセキュリティ対策術

OUTLOOKでVBAでマクロを組んでいます。

自動的に新規メッセージ画面を開くように設定しています。
何枚もウィンドウが開かれているので、特定の新規メッセージ画面を最前面に表示する事はできないでしょうか?
イメージではexcelのsheetをfor each でworksheetsコレクションを全部検索し、activateするイメージです。



コードは簡単に下記のようにメッセージを作成しています。
Dim oApp As New Outlook.Application
Dim objmail As Object
Set oApp = CreateObject("Outlook.Application")
Set objmail = oApp.CreateItem(0) 'olMailItem=0

objmail.To = "宛先"
objmail.Subject = "件名"
objmail.Body = "本文の代入"
objmail.Display '新規メッセージ画面表示


わかりにくいかもしれませんがよろしくお願いします。

A 回答 (2件)

>フォームの背面→受信メールの背面→新規メールと表示されてしまいます。


UserForm は、また別問題です。今回の方法では、背面に回りません。Z オーダーを持たないからです。背面には回りませんので、最小化してみたら良いかと思います。

>メールの内容の必要な項目を取り込み、定型文で新規メールを作成。内容を確認し、手動にて送信しようとしています。

本当は、UserFormの立ち上げは不要だと思います。ただ、その話をしていくと、話が長引きそうです。

#1の補足の話全体の流れは、私の作ったものに似ていますが、それは、掲示板で提供出来る範囲を越えてしまいます。

'--------------
 Dim oApp As Application
 Dim objMail As MailItem

 Const CLASSNAME As String = "rctrl_renwnd32"
 Set oApp = CreateObject("Outlook.Application")
 Set objMail = oApp.CreateItem(0) 'olMailItem=0
    
 objMail.To = "宛先"
 objMail.Subject = "件名"
 objMail.Body = "本文の代入a"
 objMail.Display  '新規メッセージ画面表示
 UserForm1.Show vbModeless
'--------------

'ユーザーフォームモジュール
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CloseWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_THICKFRAME As Long = &H40000
Private Const GWL_STYLE As Long = -16&
Private hWnd As Long

Private Sub UserForm_Initialize()
'最小化ボタンを取り付ける
Dim lngNewLong As Long
Dim ret As Long
Const strClassName = "ThunderDFrame"
hWnd = FindWindow(strClassName, Me.Caption)
lngNewLong = GetWindowLong(hWnd, GWL_STYLE)
ret = SetWindowLong(hWnd, GWL_STYLE, _
          lngNewLong Or _
          WS_THICKFRAME Or _
          WS_MINIMIZEBOX)

ret = DrawMenuBar(hWnd)
End Sub

Private Sub UserForm_Activate()
Dim ret As Long
'縮小化
 ret = CloseWindow(hWnd)
End Sub
    • good
    • 0

>OUTLOOKでVBAでマクロを組んでいます。


もし、そうなら、前面にくるはずですし、それに、すでに、Outlook内部で行っているのですから、オートメーションオブジェクトで、New Outlook.Application という必要性はないと思います。

ご質問の状態が良く分かりませんが、こういうことでしょうか?

'//
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
Sub TeatMail()
   Dim oApp As Application
   Dim objMail As MailItem
   Dim hWnd As Long
   Const CLASSNAME As String = "rctrl_renwnd32"
   Set oApp = CreateObject("Outlook.Application")
   Set objMail = oApp.CreateItem(0) 'olMailItem=0
      
   objMail.To = "宛先"
   objMail.Subject = "件名"
   objMail.Body = "本文の代入"
   objMail.Display  '新規メッセージ画面表示
   hWnd = FindWindow(CLASSNAME, vbNullString)
   If hWnd <> 0& Then
      SetForegroundWindow hWnd
   End If
End Sub

この回答への補足

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

遅くなりましたが補足させていただきます。
すいません上記のコード調べてみたのですが、私には難しくて理解できませんでした。
流れ&使用方法がわかりません。
F8キーで処理を1つ1つ追ってみましたが、『objMail.Display』でプロシージャが終了し新規メッセージ画面が表示されます。どんな処理をFindWindow、SetForegroundWindow は行っているのでしょうか?

今私のコードを具体的に言いますと、
objmail.To = "宛先"
objmail.Subject = "件名"
objmail.Body = "本文の代入"
objmail.Display '新規メッセージ画面表示

UserForm.Show

処理の大まかな内容は、注文メールが届きます。
そのメールを開き内容を確認し、それに合わせてこのマクロを実行します。
メールの内容の必要な項目を取り込み、定型文で新規メールを作成。内容を確認し、手動にて送信しようとしています。
新規メールの作成画面を表示した後に、他のソフトにも必要項目をコピペする為にフォームを立ち上げます。このフォームにはこの必要事項をコピペしやすいようにテキストBOXに項目ごとに表示しています。コピペする前にメールを送信したい為メールの画面を最前面に表示したいと思っています。
フォームを表示しなければ、最前面に新規メールの画面が表示されるのですが、フォームを開くと、フォームの背面→受信メールの背面→新規メールと表示されてしまいます。
長い文章でわかりにくいかもしれないので質問はあのような質問にさせていただきました。

今の現状で解決できる事があればお願いします。

補足日時:2011/01/31 19:29
    • good
    • 0

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

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