アクセスからエクセルファイルを全て閉じるにはどうすればいいでしょう?(保存して閉じたいです)
エクセルファイルは名前やファイル数はランダムです。
アクセスの標準モジュールに
Sub Test1()
Dim ExcelApp As Object
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Application.Visible = False
Set ExcelApp = Nothing
End Sub
と書きました。
このあいだにコードをいれるのですが
思いつきません。
まず数を取得して
一つ一つ保存→閉じるかな?と思い
MsgBox ExcelApp.Worksheet.Count
を入れてみましたが
エラーになりました。
オフィスのバージョンは2003です。
ご教授よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
Excelのブックが常にファイル(またはショートカット)のダブルクリックで開かれて
いる限りは、marbinさんのコード(をVBAにしたもの)で問題ないと思いますが、
既にExcelを起動済みの状態で、
a)Windowsのスタートメニューから、新たにExcelを起動したり、
b)Access等から、CreateObject等によりExcelを起動したり、
といった場合には、Excelアプリケーションが複数立ち上がった形になるため、
一部のファイルは画面に残ることになるかと思います。
・・・と思って触り始めたのですが、エラーから抜け出せず、こんな遅くになって
しまいました(汗)
とりあえず、Subとしてまとめてみましたので、標準モジュールに以下のコードを
貼り付けて、適当な名前をつけて保存して下さい:
'~~~~~~~~~~ここから貼り付け~~~~~~~~~~
Option Compare Database
Option Explicit
'指定した時間(ミリ秒単位)だけ処理を保留するAPI関数
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Sub QuitExcels()
'エラー発生時は「エラー処理」に飛ばす
On Error GoTo エラー処理
Dim Rsl As Boolean
'ループ処理で全てのExcelを終了させる(但しエラー発生時は中断)
Do
'Excelを取得し、配下の全Bookを保存して閉じる
Rsl = CloseBooks()
'Loopで再び同じExcelを取得しないよう、完全に終了するのを待つ
If Rsl Then Sleep 100 '数値は様子をみて適宜調整して下さい
Loop While Rsl
終了処理:
Exit Sub
エラー処理:
'エラー発生時はメッセージを表示
MsgBox Err & ":" & Err.Description, , "QuitExcels"
Resume 終了処理
End Sub
Private Function CloseBooks() As Boolean
On Error GoTo エラー処理
'★こちらの関数は、概ねmarbinさんのコードをVBA化した形になっています★
' (上記a,bのパターンがないなら、これをPublicにして単独使用してもOk)
Dim Xls As Object, Wkb As Object
'Excelへの参照設定をするなら上記一行は以下の一行に差し替え
'Dim Xls As Excel.Application, Wkb As Excel.Workbook
Dim Cncl As Boolean
'Excelへの参照設定をした場合は以下は不要
Const xlMinimized As Long = -4140
'起動中のExcelアプリケーションを取得
Set Xls = GetObject(, "Excel.Application")
'新規ブックでの『ブックの保存』ダイアログの表示に備えてExcelをアクティブ化
AppActivate Xls.Caption
'「名前付きファイルについては確認なしで上書き保存、新規ファイル時のみ
'『ブックの保存』ダイアログを表示して保存」としました
For Each Wkb In Xls.Workbooks
Wkb.Close True
Next
'全ブックが閉じられたかを確認し、本関数の戻り値に反映
CloseBooks = (Xls.Workbooks.Count = 0)
'全ブックを閉じた場合はExcelを終了、そうでない場合は最小化
'(処理終了時のMsgBoxがExcelに隠れるのを回避。Excelと違ってAccess.Application
' にはCaptionプロパティがなく、上と同じAppActivateの適用は面倒なので(汗))
If CloseBooks Then Xls.Quit Else Xls.WindowState = xlMinimized
終了処理:
'メモリを解放して本関数を終了
Set Wkb = Nothing
Set Xls = Nothing
Exit Function
エラー処理:
Select Case Err
Case 429 'GetObject失敗時(→Excel未展開/全て終了済)
'メッセージは不要
Case Else '上記以外のエラー時
MsgBox Err & ":" & Err.Description, vbSystemModal, "CloseBooks"
End Select
'本関数の戻り値を「False」に設定(→呼出元でのLoop処理を終了)
CloseBooks = False
Resume 終了処理
End Function
'~~~~~~~~~~ここまで貼り付け~~~~~~~~~~
あとは、コマンドボタンなどのイベントで、以下のように使用します。
Private Sub コマンド0_Click()
On Error GoTo エラー処理
If MsgBox("すべてのExcelを閉じます。", vbOKCancel, "確認") = vbCancel Then GoTo 終了処理
Call QuitExcels
MsgBox "終了しました。", , "確認"
終了処理:
Exit Sub
エラー処理:
MsgBox Err & ":" & Err.Description, , Me.Name & " コマンド0"
Resume 終了処理
End Sub
・・・長くなりましたが(汗)、以上です。
No.1
- 回答日時:
アクセスVBAではないですが、VBSでのコードです。
少し改造すればアクセスVBAに応用できます。
Dim objxl
Dim objwb
On Error Resume Next
Err.Clear
Set objxl = GetObject(,"Excel.Application")
If Err.number = 429 Then Wscript.Quit
For Each objwb In objxl.WorkBooks
'ブックが編集されていて上書き保存されていなかったら上書き保存
If objwb.Saved = False Then objwb.Save
objwb.Close
Next
If objxl.Workbooks.Count = 0 Then objxl.Quit
Set objxl = Nothing
なお、
>MsgBox ExcelApp.Worksheet.Count
ブックオブジェクトにはワークシートがありますが、エクセルアプリケーション
直下にはにはワークシートは存在しません。
エクセルアプリケーション
→ブック
→ワークシート
になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) バックグラウンドのプロセスのエクセルを閉じる方法 4 2022/05/12 15:39
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルのオートフィルターのしぼりをクリアーしたい 2 2022/12/24 08:36
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
AccessVBAで作成したExcelファイルを削除する方法は?
Visual Basic(VBA)
-
-
4
Access からオブジェクトとして開いたExcelのプロセスが終了しない
その他(データベース)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
7
既に開いているエクセルを閉じるには?
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
マクロで、次のコードへ行く前...
-
vbaのエラー対応(実行時エラー...
-
シグナル 6(SIGABRT)とは?
-
VB6にてネットワーク上にある共...
-
途中で処理を中断させたい (ア...
-
StatusStripの表示が更新されな...
-
COBOL OCCURSで指定したデータ...
-
特定のファイルを他のプロセス...
-
条件文でelseはつけるべき?
-
【C#】Page_Loadさせない方法に...
-
IF文に時間(何時から何時ま...
-
RaiseEventのメリット
-
エクセル VBAで複数セル選択時...
-
特定の名前のオートシェイプの...
-
¥マークを含むパスの処理につ...
-
フォルダのアクセス権確認について
-
Excel VBA セルの名前があるか...
-
ListViewから選択中の文字列を取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
IF文に時間(何時から何時ま...
-
シグナル 6(SIGABRT)とは?
-
private subモジュールを他のモ...
-
特定の名前のオートシェイプの...
-
どう増強すべきか
-
vbaのエラー対応(実行時エラー...
-
マクロで、次のコードへ行く前...
-
どうやってもFor文を抜けてしま...
-
ExcelのVBAで、選択したファイ...
-
エクセル VBAで複数セル選択時...
-
Excel VBA セルの名前があるか...
-
【Vb.net】プリンタジョブの取得
-
特定のファイルを他のプロセス...
-
【C#】Page_Loadさせない方法に...
-
VBA 複数の行を高速で削除する...
-
Functionで戻り値を複数返す方法
-
Word VBA。各マクロの間に待ち...
-
シェルスクリプトでファイル内...
-
StatusStripの表示が更新されな...
おすすめ情報