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

http://www.ken3.org/cgi-bin/group/vba_outlook.asp
を参考に
Sub Sample()
Dim oApp As Outlook.Application
Dim myNameSpace As Outlook.Namespace
Dim myFolder As Outlook.Folder

'outlook 起動をCreateObjectで ※これだと複数起動してしまうがご勘弁を
Set oApp = CreateObject("Outlook.Application")
Set myNameSpace = oApp.GetNamespace("MAPI")

'作業フォルダーの指定(.GetDefaultFolder) と 表示(.Display)
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定
myFolder.display
End Sub
でエクセルからアウトルックを起動しているのですが
既に起動していると2個起動してしまいます。

「既に起動しているのなら起動しない」という事はできますか?

参考URLに
起動をCreateObjectで ※これだと複数起動してしまうがご勘弁を
と書いてありますが、ちょっと勘弁できませんでした笑

A 回答 (3件)

No.2です。


少し変更しました。
質問者様のご希望は、Outlookのフォルダのウィンドウがあれば新たに開かない、というものと思いますのでそのようにしました。
(No.2のコードでは受信トレイ以外のフォルダが開いていると、新たに受信トレイのウィンドウが開いてしまいます。)

Sub Sample2()
Dim oApp As Outlook.Application
Dim myNameSpace As Outlook.Namespace
Dim myFolder As Outlook.Folder

'outlook 起動をCreateObjectで ※フォルダのウィンドウがあるなら一応開かないようになった
Set oApp = CreateObject("Outlook.Application")
'参照設定済みのようなので Set oApp = New Outlook.Application でもいいかも

Set myNameSpace = oApp.GetNamespace("MAPI")

'outlookのフォルダのウィンドウがすでに存在するならそのうちの1つをmyFolderにSetし、
'なければ規定のフォルダを得る。
If oApp.Explorers.Count > 0 then
Set myFolder = oApp.Explorers.Item(1).CurrentFolder.FolderPath
Else
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定
End If

myFolder.display
End Sub

なお、No.1様解説のGetObjectでうまくいくならばその方が私の回答よりも良いと思います。
    • good
    • 1
この回答へのお礼

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

お礼日時:2013/05/18 20:51

Outlook VBA はあまり使ったことがないのですが調べてやってみました。


すでに受信トレイのウィンドウがあるなら新たには開かない、というのが一応できました。
でもこれでいいかどうか自信はありません・・・

Sub Sample2()
Dim oApp As Outlook.Application
Dim myNameSpace As Outlook.Namespace
Dim myFolder As Outlook.Folder
Dim e_olExplorer As Outlook.Explorer

'outlook 起動をCreateObjectで ※ウィンドウがあるなら一応開かないようになった
'でも自信なし・・・
Set oApp = CreateObject("Outlook.Application")
'参照設定済みのようなので Set oApp = New Outlook.Application でもいいかも

Set myNameSpace = oApp.GetNamespace("MAPI")

'作業フォルダーの指定(.GetDefaultFolder) と 表示(.Display)
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定

'すでに存在するoutlookのウィンドウでパスがmyFolderと同じものがあるなら
'myFolderをそのウィンドウにする
For Each e_olExplorer In oApp.Explorers
If e_olExplorer.CurrentFolder.FolderPath = myFolder.FolderPath Then
'オブジェクトは同一ではないようなのでパスで比較した
'FullFolderPathというのもあって、それでも動作可能であった
Set myFolder = e_olExplorer.CurrentFolder
Exit For
End If
Next

myFolder.display
End Sub
    • good
    • 3
この回答へのお礼

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

お礼日時:2013/05/18 20:51

GetObjectを調べられると吉だと思います。



On Error Resume Next
'起動済みのOutlookをクラス名を指定して取得
Set oApp = GetObject(, "Outlook.Application")
On Error GoTo 0

'oAppがNothingなら
If oApp Is Nothing Then
'Outlookを起動
  Set oApp = CreateObject("Outlook.Application")
End If

Resume Nextを使わなければ、Outlookへの参照が得られなかったら実行時エラー
で止まってしまいます。

GetObjectはExcelやAccess,WordにIEなど色々使えますので
是非覚えて下さい。

ken3には、私も相当お世話になっています笑
    • good
    • 6
この回答へのお礼

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

お礼日時:2013/05/18 20:51

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

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


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