• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelのブックを閉じる)

Excelのブックを閉じる方法とマクロの実行手順

このQ&Aのポイント
  • Excelのブックを閉じ、更新してから再度開く方法について教えてください。
  • C#を使用してExcelのブックを閉じ、更新してから再度開く方法と、マクロを使用して同様の処理を行う方法について教えてください。
  • 現在使用しているコードでは、異なるブックのExcelファイルでウィンドウが分かれてしまい、削除ができません。修正方法を教えてください。

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

  • ベストアンサー
回答No.1

こんにちは。 > これでは、異なるブックのExcelファイルであっても、ウィンドウが分かれ > てしまっていては、削除の対象になりません。  異なるExcel.ApplicationのExcel.Workbookが、  自ブックとは別インスタンスのアプリケーションである為に、  閉じる方法が解りません。 ってことでしょうか? > 今、サーバで常にマクロが動き続けているExcelファイル(ファイルAとします)があります。 > 今回はそのファイルを閉じ、マクロにてシートの更新をしたのち、また開きなおしてマクロを実行させたいです。 > for each wb in Workbooks > if wb.Name <> ThisWorkbook.Name then > wb.Close SaveChanges:=false いまひとつニーズが読めていませんが、  すべてのExcelアプリケーションに渡って  すべてExcelブックを上書き保存せずに閉じて、  すべてのExcelアプリケーションを終了する ということ?だとして、 先達の知恵を頼りに、Excel VBA で書いてみました。 リンク:MREXCEL.COM > Forum > Question Forums > Excel Questions > GetObject and HWND 私のが解り難いようでしたら、リンクを参考になさってみて下さい。 もっと簡単に出来たような気もしますが、たぶん私の記憶違い?かなぁと。 ↓Excelのバージョンの問題で構文エラーやコンパイルエラーになる場合は、  PtrSafeを全削除、LongPtrをLongに全置換、してみてください。 > ... 別のブックにファイルAを閉じる処理を行うマクロを仕込んでおき ... Callの仕方はお任せします。 ' ' // Option Explicit Private Type GUID   lData1 As Long   iData2 As Integer   iData3 As Integer   aBData4(0 To 7) As Byte End Type Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _   ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _   ByVal lpsz1 As String, ByVal lpsz2 As String _   ) As LongPtr Private Declare PtrSafe Sub AccessibleObjectFromWindow Lib "OLEACC.DLL" ( _   ByVal hwnd As LongPtr, ByVal dwId As Long, _   riid As GUID, ppvObject As Any) Private Const OBJID_NATIVEOM = &HFFFFFFF0 Private Sub SetIDispatch(ByRef ID As GUID)   With ID     .lData1 = &H20400     .iData2 = &H0     .iData3 = &H0     .aBData4(0) = &HC0     .aBData4(1) = &H0     .aBData4(2) = &H0     .aBData4(3) = &H0     .aBData4(4) = &H0     .aBData4(5) = &H0     .aBData4(6) = &H0     .aBData4(7) = &H46   End With End Sub Sub ReW9196890() Dim IDispatch As GUID Dim oWnd As Object Dim xlApp As Excel.Application Dim wb As Excel.Workbook Dim sThisWbName As String Dim nHwndThisApp As LongPtr Dim nHWnd As LongPtr Dim lXLDESKhwnd As LongPtr Dim lWBhwnd As LongPtr   sThisWbName = ThisWorkbook.Name   nHwndThisApp = Application.hwnd ' ' 別インスタンスのブック(個人用マクロブック以外)をすべて閉じる   Do     nHWnd = FindWindowEx(0, nHWnd, "XLMAIN", vbNullString) Debug.Print nHWnd     If nHWnd = 0 Then Exit Do     If nHWnd <> nHwndThisApp Then       lXLDESKhwnd = FindWindowEx(nHWnd, 0&, "XLDESK", vbNullString)       lWBhwnd = FindWindowEx(lXLDESKhwnd, 0&, "EXCEL7", vbNullString)       If lWBhwnd Then         SetIDispatch IDispatch         Call AccessibleObjectFromWindow(lWBhwnd, OBJID_NATIVEOM, IDispatch, oWnd)         Set xlApp = oWnd.Application         For Each wb In xlApp.Workbooks           If UCase(wb.Name) Like "PERSONAL.XLS*" Then             wb.Saved = True           Else             wb.Close SaveChanges:=False           End If         Next wb         xlApp.Quit       End If     End If   Loop While nHWnd    ' ' このExcel.Application で開かれたブックの内、 ' ' 自ブック(+ 個人用マクロブック)以外をすべて閉じる   For Each wb In Workbooks     If UCase(wb.Name) Like "PERSONAL.XLS*" Then       wb.Saved = True     ElseIf wb.Name <> sThisWbName Then       wb.Close SaveChanges:=False     End If   Next wb '' ' このExcel.Application を閉じる ?   Application.Quit '' ' 自ブック を閉じる ?   ThisWorkbook.Close SaveChanges:=False End Sub ' ' // ' ' オマケ' テスト環境作り Private Sub prep()   Workbooks.Add.Sheets(1).Cells(1) = 0   With CreateObject("Excel.Application")     .Visible = True     .Workbooks.Add.Sheets(1).Cells(1) = 11     .Workbooks.Add.Sheets(1).Cells(1) = 12   End With   With CreateObject("Excel.Application")     .Visible = True     .Workbooks.Add.Sheets(1).Cells(1) = 21     .Workbooks.Add.Sheets(1).Cells(1) = 22   End With   AppActivate Application.Caption   ThisWorkbook.Activate End Sub

参考URL:
http://www.mrexcel.com/forum/excel-questions/499935-getobject-hwnd.html
keeeent24
質問者

お礼

遅くなりました。申し訳ありません。 ご教授いただいたコードは少し私には難しく、理解が及ばない箇所がございました。すみません... 同じウィンドウでcloseマクロを含むExcelファイルを開き、close処理を行う方法で解決しました。 Excelのオブジェクトをnewするのではなく、Microsoft.Office.Intdrop.Excel.Application ExcelApp = (Microsoft.Office.Intdrop.Excel.Application)System.Runtime.IntdropService.Marshal.GetActiveObject(”Excel.Application”) という記述で解決しました。大変お手数かけましたが、ありがとうございました。

keeeent24
質問者

補足

ご返信ありがとうございます。 また明日の日中に回答のコードを見て試してみます。