
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も見ています
-
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
Excelのプロセスが消えません
Excel(エクセル)
-
-
4
ExcelVBAにてアプリをタスクマネージャーから強制終了させたいのですが
Visual Basic(VBA)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
Access からオブジェクトとして開いたExcelのプロセスが終了しない
その他(データベース)
-
7
VBAでOutlookを終了させたい ExcelVBAで既に起動されているOutlookを終了させる
Visual Basic(VBA)
-
8
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
9
【Excel VBA】 WorksheetやRangeオブジェクトとして宣言した変数の開放は必要でしょうか?
その他(Microsoft Office)
-
10
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
C++ Builder6.0 TNMFTPコンポー...
-
どう増強すべきか
-
【Vb.net】プリンタジョブの取得
-
vbaのエラー対応(実行時エラー...
-
“try/catch”と“if/else”
-
シグナル 6(SIGABRT)とは?
-
c# の try の入れ子
-
VBA マクロ 英語版WINDOWSで全...
-
EXCEL-VBAでキー入力で処理を分...
-
エクセル VBAで複数セル選択時...
-
ドリブン??
-
private subモジュールを他のモ...
-
Linux(CentOS)にでcronとシェル...
-
ExcelVBAのコントロールの種類...
-
VBA シートのボタン名を変更し...
-
Wordテキストコントロールが未...
-
クリックイベントなのに、2回ク...
-
実行時エラー 438になった時の...
-
worksheetFunctionクラスのVloo...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
どう増強すべきか
-
Excel VBA セルの名前があるか...
-
vbaのエラー対応(実行時エラー...
-
IF文に時間(何時から何時ま...
-
特定の名前のオートシェイプの...
-
シグナル 6(SIGABRT)とは?
-
マクロで、次のコードへ行く前...
-
どうやってもFor文を抜けてしま...
-
【Vb.net】プリンタジョブの取得
-
特定のファイルを他のプロセス...
-
VB6にてネットワーク上にある共...
-
シェルスクリプトでファイル内...
-
【VBA】エラー処理で別プロシー...
-
cobolのコントロールブレイク
-
Functionで戻り値を複数返す方法
-
エクセル VBAで複数セル選択時...
-
【C#】Page_Loadさせない方法に...
-
ExcelのVBAで、選択したファイ...
おすすめ情報