既に開いているエクセルがあります。ファイル名は既知です。
この開いているエクセルを、アクセスから閉じたいのです。以下のようにコードを書いたところ、結局別のエクセルが開いて、それが閉じるだけで、元のエクセルは閉じません。
既に開いているエクセルを終了させる方法を教えてください。
Dim closefilename As String
closefilename = ”閉じたいエクセルのファイル名”
Set AppObj = CreateObject("Excel.Application") '実行時バインディング
Set WBObj = AppObj.Workbooks.Open(closefilename) 'ワークブックを開く
WBObj.Close SaveChanges:=True
AppObj.Visible = True
WBObj.Close
Set WBObj = Nothing '解放
AppObj.Quit 'Excel の終了
Set AppObj = Nothing
End Function
4行目で、ファイルがロードされていないエクセルが開いて、それが閉じるだけで、すでに開いているエクセルは閉じません。
No.2ベストアンサー
- 回答日時:
まず、「実行時バインディング」には「方法が2つ」あって、
「CreateObject関数」を使う方法
と
「GetObject関数」を使う方法
の2つです。
※「そう教えてくれる講師は皆無」、といっていいほど全滅状態で「居ない」(CreateObject関数ばっかり教える)ので、僕もちょっと前までは、「実行時バインディング=CreateObject関数だけ」と誤解していました。以下のサイトもご参考に。(ここでも「方法が2つある」とは書いてはありませんが)
http://www016.upp.so-net.ne.jp/cheetah/xlvba/VBA …
http://www.shoeisha.com/book/hp/pc/office/Word/f …
「CreateObject関数」と「GetObject関数」の、それぞれの利用シーンの違いは次の通りです。
(01)「CreateObject関数」→「新規に」Excelのファイルを作りたい時・かつ・それをリモコン操作したい。
(02)「GetObject関数」→既存のファイルを開きたい時、もしくはフルパスの分かっているファイルがすでに開いていて、それをリモコン操作したい時。
なので、今回のご要望では、「CreateObject関数」ではなくて、「GetObject関数」を使います。
ご質問にあった、「結局別のエクセルが開いて、それが閉じるだけ」という動作は、「CreateObject関数」を使う以上は、どうしてもそうなってしまいます。
あと、「GetObject関数」は、「既存のファイル」を扱えるのですが・・・、
(a):もしまだその目的の「既存ファイル」が開かれていなければ、それを開いて、オブジェクトとして取得し、返してくれる。よってその場合は「×××.Application=Visible」というコードが必要です。
(b):すでに目的の「既存ファイル」が開かれていれば、それを、オブジェクトとして取得し、返してくれる。この場合はすでに目に見えているので「×××.Application=Visible」というコードは不要です。
・・・のいずれかを、自動的にやってくれます。
もちろん、「実行時バインディングをしつつ」、(a):と(b):をしてくれます。
今回は、(b):のほうになりますね。
ご希望の動作は、多分ですが、以降に示したような感じのコードで実現できるのではないかと思います。コメントを多く書いてしまいましたので、邪魔だったら全部消して試してみてください。
(F8キーでのステップ実行をして、ローカルウィンドウでどの変数に何が入っているかなども確認すると、より、動作のイメージが明確になると思います。)
ただし、このコードでは、例えばExcel2010以前のバージョンで、「1つのExcelウィンドウの中に、複数のファイルが子ウィンドウで開いていた場合」は、それらのファイルも道連れに閉じてしまいます。
なので、もしそうしたくない場合は、
「先に1つ以上のファイルが開いていたら、目的のファイルだけ閉じて、
残りのファイルは閉じずに、アプリケーションウィンドウは残す。」
という動作に作り変えてください。
がんばってください。
=======================================
Function ExcelCloseTest01()
Dim App01 As Object '言わば「ガワ」を代入するための変数
Dim WBObj As Object '開いているブックを代入するための変数
Dim closefilename As String
'閉じたいファイルのフルパス
closefilename = "フルパスの内容"
'「実行時バインディング」をすると同時に、
'現在、開いているブックを取得(選択)して
'オブジェクト変数に代入します。
Set WBObj = GetObject(closefilename)
'WBObj.Application.Visible = True '既存ファイルが閉じていた場合だけ使う。
'※実行時バインディングは、
' CreateObject関数だけでなく、
' GetObject関数でもできます。
' そういう説明をしてくれるサイトも本も
' すごく少ないですけど。
'開いているブックのアプリケーションウィンドウ
'(=言わば空っぽの「ガワ」)を
'オブジェクト変数に代入します。
Set App01 = WBObj.Application
' 「Application」オブジェクト(=空っぽの「ガワ」)は
' 「ブック」の1つ上の階層のオブジェクトです。
' イミディエイトウィンドウにて
' ? TypeName(ActiveWorkbook.Parent) とか、
' ? ActiveWorkbook.Parent とやると、
' 多分、上記のコードが何をしているかの意味がわかると思います。
'開いているファイルを保存して閉じる
WBObj.Close SaveChanges:=True
Set WBObj = Nothing '解放
'残ったExcelのアプリケーションウィンドウ(言わばガワ)を閉じる。
App01.Quit
Set App01 = Nothing
End Function
=======================================
ありがとうございました。丁寧なコメント迄つけていただきありがとうございます。無事解決しまし得た。それにしても、いくらGoogl検索しても教えていただいた内容は見つかりませんでした。助かりました。
No.4
- 回答日時:
'--------------
Const CloseFile ="********.xls*" 'フルパスは不要です。
On Error Resume Next
Set AppObj = GetObject(,"Excel.Application") 'カンマに注意
AppObj.Workbooks(CloseFile).Close Ture
AppObj.Quit
On Error Goto 0
'--------------
たぶん、これで行けるでしょう。
AppObj.Quit の後に、AppObj が残っているかは調べていません。
直接、GetObject でファイルを開くと、Excel.Application の終わり方が面倒です。
ありがとうございました。GetObject Google検索してもこのようなものは見つからず質問した次第です、大変助かりました。
No.3
- 回答日時:
補足です。
Excel2013 以降は、
『1つのExcelウィンドウの中に、複数の子ウィンドウで複数のファイルが表示される』、
という仕様ではなく、
『ファイルを開くたびに、常に、Excelウィンドウも個別・独立して開く』
という仕様なので、常に、前回の回答のコードで行けるか、もしかしたら、ブックを閉じるだけで「ガワ」のほうも道連れに消えるかもしれません。
そのあたりは、動きを見ながら必要に応じてコードを変えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- Visual Basic(VBA) エラー処理 3 2022/04/11 14:58
- Visual Basic(VBA) バックグラウンドのプロセスのエクセルを閉じる方法 4 2022/05/12 15:39
- Visual Basic(VBA) エクセルVBA エクセルを開いた後に編集可能な状態にするには? 2 2023/06/14 11:58
- Excel(エクセル) デスクトップのエクセルで作成したファイルを開くと未記入のエクセルが開く 5 2022/08/17 15:55
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルのオートフィルターのしぼりをクリアーしたい 2 2022/12/24 08:36
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
【選手権お題その2】この漫画の2コマ目を考えてください
サッカーのワンシーンを切り取った1コマ目。果たして2コマ目にはどんな展開になるのか教えてください。
-
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
アクセスvbaでエクセルブックを保存
その他(Microsoft Office)
-
AccessからExcelにエクスポートする時に常に上書きしたい
Excel(エクセル)
-
-
4
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
5
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
6
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
7
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
8
Access サブフォームでの選択行の取得
その他(データベース)
-
9
Access からオブジェクトとして開いたExcelのプロセスが終了しない
その他(データベース)
-
10
AccessVBAで作成したExcelファイルを削除する方法は?
Visual Basic(VBA)
-
11
ACCESSのVBで、エクセルファイルの最終行を取得
Excel(エクセル)
-
12
ACCESSでVBAから選択クエリの抽出条件を指定したい
Access(アクセス)
-
13
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
14
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
15
アクセスからエクセルのシートを追加して、名前をつける方法
Excel(エクセル)
-
16
アクセスからエクセルファイルを全て閉じたい
Access(アクセス)
-
17
どこにもフォーカスを当てたくない
Access(アクセス)
-
18
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
19
ACCESSのVBAにてExcelのシートをコピーしたい
その他(データベース)
-
20
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel に貼り付けた図形が、保...
-
アクセスVBAで既に開いているエ...
-
ロータス1-2-3のファイルをエ...
-
エクセルが勝手に開く
-
お世話になっています. x軸は時...
-
VBA 新規ファイルを元ファイル...
-
ファイル名の末尾に文字を追加...
-
EXCELので作成した表をビルダー...
-
エクセル関数のHyperLinkでの警告
-
メールでCADデータが送られまし...
-
エクセルで「ページレイアウト...
-
EXCELを起動したとき120%の表...
-
jtrim 1.53cが正常な動きをし...
-
至急!教えてください!!「Mic...
-
yahooメールの送信メール→サン...
-
msgファイルをnotesで開く
-
SXFデータトランスレータ2007の...
-
USBメモリーのセキュリティ...
-
wave.file
-
Wordで作成したものをUSBに保存...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel に貼り付けた図形が、保...
-
アクセスVBAで既に開いているエ...
-
エクセルが勝手に開く
-
ロータス1-2-3のファイルをエ...
-
VBA 新規ファイルを元ファイル...
-
ファイル名の末尾に文字を追加...
-
エクセルの表示サイズ変更(画...
-
[大至急!]ExcelSheetFreeの使...
-
Excelファイルをコピー不可にす...
-
ワードに貼られたエクセルのリ...
-
エクセルはシートに関数が入る...
-
エクセル関数のHyperLinkでの警告
-
EMBEDについて
-
エクセル、編集中でロックされ...
-
エクセルでメールの添付ファイ...
-
EXCELのVBAでやりたいことがあ...
-
お世話になっています. x軸は時...
-
xlsファイルの開き方(excel無...
-
OneDriveでエクセルの表が縦に分断
-
エクセルVBA 他のファイルから...
おすすめ情報