
既に該当のファイルが開いているのなら閉じたいのですが
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も見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
あなたなりのストレス発散方法を教えてください!
自分なりのストレス発散方法はありますか?
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
VBS Bookを閉じるコード
Visual Basic(VBA)
-
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
VBSでExcelのオープン確認
Visual Basic(VBA)
-
-
4
vbsからのExcelマクロ呼び出しの際に保存ダイアログが表示されてしまう
その他(プログラミング・Web制作)
-
5
すでに開いているブックのマクロを起動させるvbsを教えてください
Visual Basic(VBA)
-
6
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
7
開いてるファイル(エクセル等)をバッチかVBScript自動的に保存す
その他(Microsoft Office)
-
8
ファイルを閉じるコマンドを教えてください
システム
-
9
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
10
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
11
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
12
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
13
コマンドライン上でファイルを終了させる方法について
Windows Vista・XP
-
14
「エクセルファイルが開いていたら開かない」としたい
Visual Basic(VBA)
-
15
VB.NETでのEXCELファイルの閉じ方
その他(プログラミング・Web制作)
-
16
VBAにてメッセージボックスを最前面に表示させる
その他(プログラミング・Web制作)
-
17
VB6.0 exe作成時に実行時エラー429が出て困っています
Visual Basic(VBA)
-
18
特定のファイルを他のプロセスが編集中か確認する方法
Visual Basic(VBA)
-
19
VB.net(2005)でエクセルの特定名称のシートを操作したい。
Visual Basic(VBA)
-
20
VBスクリプト---アプリの終了について
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトで作成日時...
-
アクセス 壊れた? 「ファイ...
-
公文書のxmlファイルの開き方が...
-
リンクの張り付けかたを教えて...
-
.NETアプリを作ったときの .man...
-
binファイルを解凍したいの...
-
Latexで図番号だけを「図1.1」...
-
iPhoneでXMLファイルを開くには...
-
VBAのバイナリ出力について
-
#include <Windows.h>というヘ...
-
自分で作成した重要ファイルを...
-
バッチ処理で追記コピーしたい
-
CRCが一致する確率
-
HTMLからのBATファイル実行
-
監視ツールを入れさせられまし...
-
warファイルをEclipseでプロジ...
-
他のMDBのマクロを実行する方法
-
C言語のfopen関数とfseek関数に...
-
VB.netで DirListBoxを使いたい
-
C言語---ファイルに出力したデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Latexで図番号だけを「図1.1」...
-
コマンドプロンプトで作成日時...
-
binファイルを解凍したいの...
-
リンクの張り付けかたを教えて...
-
アクセス 壊れた? 「ファイ...
-
公文書のxmlファイルの開き方が...
-
#include <Windows.h>というヘ...
-
.NETアプリを作ったときの .man...
-
Seasar2のdiconファイルの読み方
-
bibtexで参考文献作成できない
-
jarファイル
-
CRCが一致する確率
-
VBAでのicsファイル変換
-
C#でログファイルにファイルパ...
-
C言語---ファイルに出力したデ...
-
コマンドプロンプトで、指定し...
-
既に開いているエクセルを閉じ...
-
VBAのバイナリ出力について
-
自分で作成した重要ファイルを...
-
CSSファイルの日本語コメントが...
おすすめ情報