
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
No.3ベストアンサー
- 回答日時:
元ネタはこちらですね。
https://extan.jp/?p=912
上記サイトでは ブックを閉じていますが
それを削除した、ということは、
ブックを開きっぱなしにして内容を見たい、ということかと思います。
ブックが見えないから新たに開こうとしてエラーになっているということでしょうか。
ブックが表示されれば良いということなら
Set myExcel = CreateObject("Excel.Application")
の次に
MyExcel.Visible = True
を追加してください。
ありがとうございます。
ご指摘があり、もう一度見てみたところ、削除してしまってました。。。
私のミスでございます。
申し訳ございませんでした。
ご教授いただきましてありがとうございました。
No.2
- 回答日時:
こんにちは
バックグラウンドで処理しているのでわかり難いですが、例えば
myExcel.Visible = Tlue
を入れて実行すると、状況がよくわかるようになると思います。
結果から(多分)理解はなさっているようですが、ご提示のコードだと
・ブックは開いたまま(Saveはされている)
・エクセルのインスタンスも作成されたまま
の状態になっているはずです。
これらの両方を処理するために。
1)ブックを閉じる
objBook.Close SaveChanges:=False
2)エクセルを終了する
myExcel.Quit
3)変数等をクリアする
Set myExcel = Nothing
などの処理が必要になります。
ご提示のコードでは3)のクリアだけはされていますが、この意味は「変数を開放する」だけですので、インスタンスが無くなるわけではありません。(変数が再定義されているので、参照できなくなってしまいますが…)
ですので、先にインスタンスを終了してから、変数をクリアするという順序になります。
これで、VBAの処理が全て終わるのであれば、変数のクリアは必ずしも必須ではありません。
(処理終了時に、変数はクリアされるので。しかし、オブジェクトの実態はクリアされませんので、1)、2)は必須ということになります。)
丁寧にご説明いただきましてありがとうございました。
とてもわかりやすく、勉強になりました。ありがとうございます。
閉じる、終了する!の処理が抜けていました。
ありがとうございました。
No.1
- 回答日時:
.SaveAs でBookが閉じるのか忘れましたが、閉じられていないようなら閉じるコードが必要なのかも。
あと
'Excel用定義
Dim myExcel As Excel.Application
Dim objBook As Excel.Workbook
Dim objSheet As Excel.worksheet
で定義された変数の解放を上記の後ろに追加(Set objitem = Nothing の前に)が必要なのかもです。
検証できず憶測ではありますが、VBなどでは解放は重要な部分として解説もあったりはします。
ありがとうございます。
はい!その通りでございます。
閉じるこードが抜けておりました。。。
ありがとうございます、無事思ったことができました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
Excelのプロセスが消えません
Excel(エクセル)
-
-
4
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
5
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
6
Excel VBA でExcelを終了したいのですが・・
Excel(エクセル)
-
7
Access からオブジェクトとして開いたExcelのプロセスが終了しない
その他(データベース)
-
8
エクセルでファイルを閉じても空ウィンドウが残ります
Excel(エクセル)
-
9
ExcelVBAにてアプリをタスクマネージャーから強制終了させたいのですが
Visual Basic(VBA)
-
10
VBAでOutlookを終了させたい ExcelVBAで既に起動されているOutlookを終了させる
Visual Basic(VBA)
-
11
vbsからのExcelマクロ呼び出しの際に保存ダイアログが表示されてしまう
その他(プログラミング・Web制作)
-
12
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
13
ExcelのVBAでフォームが表示されない
Excel(エクセル)
-
14
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
15
プロセスがタスクマネージャーに残るのは、なぜ?
Windows 10
-
16
プロシージャ名の取得
Visual Basic(VBA)
-
17
Excel VBAでブックを閉じる時、複数のブックが開いていると・・・。
Excel(エクセル)
-
18
Worksheets メソッドは失敗しました。のエラー処理のやり方
Visual Basic(VBA)
-
19
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
20
フォントの大きさ
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA セルの名前があるか...
-
IF文に時間(何時から何時ま...
-
特定のファイルを他のプロセス...
-
シェルスクリプトでファイル内...
-
“try/catch”と“if/else”
-
private subモジュールを他のモ...
-
マクロで、次のコードへ行く前...
-
【C#/Java?】try-catchでcatch...
-
特定の名前のオートシェイプの...
-
Word VBA。各マクロの間に待ち...
-
タイマーの使い方
-
どうやってもFor文を抜けてしま...
-
順番に処理させたい
-
シートモジュールを複数作成す...
-
変数を使用したFunctionから戻...
-
ExcelのVBAで、選択したファイ...
-
Form オブジェクトの戻り値の設定
-
エクセル VBAで複数セル選択時...
-
フォルダのアクセス権確認について
-
c# の try の入れ子
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
処理水問題についてスライドを...
-
【C#/Java?】try-catchでcatch...
-
シートモジュールを複数作成す...
-
マクロで、次のコードへ行く前...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
特定のファイルを他のプロセス...
-
シグナル 6(SIGABRT)とは?
-
どう増強すべきか
-
ドリブン??
-
シェルスクリプトでファイル内...
-
Excel VBA セルの名前があるか...
-
Excelプロセスが消えない
-
特定の名前のオートシェイプの...
-
Functionで戻り値を複数返す方法
-
ExcelのVBAで、選択したファイ...
-
どうやってもFor文を抜けてしま...
-
フォルダのアクセス権確認について
-
【VBA】エラー処理で別プロシー...
-
ListViewから選択中の文字列を取得
おすすめ情報