2013-07-04 5 views
5

У меня есть следующий код, я хочу, чтобы он открыл мои файлы, которые были сохранены как .xlsx, и просто сохраните их снова с тем же именем, но на этот раз в качестве файла .xls, чтобы они совместимы с Excel 2003Откройте файл Excel и сохраните его как .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

Это хорошо, чтобы увидеть код, но вы бы описали нам проблему с решением до сих пор? – Bathsheba

ответ

10

Как указано 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 не поддерживает именованные параметры (см here). Если вы хотите, чтобы вызвать 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 
+0

Спасибо Ansgar !! –

+0

Вы заслуживаете еще одного +1 за такой всеобъемлющий ответ. – Bathsheba

+0

Можно ли сохранить его как новый тип файла, но сохранить исходное имя? Я использую сценарий, который вы дали. Спасибо, кстати, миллион! –

5

Два серьезных ошибок:

  • Set fso = Nothing не должно быть внутри цикла: вам нужно fso на срок действия программы.

  • Также, капля app.Quit из петли; держать Excel открытым до самого
    конец.

Set f = Nothing не является необходимым (хотя и доброкачественным); пусть цикл выбирает значения для вас.

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 
Смежные вопросы