既に該当のファイルが開いているのなら閉じたいのですが
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VBS Bookを閉じるコード
Visual Basic(VBA)
-
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
開いてるファイル(エクセル等)をバッチかVBScript自動的に保存す
その他(Microsoft Office)
-
-
4
すでに開いているブックのマクロを起動させるvbsを教えてください
Visual Basic(VBA)
-
5
vbsからのExcelマクロ呼び出しの際に保存ダイアログが表示されてしまう
その他(プログラミング・Web制作)
-
6
VBSでExcelのオープン確認
Visual Basic(VBA)
-
7
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
8
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
9
VBA+VBSによる別インスタンスBookOpen時のVBSエラーに関して
Excel(エクセル)
-
10
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
11
コマンドプロンプトからEXCELファイルを開き、印刷後、閉じるを一括に行いたい
Excel(エクセル)
-
12
「エクセルファイルが開いていたら開かない」としたい
Visual Basic(VBA)
-
13
VBでファイルが開かれているかどうかを確認したい
Visual Basic(VBA)
-
14
ファイルが開かれているかどうかの判断
Visual Basic(VBA)
-
15
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
16
アクセスからエクセルファイルを全て閉じたい
Access(アクセス)
-
17
コマンドライン上でファイルを終了させる方法について
Windows Vista・XP
-
18
Accessのテーブルを既存のExcelファイルへエクスポートしたいんですが
Access(アクセス)
-
19
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
20
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
binファイルを解凍したいの...
-
reaper音声ファイルについて
-
Latexで図番号だけを「図1.1」...
-
exeファイルの中身を見る方法は...
-
参照するファイルをワイルドカ...
-
エクセルvbaについて
-
VB6で特定のファイルを閉じたい
-
メモ帳の拡張子について
-
jarファイル
-
アメブロで音声ファイルを貼る方法
-
公文書のxmlファイルの開き方が...
-
HTMLからのBATファイル実行
-
ラッパーって何なんでしょう・...
-
ファイルが開かれているかどう...
-
監視ツールを入れさせられまし...
-
自分で作成した重要ファイルを...
-
○○○.zip.001というファイルが開...
-
VBAからファイルをセル入力から...
-
Tera Term にファイルを転送
-
CRCが一致する確率
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
binファイルを解凍したいの...
-
アクセス 壊れた? 「ファイ...
-
コマンドプロンプトで作成日時...
-
公文書のxmlファイルの開き方が...
-
#include <Windows.h>というヘ...
-
.NETアプリを作ったときの .man...
-
exeファイルの中身を見る方法は...
-
jarファイル
-
自分で作成した重要ファイルを...
-
Seasar2のdiconファイルの読み方
-
VBAでのicsファイル変換
-
バッチ処理で追記コピーしたい
-
監視ツールを入れさせられまし...
-
参照するファイルをワイルドカ...
-
「ブルーファイル」と「グリー...
-
HTMLからのBATファイル実行
-
Latexで図番号だけを「図1.1」...
-
C言語---ファイルに出力したデ...
-
Windowsのエクスプローラーでフ...
-
warファイルをEclipseでプロジ...
おすすめ情報