2013-07-04 8 views
5

के रूप में सहेजें मेरे पास निम्न कोड है, मैं चाहता हूं कि यह मेरी फ़ाइलें खोलें जो .xlsx के रूप में सहेजे गए हैं और उन्हें एक ही फ़ाइल नाम के साथ फिर से सहेजें लेकिन इस बार एक .xls फ़ाइल के रूप में सहेजें ताकि वे 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 
+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 नाम वाले पैरामीटर का समर्थन नहीं करता (देखें: नहीं तो आप एक स्पष्ट नाम का उपयोग करने (आप भी filetype तो स्थापित करना चाहिए) होगा here)। आप True को SaveChanges पैरामीटर वाला Close विधि कॉल करना चाहते हैं तो आप इसे इस क्या करना है:

    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 ड्रॉप करें; एक्सेल को
    अंत तक खुला रखें।

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 
संबंधित मुद्दे