(已解决)EXCEL,根据已知数值,得到包含它的单元格所在行号,或该行其他单元格数值
本帖最后由 wsxjwsxj 于 2013-5-26 13:46 编辑在EXCEL表中,我希望根据A列中已知的值,得到和它在一行上其他列的值,并赋予变量。
$HH=VLOOKUP($I$1,A:F,2,FALSE),这个公式在EXCEL的VBA中能运行,但是在AUTOIT中就不认了。
另外,我想通过另一种思路来解决这个问题,就是得到包含一个值的单元格的行号,然后去找这一行相应列的数据。
$AA = $oExcel.ActiveSheet.Match($aa, range(a1:h10"), 0) 这个公式在AUTOIT中行不通,说RANGE没有定义。
请高手指教 如果是2给Excel文件能不能实现这样的功能呢? 如果是2给Excel文件能不能实现这样的功能呢? 感谢大神
学习下,非常感谢 好贴,必须认真研究一下。 很有用的代码,慢慢学习! 感谢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[$n]) Then $dic($arr[$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[$n]=$arr3[$n]&$arr3[$n]&$arr3[$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[$n]) Then;如果存在对应内容的key则
$arr2[$n]=$arr[$dic($arr2[$n])];因为会覆盖原内容,所以先写后面的,将源数组中对应的内容写入到结果数组对应位置
$arr2[$n]=$arr[$dic($arr2[$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)
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[$n])
MouseMove(700,311)
MouseDown("left")
MouseUp("left")
Send("0")
;Sleep(10)
MouseMove(516,312)
MouseDown("left")
MouseUp("left")
Send($arr3[$n])
MouseMove(700,311)
MouseDown("left")
MouseUp("left")
Send($arr3[$n])
MouseMove(760,312)
MouseDown("left")
MouseUp("left")
Send($arr3[$n])
Send("{ENTER}")
MouseMove(350,66)
MouseDown("left")
MouseUp("left")
Next
MouseMove(310,66)
MouseDown("left")
MouseUp("left")
msgbox(4096,"提示","恭喜,转换完成了",50) 经过反复的代入,试运行,终于找到了问题的根结,是因为JEXL表的[原单号]这一列是空列,在运行的过程中没有先进行运算,并把结果值填入该列,后面的程序没有了依据,从而得不出程序结果。在这里再一次感谢KENVINCH大师的指点。
还想多问一下, $arr2=.range($rng.offset(1),.cells(.rows.count,$rng.column).end(3).offset(0,1)).value这条语句中的END()的作用是什么?在百度搜了很久也没有答案,另外我把()里填了1-5再来运行,也没找出规律。请大师指教。 我的最终目的,是想从百胜ERP软件中导出EXCEL表,然后再导入到金蝶K3中去,请大师再费费心,看一看。 这几天一直在看数组和字典,虽然稍有进步,但还是不能完全理解,在大师写的程序中,加了几行查看数组结果的语句,发现最终的结果没有完成,还请大师再看一看。
下面是我加了语句的代码。和数组结果的截图。
#include <Array.au3>
$wb=ObjGet(@ScriptDir&"\k3dyb.xls");隐藏打开源工作簿,注意objget打开的工作簿不经处理的话只能读不能写
With $wb.worksheets("DYB")
$arr=.usedrange.value;提取指定工作表中的内容到数组中,au3读取到的行列与excel刚好相反,不知道为何
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[$n]) Then $dic($arr[$n])=$n ;如果字典中不存在对应的数据内容的key,则添加并用item记录下对应的行号
Next
$Keys=$dic.keys() ;我增加的
$items=$dic.items() ;我增加的
_ArrayDisplay($Keys) ;我增加的,看字典KEY值
_ArrayDisplay($items) ;我增加的,看字典ITEM值
$oexcel=ObjCreate("excel.application");创建excel进程
$oexcel.visible=True;设置进程可见与否,想隐藏执行,把这里改成False
$wb=$oexcel.workbooks.open(@ScriptDir&"\JEXL.xls");打开要编辑的工作簿
With $wb.worksheets("配货表");下述with语句中的操作针对指定表
$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的值
For $n=0 To UBound($arr2,2)-1;循环读取到的各行(注意行列与数组中与在excel中是反的)
If $dic.exists($arr2[$n]) Then;如果存在对应内容的key则
$arr2[$n]=$arr[$dic($arr2[$n])];因为会覆盖原内容,所以先写后面的,将源数组中对应的内容写入到结果数组对应位置
$arr2[$n]=$arr[$dic($arr2[$n])]
EndIf
Next
$rng.offset(1,1).resize(UBound($arr2,2),UBound($arr2)).value=$arr2;把结果数组写入结果区
_ArrayDisplay($arr2, "333 看数组") ;我增加的,看数组2的值
EndIf
EndWith
$wb.close(true);保存并关闭工作簿
$oexcel.quit;退出excel进程
Else;如果读取到的不是数组,即只有一个单元格的情况
MsgBox(0,"","数据格式不对!");显示提示
EndIf 这几天一直在琢磨大师写的这段代码,翻看什么是数组和字典。再回头来看大师的代码,还是不大懂。准备再深入学习一下,过半个月再返来看。在这里先谢谢大师KENVINCH。 回复 13# wsxjwsxj $wb=ObjGet(@ScriptDir&"\k3dyb.xls");隐藏打开源工作簿,注意objget打开的工作簿不经处理的话只能读不能写
With $wb.worksheets("DYB")
$arr=.usedrange.value;提取指定工作表中的内容到数组中,au3读取到的行列与excel刚好相反,不知道为何
EndWith
$wb.close(False);关闭源工作簿
If IsArray($arr) Then;如果读取到的是数组,即不只一个单元格有内容
$dic=ObjCreate("scripting.dictionary");创建字典项目,关于字典自己去搜索吧
For $n=1 To UBound($arr,2)-1;循环数据各行(这里是数组各列,还记得行列是反的吧)
If Not $dic.exists($arr[$n]) Then $dic($arr[$n])=$n ;如果字典中不存在对应的数据内容的key,则添加并用item记录下对应的行号
Next
$oexcel=ObjCreate("excel.application");创建excel进程
$oexcel.visible=True;设置进程可见与否,想隐藏执行,把这里改成False
$wb=$oexcel.workbooks.open(@ScriptDir&"\JEXL.xls");打开要编辑的工作簿
With $wb.worksheets("配货表");下述with语句中的操作针对指定表
$rng=.cells.find("原单号");查找"原单号"这个表格标题的位置
If IsObj($rng) Then;如果找到
$arr2=.range($rng.offset(1),.cells(.rows.count,$rng.column).end(3).offset(0,1)).value;把要查询区域内容读取到数组中,这里读取两列是为了写回时直接写回到结果区,当然也可以读取一列,然后再redim
For $n=0 To UBound($arr2,2)-1;循环读取到的各行(注意行列与数组中与在excel中是反的)
If $dic.exists($arr2[$n]) Then;如果存在对应内容的key则
$arr2[$n]=$arr[$dic($arr2[$n])];因为会覆盖原内容,所以先写后面的,将源数组中对应的内容写入到结果数组对应位置
$arr2[$n]=$arr[$dic($arr2[$n])]
EndIf
Next
$rng.offset(1,1).resize(UBound($arr2,2),UBound($arr2)).value=$arr2;把结果数组写入结果区
EndIf
EndWith
$wb.close(true);保存并关闭工作簿
$oexcel.quit;退出excel进程
Else'如果读取到的不是数组,即只有一个单元格的情况
MsgBox(0,"","数据格式不对!");显示提示
EndIf以上内容如果你对字典和数组有一定认识的话应该可以看懂了,如果不懂先自行补充点基础知识吧 等有空时给你写写解释 我最终的目的是把要EXCEL表中的每一行的那三项数据,填入到金蝶的数据表中去。大师的代码一闪而过,我不知道怎样分行得到每一项数据。还请大师指教。
页:
[1]
2