下に続くコードをテキストエディタにコピペして
拡張子はvbsで保存してダブルクリックなどで実行してみてください。
新規未保存はbook & 連番 のファイル名で保存し
既存変更有ファイルは全て上書き保存します。
複数のExcelインスタンス中のBookを順次保存し終了して行きます。
Windows7 64bit & Excel2010 32bit で
検証していますが十分でない場合があります。
もし、
>会社で使用しているソフトで右クリックメニューから
>エクセルで出力するという項目があり
>それを選択するとbook1、別のも出力するとbook2と
>出力されていきます。
が出力のやり直しが出来ないのなら止めてください!
■責任は持てません■
出力されるファイルの大きさによっては
Wscript.Sleep (二か所あり)の数値を大きくする必要があるかも
しれません。
一分ほど経っても「終了しました」のメッセージが出ない場合は
無限ループに陥っている可能性がありますので
タスクマネージャのプロセスタブの中にある
wscript.exe を右クリックし「プロセスの終了」してください。
それにしてもGetObjectは不思議な振る舞いをする。。。
Dim FS
Dim XL, BK
Dim DFname, DF, F
Dim BookCount, Books(), v
Set XL = CreateObject("Excel.application")
DFname = XL.DefaultfilePath '既定の保存先
Set XL = Nothing
Set FS = CreateObject("Scripting.FilesystemObject")
Set DF = FS.getfolder(DFname)
'book & n(nは数字)のファイル名をスキャン
BookCount = 0
For Each F In DF.files
If StrComp(Left(FS.getbasename(F), 4), "book", vbTextCompare) = 0 Then
If IsNumeric(Mid(FS.getbasename(F), 5)) Then
ReDim Preserve Books(BookCount)
Books(BookCount) = Mid(FS.getbasename(F), 5)
BookCount = BookCount + 1
End If
End If
Next
'book & n のnの最大値を取得
If BookCount <> 0 Then
For Each v In Books
If CInt(v) > CInt(BookCount) Then
BookCount = v
End If
Next
End If
Do Until saveXL(BookCount) = True
Wscript.Sleep 500
Loop
MsgBox "終了しました"
Private Function saveXL(ByRef BookCount)
Dim XL, BK
On Error Resume Next
Set XL = GetObject(, "Excel.Application")
Select Case Err.Number
Case 429
saveXL = True
Exit Function
Case 0
'エラーではない
Case Else
saveXL = True
MsgBox "失敗しました" & vbCrLf & Err.Number & vbCrLf & Err.Description
End Select
XL.UserControl = False
For Each BK In XL.workbooks
If BK.Path = "" Then
BookCount = BookCount + 1
BK.saveas XL.DefaultfilePath & "\book" & BookCount
BK.Close
Else
BK.Close True
End If
Next
Do Until XL.workbooks.Count = 0
Wscript.Sleep 200
Loop
XL.Quit
Set XL = Nothing
saveXL = False
End Function
お礼
ありがとうございます! 試してみたら出来ました! ループに陥った場合の対処法まで 考えていただいていて 至れりつくせりです。 本当にありがとうございました!