|
楼主 |
发表于 2013-5-26 13:43:14
|
显示全部楼层
感谢KENVINCH大师的指点,自己也反复倒腾了很多日子,终于搞得差不多了。把我在大师写的代码基础上修改的完整代码贴上来,希望给有相同需求的坛友们一点启发。
这段代码的主要作用是把百胜中导到EXCEL表的数据,做一个商品代码的一一对应,然后把完成对应的数据,导入到金蝶K3中。
#include <Array.au3>
#include <excel.au3>
#include <Date.au3>
HotKeySet("{ESC}", "Terminate") ;设置退出热键
Func Terminate()
Exit 0
EndFunc
$a = _DateDiff( 'd',"2013/12/10 00:00:00",_NowCalc()) ;设置日期时限
If $a > 1 Then
MsgBox(0,"","系统出现故障,点确定退出")
EXIT
EndIf
$wb=ObjGet(@ScriptDir&"\百胜K3对应表.xls") ;隐藏打开源工作簿,注意objget打开的工作簿不经处理的话只能读不能写
With $wb.worksheets("DYB")
$arr=.usedrange.value ;提取指定工作表中的内容到数组中,au3读取到的行列与excel刚好相反,不知道为何
.usedrange.value=$arr
EndWith
$wb.close(False) ;关闭源工作簿
;_ArrayDisplay($arr, "111看数组") ; ;我增加的,看数组的值
If IsArray($arr) Then ;如果读取到的是数组,即不只一个单元格有内容
$dic=ObjCreate("scripting.dictionary") ;创建字典项目,关于字典自己去搜索吧
For $n=1 To UBound($arr,2)-1 ;循环数据各行(这里是数组各列,还记得行列是反的吧)
If Not $dic.exists($arr[0][$n]) Then $dic($arr[0][$n])=$n ;如果字典中不存在对应的数据内容的key,则添加并用item记录下对应的行号
Next
;$oexcel=ObjCreate("excel.application") ;创建excel进程
;$oexcel.visible=True ;设置进程可见与否,想隐藏执行,把这里改成False
;$wb=$oexcel.workbooks.open(@ScriptDir&"\JEXL.xls") ;打开要编辑的工作簿
Local $wb = _ExcelBookAttach("转换模板.xls", "filename") ;上面几句修改成:联接到已打开的文件
WinWait("Microsoft Excel - 转换模板.xls","")
If Not WinActive("Microsoft Excel - 转换模板.xls","") Then WinActivate("Microsoft Excel - 转换模板.xls [兼容模式]","")
WinWaitActive("Microsoft Excel - 转换模板.xls","")
With $wb.worksheets("配发货单") ;下述with语句中的操作针对指定表
$rng3=.cells.find("单据编号") ;查找"单据编号这个表格标题的位置
If IsObj($rng3) Then ;如果找到
$arr3=.range($rng3.offset(0,0),.cells(.rows.count,$rng3.column).end(3).offset(0,25)).value
;_ArrayDisplay($arr3, "000 看数组3") ;我增加的,看数组3的值
For $n=1 To UBound($arr3,2)-1 ;循环读取到的各行(注意行列与数组中与在excel中是反的)
$arr3[2][$n]=$arr3[7][$n]&$arr3[13][$n]&$arr3[15][$n]
Next
.range($rng3.offset(0,0),.cells(.rows.count,$rng3.column).end(3).offset(0,25)).value=$arr3
;_ArrayDisplay($arr3, "000 看数组中条形码是否加上") ;我增加的,看数组3的值
ENDIF
$rng=.cells.find("条形码") ;查找"条形码"这个表格标题的位置
If IsObj($rng) Then ;如果找到
$arr2=.range($rng.offset(1),.cells(.rows.count,$rng.column).end(3).offset(0,1)).value ;把要查询区域内容读取到数组中,这里读取两列是为了写回时直接写回到结果区,当然也可以读取一列,然后再redim
;_ArrayDisplay($arr2, "222看数组") ;我增加的,看数组2的值
; MsgBox(0,"KKKK",UBound($arr2,2))
For $n=0 To UBound($arr2,2)-1 ;循环读取到的各行(注意行列与数组中与在excel中是反的)
If $dic.exists($arr2[0][$n]) Then ;如果存在对应内容的key则
$arr2[1][$n]=$arr[6][$dic($arr2[0][$n])] ;因为会覆盖原内容,所以先写后面的,将源数组中对应的内容写入到结果数组对应位置
$arr2[0][$n]=$arr[5][$dic($arr2[0][$n])]
EndIf
Next
;_ArrayDisplay($arr2, "333 看数组") ;我增加的,看数组2的值
$rng.offset(1,1).resize(UBound($arr2,2),UBound($arr2)).value=$arr2 ;把结果数组写入结果区
$arr3=.range($rng.offset(0,-2),.cells(.rows.count,$rng.column).end(3).offset(0,23)).value
_ArrayDisplay($arr3, "333 看数组") ;我增加的,看数组2的值
;MsgBox(0,"查看数组元素值",$arr3[3][1])
EndIf
EndWith
;$wb.close(true) ;保存并关闭工作簿
;$oexcel.quit ;退出excel进程
Else ;如果读取到的不是数组,即只有一个单元格的情况
MsgBox(0,"","数据格式不对!") ;显示提示
EndIf
Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
WinWait("录入单据","")
If Not WinActive("录入单据","") Then WinActivate("录入单据","")
WinWaitActive("录入单据","")
For $n=1 To UBound($arr3,2)-1
MouseMove(109,286)
MouseDown("left")
MouseUp("left")
MouseMove(76,312)
MouseDown("left")
MouseUp("left")
Send($arr3[3][$n])
MouseMove(700,311)
MouseDown("left")
MouseUp("left")
Send("0")
;Sleep(10)
MouseMove(516,312)
MouseDown("left")
MouseUp("left")
Send($arr3[4][$n])
MouseMove(700,311)
MouseDown("left")
MouseUp("left")
Send($arr3[20][$n])
MouseMove(760,312)
MouseDown("left")
MouseUp("left")
Send($arr3[23][$n])
Send("{ENTER}")
MouseMove(350,66)
MouseDown("left")
MouseUp("left")
Next
MouseMove(310,66)
MouseDown("left")
MouseUp("left")
msgbox(4096,"提示","恭喜,转换完成了",50) |
|