空城的守望 发表于 2013-10-23 15:01:02

excel加了一句$oExcel.WorkSheets(2).Select就不能运行了

本帖最后由 空城的守望 于 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中的效率

kevinch 发表于 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
我把附件也上传了,请大神看运行看一下

MaGiCmAn 发表于 2013-10-24 17:34:44

我也觉得vba处理Excel表格数据比au3快许多

kevinch 发表于 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

kevinch 发表于 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
$i=-1
For $n=0 To UBound($arr,2)-1
        If $arr[$n]<>"" Then
                If StringReplace($arr[$n]," ","")="发运订单" Then
                        $i+=1
                        $result[$i]=$arr[$n+2]
                        $result[$i]=$arr[$n+2]
                        $result[$i]=$arr[$n+2]
                        $result[$i]=$arr[$n+2]
                        $result[$i]=$arr[$n+9]
                        $result[$i]="电子秤;"&$arr[$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

空城的守望 发表于 2013-10-25 15:55:11

回复 8# kevinch
谢谢大神给我改的代码,我再好好研究一下

joyran 发表于 2013-10-28 23:02:44

同志们加油
页: [1]
查看完整版本: excel加了一句$oExcel.WorkSheets(2).Select就不能运行了