既に開いているエクセルを閉じる方法とは?

このQ&Aのポイント
  • 既に開いているエクセルを閉じるためには、xlBook.Quitを使用しますが、エラーが発生する場合があります。
  • 他の方法として、GetObjectを使用して開かれているExcelアプリケーションを取得し、それを終了させる方法があります。
  • xlApp.Quitは、Excelアプリケーション自体を終了させるためのものであり、最後に必要な処理です。
回答を見る
  • ベストアンサー

既に開いているエクセルを閉じるには?

既に該当のファイルが開いているのなら閉じたいのですが 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 は不要ですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答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

pnywmusg32
質問者

お礼

ありがとうございます。

その他の回答 (3)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答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   'ファイルを開く こんなやり方を提案。 参考までにどうぞ。

pnywmusg32
質問者

お礼

ありがとうございます。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

これは、どのアプリ上で実行されているのでしょう?Excel?Access?・・ それによって話は変わってくるかと。 取りあえず >Set xlApp = GetObject("", "Excel.Application") >を通る時に新しいEXCEL.EXEが作成され、 は、 ヘルプに記載が有りますよ。 以下抜粋 GetObject([pathname] [, class]) 引数 pathname に長さ 0 の文字列 ("") を指定すると、GetObject 関数は、指定した種類の新しいオブジェクト インスタンスを返します。 引数 pathname を省略すると、GetObject 関数は、指定した種類で現在アクティブになっているオブジェクトを返します。

pnywmusg32
質問者

お礼

エクセルで実行するのかアクセスで実行するかによって変わるのですか。 アクセスから実行するつもりです。 現在アクティブになっているオブジェクトを返したいか 新しいオブジェクト インスタンスを返したいかによって pathnameの値を変えればいいのですね。

回答No.1

xlBook.Close はファイルを閉じます。 xlApp.Quit はEXCELを終わらせます。 必要かどうかは使い方次第です。

pnywmusg32
質問者

お礼

xlBook.QuitではなくCloseを使うのですか。ありがとうございました。

