2017-04-16 9 views
1

私は、現在開かれているExcelのすべてのインスタンスを閉じるために以下のコードを使用すると、閉鎖されたExcelのインスタンスをすべて再オープンする必要がありますか?私はファイルパスをどこかに保存するために以下を変更しなければならないことは知っていますが、実際のコードの内容は不明です。最近閉鎖されたExcelのインスタンスを開く

Public Sub CloseAllExcel() 
On Error GoTo handler 

    Dim xl As Excel.Application 
    Dim wb As Excel.Workbook 

    Do While xl Is Nothing 
     Set xl = GetObject(, "Excel.Application") 
     For Each wb In xl.Workbooks 
     wb.Save 
     wb.Close 
     Next 
     xl.Quit 
     Set xl = Nothing 
    Loop 
    Exit Sub 

handler: 
    If Err <> 429 Then 'ActiveX component can't create object 
     MsgBox Err.Description, vbInformation 
    End If 

End Sub 
+0

たぶん、あなたはマクロブックを開くとき、あなたは最近閉じたすべてのブックを開くことができるシートと次回への配列を作成し、それらが閉じられる前に、すべてのファイルのパスを保持することができ、アレイを構築配列を読み込むことによって。 – sktneer

答えて

1

これは、ブックのファイルパスをテキストファイルに保存します。 Falseを入力としてこのマクロを実行すると、最近クローズされたすべてのファイルが開きます。 (未テスト)

Public Sub CloseAllExcel(Closing As Boolean) 
On Error GoTo handler 

    Dim xl As Excel.Application 
    Dim wb As Excel.Workbook 

    Dim strPath As String 
    strPath = "C:\path.txt" 


    If Close Then 

    Dim fso as Object 
    Set fso = CreateObject("Scripting.FileSystemObject") 

    Dim oFile as Object 
    Set oFile = FSO.CreateTextFile(strPath) 



    Do While xl Is Nothing 
     Set xl = GetObject(, "Excel.Application") 
     For Each wb In xl.Workbooks 

     oFile.WriteLine Application.ActiveWorkbook.FullName 
     wb.Save 
     wb.Close 
     Next 
     oFile.Close 
     Set fso = Nothing 
     Set oFile = Nothing 
     xl.Quit 
     Set xl = Nothing 
    Loop 

    Exit Sub 

    Else 
    Dim FileNum As Integer 
    Dim DataLine As String 

    FileNum = FreeFile() 
    Open strPath For Input As #FileNum 

    While Not EOF(FileNum) 
     Line Input #FileNum, DataLine 
     Workbooks.Open DataLine 
    Wend 
    Exit Sub 
    End If 

handler: 
    If Err <> 429 Then 'ActiveX component can't create object 
     MsgBox Err.Description, vbInformation 
    End If 

End Sub 
+0

これは私が思っていることです、私はそれを働かせる必要があります。サブの名前を宣言している括弧の中にCloseを使用することはできません(私はVBAの専門家ではありません - 実際にそれらの括弧が何をしているのかはわかりません)。これは公開されたサブですから、F8を押してコードを循環させることができるはずですが、それはできません - なぜですか?助けてくれてありがとう。 – nick1408

+0

@ nick1408これはサブの議論です。次のような別のサブウィンドウまたは直下ウィンドウから呼び出すことができます:CloseAllExcell True。または、角かっこの中の引数を削除して、コードの最初の行にClose = True(または以前に閉じたファイルを開く場合はFalse)を追加できます。 – Masoud

+0

もう一度@Masoudに感謝します。 VBAエディタにコードを入力すると、次の行が表示されます。 public sub CloseAllExcel(ブール値でブール値) 閉じる場合 は赤色で表示されません。指定されたエラーは、コンパイルエラーです。期待値:識別子。私はあなたの提案された編集で亀裂があり、戻って報告するだろうが、私はあなたの元のコードオプションの考えが好きです(CloseAllExcel True/False) – nick1408

1

あなたが現在開いているファイルのすべてをしておこうVery-Hiddenワークシートを、使用することができます。

注::必要に応じて、レジストリの保存と読み取りのオプションが必要です。

サブCloseAllExcelコード

Option Explicit 

Public Sub CloseAllExcel() 

On Error GoTo handler 

Dim xlApp As Excel.Application 
Dim wb As Excel.Workbook 
Dim i As Long 
Dim Hidws As Worksheet 

On Error Resume Next 
Set Hidws = ThisWorkbook.Worksheets("Admin") 
On Error GoTo 0 

If Hidws Is Nothing Then ' check if there isn't "Admin" sheet exists in the workbook 
    Set Hidws = ThisWorkbook.Sheets.Add(Before:=ThisWorkbook.Worksheets(Worksheets.Count)) 
    Hidws.Name = "Admin" 
    Hidws.Visible = xlSheetVeryHidden ' make the "Admin" sheet very-hidden 
End If 

i = 1 
Do While xlApp Is Nothing 
    Set xlApp = GetObject(, "Excel.Application") 
    For Each wb In xlApp.Workbooks 
     Hidws.Range("A" & i).Value = wb.FullName ' save each workbook full name and path in column "A" in "Admin" very-hidden sheet 
     i = i + 1 
     wb.Close True 
    Next 
    xlApp.Quit 
    Set xlApp = Nothing 
Loop 
Exit Sub 

handler: 
If Err <> 429 Then 'ActiveX component can't create object 
    MsgBox Err.Description, vbInformation 
End If 

End Sub 

サブRestoreExcelLastSessionコード: "管理者" 非常に隠されたシートの列 "A" からファイル(名前とパス)を読み込みます。

Sub RestoreExcelLastSession() 

Dim xlApp As Excel.Application 
Dim wb  As Excel.Workbook 
Dim i  As Long 
Dim Hidws As Worksheet 

On Error Resume Next 
Set Hidws = ThisWorkbook.Worksheets("Admin") 
On Error GoTo 0 

If Hidws Is Nothing Then ' check if "Admin" sheet exists 
    MsgBox "No Files have been restored" 
    Exit Sub 
End If 

i = 1 
Do While Hidws.Range("A" & i).Value <> "" ' loop through cells in Column "A" 
    Set xlApp = CreateObject("Excel.Application") ' open a new Excel instance per file 
    xlApp.Workbooks.Open (Hidws.Range("A" & i).Value) 
    i = i + 1 
    Set xlApp = Nothing 
Loop 

End Sub 
関連する問題