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
原文地址:https://www.cnblogs.com/SilenceCity/p/2730243.html