2013-07-04 16 views
5

Ich habe den folgenden Code, ich möchte es meine Dateien zu öffnen, die als .xlsx gespeichert werden und speichern Sie sie einfach erneut mit demselben Dateinamen aber diesmal als .xls-Datei, so dass sie sind kompatibel mit Excel 2003Öffnen Sie eine Excel-Datei und speichern Sie als .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 
+0

Es ist gut, einen Code zu sehen, aber würden Sie uns das Problem mit der Lösung so weit beschreiben? – Bathsheba

Antwort

10

Als Bathsheba bereits hingewiesen, gehören Set fso = Nothing und app.Quit am Ende des Skripts (außerhalb der Schleife). Es gibt jedoch einige weitere Fehler.

  • wb.SaveAs "*.xls*"

    Sie können eine Arbeitsmappe zu einem Platzhalter-Namen speichern. Wenn Sie die Arbeitsmappe unter ihrem aktuellen Namen speichern möchten, verwenden Sie einfach wb.Save. Andernfalls erhalten Sie einen eindeutigen Namen verwenden müssen (sollten Sie auch den Dateityp dann eingestellt):

    wb.SaveAs "new.xlsx", 51 
    

    oder

    wb.SaveAs "C:\path\to\new.xls", -4143 
    
  • wb.Close SaveChanges=True

    VBScript nicht benannte Parameter unterstützen (siehe here). Wenn Sie die Close Methode mit dem SaveChanges Parametersatz True anrufen wollen, müssen Sie es wie dies zu tun:

    wb.Close True 
    
  • app.Close

    Das Anwendungsobjekt hat keine Close Methode.

Nicht Fehler, aber die Dinge wert zu verbessern:

  • app.DisplayAlerts = False gehen sollte, bevor die Schleife beginnt, wenn Sie sich wieder aktivieren als auch innerhalb der Schleife.

  • Ich würde empfehlen, eine Zeile app.Visible = False nach dem Erstellen des Anwendungsobjekts hinzufügen. Wenn Sie Ihr Skript debuggen müssen, können Sie einfach diesen Wert in True ändern, um die Anwendung auf Ihrem Desktop anzuzeigen. Das hilft sehr bei der Fehlersuche.

Fest-up-Skript:

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 
+0

Danke Ansgar !! –

+0

Sie verdienen ein weiteres +1 für solch eine umfassende Antwort. – Bathsheba

+0

Ist es möglich, es als den neuen Dateityp zu speichern, aber behalten Sie den ursprünglichen Namen? Ich benutze das Skript, das du gabst. Tausend Dank übrigens! –

5

Zwei schwerwiegende Fehler:

  • Set fso = Nothing sollten sich nicht in der Schleife sein: Sie fso für die Dauer des Programms benötigen.

  • Lassen Sie auch app.Quit aus der Schleife fallen; Halten Sie Excel geöffnet, bis die Ende.

Set f = Nothing ist unnötig (obwohl gutartig); Lass die Schleife die Werte für dich auswählen.

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 
Verwandte Themen