- ベストアンサー
Excelのブックを閉じる方法とマクロの実行手順
- Excelのブックを閉じ、更新してから再度開く方法について教えてください。
- C#を使用してExcelのブックを閉じ、更新してから再度開く方法と、マクロを使用して同様の処理を行う方法について教えてください。
- 現在使用しているコードでは、異なるブックのExcelファイルでウィンドウが分かれてしまい、削除ができません。修正方法を教えてください。
- みんなの回答 (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
お礼
遅くなりました。申し訳ありません。 ご教授いただいたコードは少し私には難しく、理解が及ばない箇所がございました。すみません... 同じウィンドウでcloseマクロを含むExcelファイルを開き、close処理を行う方法で解決しました。 Excelのオブジェクトをnewするのではなく、Microsoft.Office.Intdrop.Excel.Application ExcelApp = (Microsoft.Office.Intdrop.Excel.Application)System.Runtime.IntdropService.Marshal.GetActiveObject(”Excel.Application”) という記述で解決しました。大変お手数かけましたが、ありがとうございました。
補足
ご返信ありがとうございます。 また明日の日中に回答のコードを見て試してみます。