2013-07-04 38 views
5

Tôi có đoạn mã sau, tôi muốn mở tệp của tôi được lưu dưới dạng .xlsx và chỉ lưu lại chúng với cùng tên tệp nhưng lần này dưới dạng tệp .xls sao cho họ tương thích với Excel 2003Mở một tệp Excel và lưu dưới dạng .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

Đó là tốt để xem một số mã, nhưng bạn sẽ mô tả cho chúng tôi các vấn đề với các giải pháp cho đến nay? – Bathsheba

Trả lời

10

Bathsheba đã được chỉ ra, Set fso = Nothingapp.Quit thuộc về cuối tập lệnh (ngoài vòng lặp). Có một số lỗi hơn, mặc dù.

  • wb.SaveAs "*.xls*"

    Bạn không thể lưu một bảng tính với một tên ký tự đại diện. Nếu bạn muốn lưu sổ làm việc dưới tên hiện tại của nó, chỉ cần sử dụng wb.Save. Nếu không, bạn sẽ phải sử dụng một cái tên rõ ràng (bạn cũng nên thiết lập filetype sau đó):

    wb.SaveAs "new.xlsx", 51 
    

    hoặc

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

    VBScript không hỗ trợ đặt tên các tham số (xem here). Nếu bạn muốn gọi phương thức Close với bộ SaveChanges tham số để True bạn phải làm điều đó như thế này:

    wb.Close True 
    
  • app.Close

    đối tượng ứng dụng này không có một phương pháp Close.

Không lỗi, nhưng điều đáng cải thiện:

  • app.DisplayAlerts = False nên đi trước khi vòng lặp bắt đầu, trừ khi bạn kích hoạt lại nó bên trong vòng lặp là tốt.

  • Tôi khuyên bạn nên thêm một dòng app.Visible = False sau khi bạn tạo đối tượng ứng dụng. Khi bạn phải gỡ lỗi tập lệnh của mình, bạn có thể chỉ cần thay đổi giá trị đó thành True để hiển thị ứng dụng trên máy tính của bạn. Điều đó giúp ích rất nhiều trong việc tìm lỗi.

cố định lên kịch bản:

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

Cảm ơn Ansgar !! –

+0

Bạn xứng đáng được +1 khác cho câu trả lời toàn diện như vậy. – Bathsheba

+0

Có thể lưu nó làm loại tệp mới, nhưng giữ nguyên tên gốc không? Tôi đang sử dụng tập lệnh bạn đã cung cấp. Cảm ơn một triệu nhân tiện! –

5

Hai lỗi nghiêm trọng:

  • Set fso = Nothing không nên bên trong vòng lặp của bạn: bạn sẽ cần fso trong suốt thời gian của chương trình.

  • Ngoài ra, hãy thả app.Quit từ vòng lặp; giữ cho Excel mở cho đến khi hết số
    .

Set f = Nothing là không cần thiết (mặc dù lành tính); để vòng lặp chọn các giá trị cho bạn.

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 
Các vấn đề liên quan