既に該当のファイルが開いているのなら閉じたいのですが
xlBook.Quitだとエラーになります。
Sub test1()
Dim xlApp As Excel.Application
Dim xlBook As Workbook
Dim FileName As String
FileName = "C:\test.xlsm"
Set xlApp = GetObject("", "Excel.Application") 'GetObjectで合ってるか不安
Set xlBook = xlApp.Workbooks.Open(FileName)
If xlBook.ReadOnly = True Then 'ファイルが開いてるのなら
MsgBox "既にファイルが開いているので閉じます。"
xlBook.Quit 'エラー 438
End If
xlApp.Quit 'これって何のために必要?
Set xlBook = Nothing 'ココを通り過ぎるのにすごく時間がかかる。
Set xlApp = Nothing
End Sub
と言うコードを作りました。
xlBook.Quitがダメならどのコードを使えばいいでしょう?
また、
GetObject("", "Excel.Application")
と言う開き方でいいのでしょうか?
あと、
xlApp.Quit
は何のために必要なのでしょう?
タスクマネージーのプロセスを見ると、
Set xlApp = GetObject("", "Excel.Application")
を通る時に新しいEXCEL.EXEが作成され、
Set xlApp = Nothing
を通り過ぎる時に、そのEXCEL.EXEが消えます。
だから
xlApp.Quit
は不要ですか?
No.4ベストアンサー
- 回答日時:
少し考えて、こんな風に
既存のExcelが立ち上がっていた場合でも
下の処理中にトラブルがあっても巻き添えにしないために
新たなインスタンスを作成して、その中で処理した方が安全と考えます。
InUse関数はネットワーク上で他人が開いていた場合にも有効です。
Sub test1a()
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim FileName As String
FileName = "C:\test.xlsm"
'開いているかチェック
If InUse(FileName) <> 0 Then
MsgBox "ファイルが見つからないか、既に開かれています"
Exit Sub
End If
Set xlApp = GetObject("", "Excel.Application") '新規にExcelのインスタンスを作成
'Set xlApp = CreateObject("Excel.Application") ’こちらでも可
Set xlBook = xlApp.Workbooks.Open(FileName)
If xlBook.ReadOnly Then '読み取り専用
MsgBox "既にファイルが開いているので閉じます。"
GoTo CloseP
End If
If xlBook.MultiUserEditing Then '共有モードも閉じて良い?
MsgBox "共有モードで開かれていますので閉じます。"
GoTo CloseP
End If
xlApp.Visible = True '必要に応じて
'ここいら辺から本番の処理
CloseP: '終了処理
xlBook.Close SaveChanges:=True 'で良かったのかな?
Set xlBook = Nothing '解放
xlApp.Quit 'Excel の終了
Set xlApp = Nothing
End Sub
Function InUse(ByVal FileName As String) As Integer
'メモ帳などのような'ファイルをロックしないアプリが開いていた場合は機能せず。
'Excelファイルが共有モードで開かれていた場合も、0 が返ります。
'FileName にはフルパスで渡すこと
Dim fNo As Integer
fNo = FreeFile
On Error Resume Next
Open FileName For Input Access Read Lock Read Write As fNo
Select Case err.Number
Case 0 '開かれていない
InUse = 0
Case 53 'ファイルが見つからない
InUse = 1
Case 70 '開かれている
InUse = 2
Case Else 'ここに来た経験は無いのですが念のため
InUse = 3
End Select
Close fNo
End Function
No.3
- 回答日時:
順不同に
> xlBook.Quit 'エラー 438
Quitは、アプリケーションから抜け出す時に使います。
なので、ブック(ファイル)に対しては有効ではありません。
・・と覚えれば目安になるかと思います。
> xlBook.Quitがダメならどのコードを使えばいいでしょう?
通例、xlBook.Close で、該当ブックの子ウィンドウを閉じます。
> GetObject("", "Excel.Application")
> と言う開き方でいいのでしょうか?
良いと思います。
ですが、ご自身でも確認された通り、
> Set xlApp = GetObject("", "Excel.Application")
> を通る時に新しいEXCEL.EXEが作成され、
ますから、この挙動で良ければ、と言う条件が付きます。
逸れますが、この「新しく立ち上がったエクセルアプリケーションを終了するために
> xlApp.Quit
> は何のために必要なのでしょう?
上述、xlBook.Close だけでは、アプリケーションが無駄に残ってしまいますから、
コレを閉じるために必要です。
新しくアプリケーションを立ち上げず、子ウィンドウを開くだけなら
Set xlBook = Workbooks.Open(FileName)
でも可能です。
この場合、FileNameと言うブックを開くマクロを走らせたブックは残しておくので、
アプリケーション終了は必要ありません。
なので、.Quit は不要と言えます。
ところで、
> If xlBook.ReadOnly = True Then 'ファイルが開いてるのなら
と言う条件を付けていますが、これはどうでしょう?
ファイル自体に「読み取り専用」属性を設定していても反応してしまい、
この場合も閉じてしまいますね。
なので、
Dim OBook As Workbook
Dim FileName As String
FileName = "c:\test.xlsm"
For Each OBook In Workbooks '開いている全てのブックに関して
If OBook.FullName = FileName Then '名前が同じだったら
MsgBox "既にファイルが開いているので中止します。"
Exit Sub 'マクロ終了
End If
Next
'Forを抜けてきたら=同名のファイルが開いていなかったら
Workbooks.Open FileName 'ファイルを開く
こんなやり方を提案。
参考までにどうぞ。
No.2
- 回答日時:
これは、どのアプリ上で実行されているのでしょう?Excel?Access?・・
それによって話は変わってくるかと。
取りあえず
>Set xlApp = GetObject("", "Excel.Application")
>を通る時に新しいEXCEL.EXEが作成され、
は、
ヘルプに記載が有りますよ。
以下抜粋
GetObject([pathname] [, class])
引数 pathname に長さ 0 の文字列 ("") を指定すると、GetObject 関数は、指定した種類の新しいオブジェクト インスタンスを返します。
引数 pathname を省略すると、GetObject 関数は、指定した種類で現在アクティブになっているオブジェクトを返します。
エクセルで実行するのかアクセスで実行するかによって変わるのですか。
アクセスから実行するつもりです。
現在アクティブになっているオブジェクトを返したいか
新しいオブジェクト インスタンスを返したいかによって
pathnameの値を変えればいいのですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エラー処理 3 2022/04/11 14:58
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
お風呂の温度、何℃にしてますか?
みなさん、家のお風呂って何℃で入ってますか? ぬるめのお湯にゆったり…という方もいれば、熱いのが好き!という方もいるかと思います。 我が家は平均的(?)な42℃設定なのですが、みなさんのご家庭では何℃に設定していますか?
-
VBS Bookを閉じるコード
Visual Basic(VBA)
-
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
vbsからのExcelマクロ呼び出しの際に保存ダイアログが表示されてしまう
その他(プログラミング・Web制作)
-
-
4
すでに開いているブックのマクロを起動させるvbsを教えてください
Visual Basic(VBA)
-
5
VBSでExcelのオープン確認
Visual Basic(VBA)
-
6
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
7
開いてるファイル(エクセル等)をバッチかVBScript自動的に保存す
その他(Microsoft Office)
-
8
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
9
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
10
vbaから他のアプリを終了
Visual Basic(VBA)
-
11
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
12
エクセルマクロで、別のブックが開いているかを判定したいのですが。
その他(Microsoft Office)
-
13
VBA+VBSによる別インスタンスBookOpen時のVBSエラーに関して
Excel(エクセル)
-
14
VBSでExcelのUserFormをエクスプローラの前面に出したい
Visual Basic(VBA)
-
15
Excel VBA 空白セルがあったらメッセージボックスで知らせたい
Visual Basic(VBA)
-
16
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
17
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
18
VBでファイルが開かれているかどうかを確認したい
Visual Basic(VBA)
-
19
コマンドライン上でファイルを終了させる方法について
Windows Vista・XP
-
20
ファイルが開かれているかどうかの判断
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトで作成日時...
-
#include <Windows.h>というヘ...
-
アクセス 壊れた? 「ファイ...
-
公文書のxmlファイルの開き方が...
-
リンクの張り付けかたを教えて...
-
.NETアプリを作ったときの .man...
-
binファイルを解凍したいの...
-
jarファイル
-
Latexで図番号だけを「図1.1」...
-
CSSファイルの日本語コメントが...
-
Excel VBA リンク更新について ...
-
htcファイルとはなんですか?
-
warファイルをEclipseでプロジ...
-
実行ファイル(.exeファイル)...
-
標準正規分布
-
ストレージにある全てのファイ...
-
ファイル名にドットを使ったフ...
-
拡張子exeについて
-
C言語でコマンド引数にワイルド...
-
C言語---ファイルに出力したデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
binファイルを解凍したいの...
-
コマンドプロンプトで作成日時...
-
アクセス 壊れた? 「ファイ...
-
.NETアプリを作ったときの .man...
-
#include <Windows.h>というヘ...
-
公文書のxmlファイルの開き方が...
-
Latexで図番号だけを「図1.1」...
-
jarファイル
-
Seasar2のdiconファイルの読み方
-
自分で作成した重要ファイルを...
-
C言語---ファイルに出力したデ...
-
コマンドプロンプトで、指定し...
-
ファイルが開かれているかどう...
-
exeファイルの中身を見る方法は...
-
リンクの張り付けかたを教えて...
-
VBAでのicsファイル変換
-
「ブルーファイル」と「グリー...
-
HTMLからのBATファイル実行
-
VBSが起動しない
-
CSSを1ページに1枚作るのって変...
おすすめ情報