找回密码
 加入
搜索
查看: 9945|回复: 9

[AU3基础] excel加了一句$oExcel.WorkSheets(2).Select就不能运行了

  [复制链接]
发表于 2013-10-23 15:01:02 | 显示全部楼层 |阅读模式
本帖最后由 空城的守望 于 2013-10-24 09:06 编辑
#include <excel.au3>
$sFilePath = @ScriptDir & "\test.xls"
$oExcel = _ExcelBookOpen ($sFilePath,1,False)
;$oExcel.WorkSheets(2).Select
Dim $i=1,$j=4
Dim $yalurow=$oExcel.activesheet.usedrange.rows.count
While $i<=$yalurow
            If StringStripWS( _ExcelReadCell($oExcel, $i, 7), 8)="发运订单" Then                        
            $oExcel.sheets("data").Cells($j, 2).Value = $oExcel.Sheets("yalu").Cells($i + 2, 2).Text
            $oExcel.sheets("data").Cells($j, 3).Value = $oExcel.Sheets("yalu").Cells($i + 2, 2).Text
            $oExcel.sheets("data").Cells($j, 4).Value = $oExcel.Sheets("yalu").Cells($i + 2, 8).Text
            $oExcel.sheets("data").Cells($j, 6).Value = StringStripWS( $oExcel.Sheets("yalu").Cells($i + 2, 4).Text, 8)
            $oExcel.sheets("data").Cells($j, 26).Value = "电子秤;" & $oExcel.Sheets("yalu").Cells($i + 1, 2).Text
            $i = $i + 9
            Do                        
                If $oExcel.Sheets("yalu").Cells($i, 1).Text = "总数量" Then                                
                    $oExcel.sheets("data").Cells($j, 9).Value = $oExcel.Sheets("yalu").Cells($i, 2).Text
                    $i = $i + 2
                    $j = $j + 1        
                                    ExitLoop
                            Else
                                    $i=$i+1
                            EndIf
            Until $i >= $yalurow
        EndIf
    Sleep(1000)        
WEnd
_ExcelBookSave($oExcel)
$oExcel.WorkSheets(2).Select
MsgBox(0, "提示", "excel转换完成")
_ExcelBookClose($oExcel)
为什么我加了$oExcel.WorkSheets(2).Select,我的程序就不能运行了,而且不加sleep(100),cpu占有率75左右,但我的循环不是死循环啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2013-10-23 15:02:11 | 显示全部楼层
而且在au3中执行效率远不如在vba中的效率
发表于 2013-10-23 21:24:41 | 显示全部楼层
报错内容是什么?au3里执行效率应该比vba差不了多少吧
 楼主| 发表于 2013-10-24 08:27:29 | 显示全部楼层
回复 3# kevinch

没有报错,就是一直在运行出不了结果!不加sleep的话cpu占有率很高。去掉$oExcel.WorkSheets(2).Select这句可以执行,大约在30秒出结果,而在vba中是立马出现的,请大神指导
 楼主| 发表于 2013-10-24 09:07:35 | 显示全部楼层
回复 3# kevinch
我把附件也上传了,请大神看运行看一下
发表于 2013-10-24 17:34:44 | 显示全部楼层
我也觉得vba处理Excel表格数据比au3快许多
发表于 2013-10-24 18:25:49 | 显示全部楼层
我用Range对象操作的方式写了一个,感觉是有些慢,没办法,毕竟不是自己的对象,总要去“求人办事”一样,所以会慢,其实vba本身操作range对象也快不了,不过操作对象时用with语句情况会好一点,不用什么事都从头找起
$excel=ObjCreate("excel.application")
$excel.visible=True
$wb=$excel.workbooks.open(@ScriptDir & "\test.xls")
$rngs=$wb.worksheets("yalu").cells.find("发运订单")
If IsObj($rngs) Then
        $rng=$rngs
        With $wb.worksheets("data")
                $n=.cells(.rows.count,2).end(3).row
        EndWith
        Do
                $n+=1
                With $wb.worksheets("data").cells($n,2)
                        .value=$rng.offset(2,-5).value
                        .offset(0,1).value=$rng.offset(2,-5).value
                        .offset(0,2).value=$rng.offset(2,1).value
                        .offset(0,4).value=$rng.offset(2,-3).value
                        .offset(0,7).value=$rng.offset(9,-5).value
                        .offset(0,24).value="电子秤;"&$rng.offset(1,-5).value
                EndWith
                $rng=$wb.worksheets("yalu").cells.findnext($rng)
        Until $rng.address=$rngs.address
EndIf
$wb.close(true)
$excel.quit
发表于 2013-10-24 18:28:59 | 显示全部楼层
用数组也写了一个,这个比较快,毕竟数组有各个语言自己的处理方式,相当于拿了别人的数据用自己擅长的方式处理,所以可以的话还是尽量用数组来处理数据好些,楼主的数据也算是很规范的,只是au3读取excel工作表得到的数组与excel表格或vba中读取的数组行列刚好相反,这个要绕一点,注意区别就好了
$excel=ObjCreate("excel.application")
$excel.visible=True
$wb=$excel.workbooks.open(@ScriptDir & "\test.xls")
$arr=$wb.worksheets("yalu").usedrange.value
Dim $result[25][UBound($arr,2)]
$i=-1
For $n=0 To UBound($arr,2)-1
        If $arr[6][$n]<>"" Then
                If StringReplace($arr[6][$n]," ","")="发运订单" Then
                        $i+=1
                        $result[0][$i]=$arr[1][$n+2]
                        $result[1][$i]=$arr[1][$n+2]
                        $result[2][$i]=$arr[7][$n+2]
                        $result[4][$i]=$arr[3][$n+2]
                        $result[7][$i]=$arr[1][$n+9]
                        $result[24][$i]="电子秤;"&$arr[1][$n+1]
                        $n+=9
                EndIf
        EndIf
Next
With $wb.worksheets("data")
        .cells(.rows.count,2).end(3).offset(1).resize($i+1,UBound($result)).value=$result
EndWith
;MsgBox(0,"","OK")
$wb.close(true)
$excel.quit

评分

参与人数 1金钱 +20 收起 理由
MaGiCmAn + 20 谢谢分享!学习了

查看全部评分

 楼主| 发表于 2013-10-25 15:55:11 | 显示全部楼层
回复 8# kevinch
谢谢大神给我改的代码,我再好好研究一下
发表于 2013-10-28 23:02:44 | 显示全部楼层
同志们加油
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 16:26 , Processed in 0.079317 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表