次のコードがあります。xlsxとして保存されているファイルを開き、同じファイル名で再度保存しますが、今回は.xlsファイルとして保存して、Excel2003と互換性を持たせます。
Set app = CreateObject("Excel.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each f In fso.GetFolder("Y:\Billing_Common\autoemail").Files
If LCase(fso.GetExtensionName(f)) = "xlsx" Then
Set wb = app.Workbooks.Open(f.Path)
app.DisplayAlerts = False
wb.SaveAs "*.xls*"
wb.Close SaveChanges=True
app.Close
app.Quit
End if
Set f = Nothing
Set fso = Nothing
Next
Bathsheba がすでに指摘しているように、Set fso = Nothing
とapp.Quit
はスクリプトの最後(ループの外側)に属します。ただし、さらにいくつかのバグがあります。
wb.SaveAs "*.xls*"
ブックをワイルドカード名で保存することはできません。ブックを現在の名前で保存する場合は、wb.Save
を使用します。それ以外の場合は、明示的な名前を使用する必要があります(ファイルタイプも設定する必要があります)。
wb.SaveAs "new.xlsx", 51
または
wb.SaveAs "C:\path\to\new.xls", -4143
wb.Close SaveChanges=True
VBScriptは名前付きパラメーターをサポートしていません( ここ を参照)。 Close
パラメータをSaveChanges
に設定してTrue
メソッドを呼び出す場合は、次のようにする必要があります。
wb.Close True
app.Close
アプリケーションオブジェクトにはClose
メソッドがありません。
バグではありませんが、改善する価値のあるもの:
app.DisplayAlerts = False
は、ループ内でも再度有効にしない限り、ループが開始する前に移動する必要があります。
アプリケーションオブジェクトを作成した後、app.Visible = False
行を追加することをお勧めします。スクリプトをデバッグする必要がある場合は、その値をTrue
に変更するだけで、デスクトップにアプリケーションを表示できます。これはバグを見つけるのに大いに役立ちます。
修正されたスクリプト:
Set app = CreateObject("Excel.Application")
app.Visible = False
app.DisplayAlerts = False
Set fso = CreateObject("Scripting.FileSystemObject")
For Each f In fso.GetFolder("Y:\Billing_Common\autoemail").Files
If LCase(fso.GetExtensionName(f)) = "xlsx" Then
Set wb = app.Workbooks.Open(f.Path)
wb.Save
wb.Close True
End if
Next
app.Quit
Set app = Nothing
Set fso = Nothing
2つの重大なバグ:
Set fso = Nothing
はループ内にあるべきではありません。プログラムの期間中はfso
が必要です。
また、ドロップapp.Quit
ループから;非常にまでExcelを開いたままにします
終わり。
Set f = Nothing
は不要です(良性ですが)。ループに値を選択させます。
Dim app, fso, file, fName, wb, dir
dir = "d:\path\"
Set app = CreateObject("Excel.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each file In fso.GetFolder(dir).Files
If LCase(fso.GetExtensionName(file)) = "xlsx" Then
fName = fso.GetBaseName(file)
Set wb = app.Workbooks.Open(file)
app.Application.Visible = False
app.Application.DisplayAlerts = False
app.ActiveWorkbook.SaveAs dir & fName & ".xls", 43
app.ActiveWorkbook.Close
app.Application.DisplayAlerts = True
app.Application.Quit
End if
Next
Set fso = Nothing
Set wb = Nothing
Set app = Nothing
wScript.Quit