VBS操作Excel的一點問題總結


最近在使用vbs操作excel時遇到了一些問題,目前我所能看到的書和資料上都沒有介紹過相關的東西,所以做一個小小的總結。

1.  先看看這段代碼:
For i = 1 To excel.Sheets.Count
excel.Sheets(i).Delete
Next
代碼似乎看起來沒問題,“依次刪除Excel中全部Sheet表”,但是執行結果卻是錯誤報錯:下標越界!
現在分析原因有:
a. EXCEL似乎不允許我們刪掉一個Excel中的全部表格,因為即使我們使用CreateObject("Scripting.FileSystemObject").CreateTextFile("D:\test.xlsx"),也會默認包含一個與文件名同名的Sheet表單;
b. EXCEL在我們刪除完一個Sheet表后,會自動把后面的Sheet表向前推一個位置,這樣我們執行循環刪除的時候就會報錯

所以,如果我們想刪除Excel表中的Sheet,可以用如下的代碼來刪:
For i = 1 To excel.Sheets.Count - 1
excel.Sheets(2).Delete
Next
即刪除除第一個Sheet表之外的其他所有表單。

2. excel寫入和保存的的時候,網上很多人都用的是這樣的代碼:
Set excel = CreateObject("Excel.Application")
excel.Workbooks.Open "E:\a.xlsx"
row = excel.ActiveWorkbook.Worksheets(excel.Sheets.Count).UsedRange.Rows.Count + 1
excel.Sheets(excel.Sheets.Count).Cells(row,Chr(65)).value = "TestValue1"
excel.ActiveWorkbook.Save
excel.Quit
Set excel = Nothing
這樣的代碼在當前只有一個Excel文件被打開的時候確實很好用,但是如果我們需要同時執行兩個腳本文件,並且每個腳本文件都有一些Excel的讀寫操作,那么執行之后就會發現,讀寫出來的數據每次都會因為執行腳本的順序不同而變化,並且保存的時候第二個腳本的保存Excel會出錯。
現在分析原因如下:
a. ActiveWorkbook和ActiveWorkSheet分別指的是當前處於活動狀態的workbook和worksheet,所以當多個腳本同時執行這些代碼時,都會把自己的數據讀寫到當前活動的那一個excel表單中,所以讀寫的數據就出錯了。保存的時候也是一樣,都只保存當前活動的excel,而原本應該被保存的文件卻被忽略了。

所以,我們可以采用這種方式來進行多個excel同時打開時的讀寫保存操作:
Set excel = CreateObject("Excel.Application")
excel.Workbooks.Open "E:\a.xlsx"
bookname = left(Wscript.scriptname,len(Wscript.scriptname,instr(Wscript.scriptname,".vbs",-1,1)
row = excel.Workbooks(bookname).Worksheets(excel.Sheets.Count).UsedRange.Rows.Count + 1
excel.Sheets(excel.Sheets.Count).Cells(row,Chr(65)).value = "TestValue1"
excel.excel.Workbooks(bookname).Save
excel.Quit
Set excel = Nothing
這樣就可以避免在多個Excel讀寫時相互混淆的問題了。不過qtp不支持直接使用wscript.scriptname,需要我們自己傳一個文件名的參數。
 
這個最早是在51autotest上面寫的,不過前段時間51autotest出問題不能進去,所以以后的文章還是搬過來吧。原文鏈接 http://www.51autotest.com/home.php?mod=space&uid=2535&do=blog&id=144


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM