6

次のコードがあります。.xlsx として保存されているファイルを開き、同じファイル名で再度保存しますが、今回は Excel 2003 と互換性があるように .xls ファイルとして保存します。

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
4

3 に答える 3

12

Bathshebaが既に指摘したように、スクリプトの最後 (ループの外側) に属しますSet fso = Nothingapp.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メソッドを呼び出したい場合は、次のようにする必要があります。SaveChangesTrue

    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
于 2013-07-04T08:42:35.950 に答える
5

2 つの深刻なバグ:

  • Set fso = Nothingループ内に配置しないでくださいfso 。プログラムの実行中に必要になります。

  • app.Quitまた、ループからドロップします。最後までExcelを開いたままにして
    ください。

Set f = Nothing不要です(無害ですが)。ループに値を選択させます。

于 2013-07-04T07:55:12.290 に答える
3
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
于 2014-10-23T15:50:16.783 に答える