[已解决]请教操作Excel的一些问题
本帖最后由 zhaoceshi 于 2021-6-5 21:46 编辑有2个问题想请教下各位大神们。
一是,在使用Excel函数去读取Excel表里的数据,比如sheet1表的B列,然后把数据写入新建文本里面,发现效率很慢。看看大神有没有高效的操作方法?
二是,在使用$oWorkbook.Worksheets("sheet4").Usedrange.Columns 函数时,如果Excel表格里没有"sheet4"表,脚本就会直接报错退出运行。有没有方法可以判断没有指定的表格就直接跳过?
=======6.1
今天发现,Excel函数是不是有问题?只用用for循环函数循环多几次(3-6次)就会报变量错误,如果是手动运行多少次都不会。真是奇怪。使用64位编辑就不会报错
大致代码如下:
#include <Array.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>
;~ opt("MustDeclareVars", 1)
Local $7z = "c:\222\7z.exe", $date = "c:\统计\", $sfile, $sname, $a = 1
$sfile = FileFindFirstFile($date & "*.zip")
While 1
$sname = FileFindNextFile($sfile)
If @error Then ExitLoop
$a = $a
RunWait(@ComSpec & " /c " & $7z & " x " & $date & $sname & " -o" & $date & "\解压后\" & $a & "-" & StringReplace($sname, ".zip", "") & " -aoa", "", @SW_HIDE) ;
FileWriteLine($date & "\run.log",$a & "-" & StringReplace($sname, ".zip", ""))
Local $oExcel = _Excel_Open() ;(True,True) 为提示,否则
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "错误", "创建 Excel 应用对象发生错误." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
Local $oWorkbook = _Excel_BookOpen($oExcel, $date & "\解压后\" & $a & "-" & StringReplace($sname, ".zip", "")&"\index.xls",True,False)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeRead 示例", "打开工作簿发生错误 '" & $date & "\解压后\" & $a & "-" & StringReplace($sname, ".zip", "")&"\index.xls" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Excel_Close($oExcel)
Exit
EndIf
Local $ip = _Excel_RangeRead($oWorkbook,Default, $oWorkbook.Worksheets("sheet1").Usedrange.Columns("b:b")) ;$oWorkbook.ActiveSheet.Usedrange.Columns("b:b"))
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeRead 示例 3", "读工作簿失败." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
For $i = 0 To UBound($ip) - 1
If $ip[$i] = "" Or $ip[$i] = "错误" Then ContinueLoop
FileWriteLine($date&"关注信息.txt", $ip[$i])
Next
Local $ld = _Excel_RangeRead($oWorkbook,Default, $oWorkbook.Worksheets("sheet4").Usedrange.Columns("d:K"))
If @error Then ContinueLoop
For $i = 0 To UBound($ld) - 1
If $ld[$i] = "影响" Or$ld[$i] = "" Then ContinueLoop
FileWriteLine($date&$ld[$i]&".txt",$ld[$i])
Next
$a = $a + 1
_Excel_BookClose($oWorkbook,False)
_Excel_Close($oExcel)
WEnd
写入:_Excel_RangeWrite
; 显示特定工作簿的所有工作表清单
Local $aWorkSheets = _Excel_SheetList($oWorkbook) 读取表名后 做个判断 B:B会把没有用到的空白单元格也读取出来,影响效率,还是要指定一下行号。 1:读取显示列表Listview写入後TXT
2:读取表名显示GUICtrlCreateInput后做判断
zch11230 发表于 2021-5-30 21:20
B:B会把没有用到的空白单元格也读取出来,影响效率,还是要指定一下行号。
$oWorkbook.ActiveSheet.Usedrange.Columns这一代码是可以获取到有数据的最大行和列,也就是说,你表格只有5000行,那么就指挥现在B1:B5000的数据,而不会显示6万多行的数据。 chzj589 发表于 2021-5-30 16:23
写入:_Excel_RangeWrite
; 显示特定工作簿的所有工作表清单
Local $aWorkSheets = _Excel_SheetList($oW ...
是的,_Excel_SheetList可以解决第二个问题了,感谢,一直没留意这个函数。 chzj589 发表于 2021-5-31 10:02
1:读取显示列表Listview写入後TXT
2:读取表名显示GUICtrlCreateInput后做判断
也是一个思路,多谢 VB又快又省事,然后就是数组处理的事了
func r_exc($ex_p);读取EXCEL(路径)
if FileExists($ex_p) then
$xls= ObjGet($ex_p)
With $xls.activesheet
$xls_su = .usedrange.value
$xls_su = .parent.application.transpose($xls_su)
.parent.close(False)
EndWith
Return $xls_su
EndIf
EndFunc
页:
[1]