関連するQ&A

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

  • VBからエクセルを起動。そのあとエクセルを終了

    教えてください。 VBからエクセルを起動します。 そのあと、エクセルのシートの上にデータを貼り付けます。そして、エクセルを終了します。 しかし、エクセルが終了しません。 タスクバー上のエクセルをクリックすると終了します。 どうして、このような現象が起こるのかわかりません。 教えてください。 下記に同様のサンプルを書きました 誤記入があるかも知れませんが このような感じのプログラムです。 以上、よろしくお願いします。 public sub test Dim XApp as Excel.Application Dim nfilename as string Dim xlBook As Object Dim xlSheet As Object ' エクセルを起動 Set xlApp = New Excel.Application nfilename ="AAAA.xls" ' 指定されたファイルを開く Call xlApp.Workbooks.Open(nfilename) Set xlBook = xlApp.ActiveWorkbook Set xlSheet = xlBook.Worksheets(1) 'フォームを貼り付ける xlSheet.Range("a1").PasteSpecial      'ファイル名の作成 Filename="BBBB.xls" '保存 ChDir "C:\" xlBook.SaveAs Filename:=Filename,FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Set xlSheet = Nothing xlBook.Close True Set xlBook = Nothing xlApp.Quit Set xlApp = Nothing End sub

  • SETを使ったほうがよい?

    accwessからエクセルファイルを開きたいのですが、 App.Workbooks.Open と、 Set xlBook = xlApp.Workbooks.Open とどちらを使った方がいいのでしょうか? ////////////////////////////////////////////////////////// Private Sub ファイル1_Click() Dim App As Object Dim MyFileName As String MyFileName = "D:\My Documents\test.xls" Set App = CreateObject("Excel.Application") App.Workbooks.Open FileName:=MyFileName App.Visible = True End Sub でも Private Sub ファイル2_Click() Dim xlApp As Object Dim xlBook As Object Dim FileName As String Const FolderName = "D:\My Documents\test.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(FolderName & FileName) xlApp.Visible = True Set xlApp = Nothing Set xlBook = Nothing End Sub ////////////////////////////////////////////////////////// でも開けました。 多分、SETを使うかどうかの違いだと思うのですが VBAでコードを作る際、どちらのコードを使った方がいいか教えてください。

  • VBからExcelを操作

    VisualBasic6.0(初心者) VBを始めたばかりで、Excelの入力文字をVBで変換しようと考えています。 様々な保管場所にあるExcelを開いて選択セルの文字をコマンドボタンで変換しようと下記コードを考えました。(一部) 問題は、Load時にすでに開いているExcelを閉じてまいます。 何か良い方法は無いでしょうか?(アクティブなExcelを操作したい) また、下記コードで不適切なところがありましたら御教授願います。 Private Sub Form_Load() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) Set xlApp = GetObject(, "Excel.Application") With xlApp.Selection Cells(1, 1).Value = "" End With xlApp.DisplayAlerts = False xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub '----------------------(大文字変換) Private Sub CB2_Click() On Error Resume Next If ActiveCell.Row = Null Then MsgBox "Excel が見つかりません" Else Dim xlApp As Excel.Application Set xlApp = GetObject(, "Excel.Application") If Err.Number Then MsgBox "Excel が起動されていません" Else Dim X As Long Dim Y As Long Dim Hmae As String Dim Hgo As String X = 0 Y = 0 With xlApp.Selection Do Do Hmae = Cells(ActiveCell.Row + X, ActiveCell.Column + Y).Value Hgo = StrConv(Hmae, 1) Cells(ActiveCell.Row + X, ActiveCell.Column + Y).Value = Hgo X = X + 1 Loop Until X >= .Rows(.Rows.Count).Row - .Row + 1 X = 0 Y = Y + 1 Loop Until Y >= .Columns(.Columns.Count).Column - .Columns(1).Column + 1 End With End If xlApp.DisplayAlerts = False Set xlApp = Nothing End If End Sub

  • 「もし既にファイルを開いているなら、開かない」

    おはようございます。 accessからExcelのブックを開く処理をしています。 VBAでファイルを開く時に、「もし既にファイルを開いているなら、開かない」 という行為をしたいのですが、どのようにすればいいでしょうか? *************************************************************************** Sub サンプル() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("C:\【Excel】\料理.xlsm") xlApp.Visible = True'ファイルを開く?表示する? Set xlApp = Nothing Set xlBook = Nothing End Sub *************************************************************************** このコードの、 xlApp.Visible = Trueを、 if xlBook がまだ開いてない then xlApp.Visible = True Else End If のような事がしたいのですが、可能でしょうか? ご教授よろしくお願いします。

  • 【VB】【エクセル操作】 SaveAsでエラーが出てしまいます。

    VB6.0で作成したソフトの一部でエクセルを操作する箇所があります。 『新しいブックを作成して名前を付けて保存する』ところでエラーが出てしまいます。 Excel2007,2003では正常に動作するのですが、2000ではエラーが発生し強制終了されてしまいます。 '//////////////////////////////////////////////////////////// Private Sub EditExcelFile(FileName As String) Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add xlApp.Visible = True With xlBook .Application.DisplayAlerts = False .SaveAs (FileName) .Application.DisplayAlerts = True End With Set xlBook = Nothing Set xlApp = Nothing End Function '//////////////////////////////////////////////////////////// 上記コードの .SaveAs (FileName)の箇所でエラーがでます。 .SaveAs (FileName)をコメント文にすると2000でも正常に動作します。 FileNameは新しいブック名のパスが入ります。 2000でも正常に動作させるにはどのような処理を加えれば良いでしょうか? 宜しくお願い致します。

  • シートを選択したい vba

    自身のファイルを読み取り専用で新たに立ち上げて、シートを選択したいのですが Private Sub cmd_読み取り専用で開く_Click() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) xlApp.Visible = True xlApp.xlBook.Sheets("メイン").Select Set xlApp = Nothing Set xlBook = Nothing End Sub だと xlApp.xlBook.Sheets("メイン").Selectでエラーになります。 文法が間違ってると思うのですが、修正案をご教授ください。

  • エクセルを表示できない

    プログラム初心者です。 Private Sub Command3_Click() On Error Resume Next Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet With xlApp.Application Set xlApp = GetObject("F:\vb6.0\book1.xls") Set xlBook = xlApp.Workbooks.Open("Book1") Set xlSheet = xlBook.Worksheets(1) xlApp.Application.Visible = True End Sub と入力したのですが、実行してボタンをクリックしてもエクセルの表が表示されません。なぜでしょうか?

  • 確実にエクセルをアクティブにする方法

    アクセスからエクセルを開いた時に エクセルがアクティブになったりならなかったり、 その時によって違うのですが 確実にエクセルをアクティブにする方法はありますか? AppActivateステートメントを使うという事がわかったのですが AppActivateをどうやって使えばいいでしょうか? ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Sub test() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim MyFileName Dim MyFileFullName Dim プロシージャー名 MyFileName = "book.xlsm" MyFileFullName = CurrentProject.Path & "\" & MyFileName プロシージャー名 = "開く" Set xlApp = New Excel.Application Set xlBook = xlApp.Workbooks.Open(MyFileFullName) xlApp.Visible = True xlApp.Run "'" & MyFileFullName & "'!" & プロシージャー名 Set xlBook = Nothing Set xlApp = Nothing End Sub ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ で問題なくエクセルファイルを立ち上げられますが ここで確実にエクセルをアクティブ(手前に表示)にする方法を教えてください。

  • Excelブックの保護パスワード判定方法

    VB6.0で、Excelブックが保護パスワードされているかどうかの 判定を行いたいです。 以下のようにHasPasswordプロパティを使用してみたのですが、 保護パスワード付きのExcelブックでテストしてみると Workbooks.Openの部分で処理が止まってしまい、先にすすみません。 基本的にやり方が間違えているんでしょうか? お分かりになる方がいらっしゃいましたら、教えてください。 よろしくお願いします。   Dim xlApp  As Excel.Application   Dim xlBook  As Excel.Workbook   Set xlApp = CreateObject("Excel.Application")   Set xlBook = xlApp.Workbooks.Open("C\:TEST.xls") If xlBook.HasPassword Then Msgbox("保護パスワードあり") Else Msgbox("保護パスワードなし") End If   Set xlSheet = Nothing   xlBook.Close   Set xlBook = Nothing   xlApp.Quit   Set xlApp = Nothing

専門家に質問してみよう