4年に一度のスポーツの祭典 全競技速報中

OutlookでVBAを実行したあと、Excelを開こうとすると「他で開いています」となり、毎回タスクマネージャーからバックグラウンドプロセスExcelをとじる作業が必要になっています。

下のコードを修正して対処できるでしょうか。
ご教授お願い致します。

Sub 添付ファイルを保存かつ添付ファイルリストをExcelへ出力()

Dim objInbox As Object
Dim objFolder As Object
Dim strPath As String
Dim i As Long

'Excel用定義
Dim myExcel As Excel.Application
Dim objBook As Excel.Workbook
Dim objSheet As Excel.worksheet
Dim n As Long

'Excelオブジェクト生成、ブックの追加
Set myExcel = CreateObject("Excel.Application")
Set objBook = myExcel.Workbooks.Add()
Set objSheet = objBook.sheets(1)

'項目目を追加
objSheet.Cells(1, 1) = "ID"
objSheet.Cells(1, 2) = "件名"
objSheet.Cells(1, 3) = "送信者"
objSheet.Cells(1, 4) = "受信日時"
objSheet.Cells(1, 5) = "添付ファイル"
objSheet.Cells(1, 6) = "添付ファイルのパス"

'添付ファイルリストを書き込む行の位置
n = 2

Set objInbox = GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)

'添付ファイルがあるメールのフォルダを指定します。2階層以上ある場合は「.Folders.Item(<フォルダ名>)」を追加してください。
Set objFolder = objInbox.Folders.Item("請求書")

'添付ファイルの保存先をパスで指定します。
strPath = "C:\Users\keiri\Desktop\outlook_seikyuusyo\"

For Each objitem In objFolder.Items
For i = 1 To objitem.Attachments.Count
'添付ファイルに拡張子がある場合のみ処理します。
If InStr(objitem.Attachments.Item(i), ".") <> 0 Then
objitem.Attachments.Item(i).SaveAsFile strPath & objitem.Attachments.Item(i)

'Excelへ添付ファイル情報を追加
objSheet.Cells(n, 1) = n - 1
objSheet.Cells(n, 2) = objitem.ConversationTopic '件名
objSheet.Cells(n, 3) = objitem.SenderName '送信者
objSheet.Cells(n, 4) = objitem.ReceivedTime '受信日時
objSheet.Cells(n, 5) = objitem.Attachments.Item(i) '添付ファイル
objSheet.Cells(n, 6) = strPath & objitem.Attachments.Item(i) '添付ファイルのパス"
n = n + 1
End If
Next i
Next objitem

'添付ファイル保存場所へExcelを保存 ※ファイル名は適当な名前に変えてください。
objBook.SaveAs strPath & "添付ファイルリスト.xlsx"

Set objitem = Nothing
Set objInbox = Nothing
Set objFolder = Nothing
Set objSheet = Nothing

End Sub

gooドクター

A 回答 (3件)

元ネタはこちらですね。


https://extan.jp/?p=912

上記サイトでは ブックを閉じていますが
それを削除した、ということは、
ブックを開きっぱなしにして内容を見たい、ということかと思います。

ブックが見えないから新たに開こうとしてエラーになっているということでしょうか。

ブックが表示されれば良いということなら

Set myExcel = CreateObject("Excel.Application")
の次に
MyExcel.Visible = True
を追加してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ご指摘があり、もう一度見てみたところ、削除してしまってました。。。
私のミスでございます。
申し訳ございませんでした。
ご教授いただきましてありがとうございました。

お礼日時:2020/09/08 09:20

こんにちは



バックグラウンドで処理しているのでわかり難いですが、例えば
 myExcel.Visible = Tlue
を入れて実行すると、状況がよくわかるようになると思います。

結果から(多分)理解はなさっているようですが、ご提示のコードだと
 ・ブックは開いたまま(Saveはされている)
 ・エクセルのインスタンスも作成されたまま
の状態になっているはずです。

これらの両方を処理するために。
1)ブックを閉じる
 objBook.Close SaveChanges:=False
2)エクセルを終了する
 myExcel.Quit
3)変数等をクリアする
 Set myExcel = Nothing
などの処理が必要になります。

ご提示のコードでは3)のクリアだけはされていますが、この意味は「変数を開放する」だけですので、インスタンスが無くなるわけではありません。(変数が再定義されているので、参照できなくなってしまいますが…)
ですので、先にインスタンスを終了してから、変数をクリアするという順序になります。

これで、VBAの処理が全て終わるのであれば、変数のクリアは必ずしも必須ではありません。
(処理終了時に、変数はクリアされるので。しかし、オブジェクトの実態はクリアされませんので、1)、2)は必須ということになります。)
    • good
    • 2
この回答へのお礼

丁寧にご説明いただきましてありがとうございました。
とてもわかりやすく、勉強になりました。ありがとうございます。
閉じる、終了する!の処理が抜けていました。

ありがとうございました。

お礼日時:2020/09/08 09:22

.SaveAs でBookが閉じるのか忘れましたが、閉じられていないようなら閉じるコードが必要なのかも。



あと
'Excel用定義
Dim myExcel As Excel.Application
Dim objBook As Excel.Workbook
Dim objSheet As Excel.worksheet
で定義された変数の解放を上記の後ろに追加(Set objitem = Nothing の前に)が必要なのかもです。
検証できず憶測ではありますが、VBなどでは解放は重要な部分として解説もあったりはします。
    • good
    • 0
この回答へのお礼

ありがとうございます。
はい!その通りでございます。
閉じるこードが抜けておりました。。。

ありがとうございます、無事思ったことができました。

お礼日時:2020/09/08 09:23

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

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

gooドクター

人気Q&Aランキング