找回密码
 加入
搜索
查看: 21230|回复: 25

[AU3基础] (已解决)EXCEL,根据已知数值,得到包含它的单元格所在行号,或该行其他单元格数值

  [复制链接]
发表于 2013-5-7 10:59:06 | 显示全部楼层 |阅读模式
本帖最后由 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没有定义。

请高手指教
发表于 2018-5-7 21:09:43 | 显示全部楼层
如果是2给Excel文件能不能实现这样的功能呢?
发表于 2018-5-7 21:09:40 | 显示全部楼层
如果是2给Excel文件能不能实现这样的功能呢?
发表于 2015-2-24 14:16:28 | 显示全部楼层
感谢大神
学习下,非常感谢
发表于 2014-7-27 10:39:34 | 显示全部楼层
好贴,必须认真研究一下。
发表于 2013-10-22 09:43:50 | 显示全部楼层
很有用的代码,慢慢学习!
 楼主| 发表于 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)
 楼主| 发表于 2013-5-21 00:40:51 | 显示全部楼层
经过反复的代入,试运行,终于找到了问题的根结,是因为JEXL表的[原单号]这一列是空列,在运行的过程中没有先进行运算,并把结果值填入该列,后面的程序没有了依据,从而得不出程序结果。在这里再一次感谢KENVINCH大师的指点。
还想多问一下, $arr2=.range($rng.offset(1),.cells(.rows.count,$rng.column).end(3).offset(0,1)).value  这条语句中的END()的作用是什么?在百度搜了很久也没有答案,另外我把()里填了1-5再来运行,也没找出规律。请大师指教。
 楼主| 发表于 2013-5-19 11:20:22 | 显示全部楼层
我的最终目的,是想从百胜ERP软件中导出EXCEL表,然后再导入到金蝶K3中去,请大师再费费心,看一看。

本帖子中包含更多资源

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

×
 楼主| 发表于 2013-5-19 11:14:07 | 显示全部楼层

本帖子中包含更多资源

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

×
 楼主| 发表于 2013-5-19 11:08:35 | 显示全部楼层
这几天一直在看数组和字典,虽然稍有进步,但还是不能完全理解,在大师写的程序中,加了几行查看数组结果的语句,发现最终的结果没有完成,还请大师再看一看。
下面是我加了语句的代码。和数组结果的截图。
#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[0][$n]) Then $dic($arr[0][$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[0][$n]) Then  ;如果存在对应内容的key则
                                        $arr2[1][$n]=$arr[7][$dic($arr2[0][$n])]  ;因为会覆盖原内容,所以先写后面的,将源数组中对应的内容写入到结果数组对应位置
                                        $arr2[0][$n]=$arr[6][$dic($arr2[0][$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
 楼主| 发表于 2013-5-13 22:52:14 | 显示全部楼层
这几天一直在琢磨大师写的这段代码,翻看什么是数组和字典。再回头来看大师的代码,还是不大懂。准备再深入学习一下,过半个月再返来看。在这里先谢谢大师KENVINCH。
发表于 2013-5-10 09:01:37 | 显示全部楼层
回复 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[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")  ;打开要编辑的工作簿
        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[0][$n]) Then  ;如果存在对应内容的key则
                                        $arr2[1][$n]=$arr[7][$dic($arr2[0][$n])]  ;因为会覆盖原内容,所以先写后面的,将源数组中对应的内容写入到结果数组对应位置
                                        $arr2[0][$n]=$arr[6][$dic($arr2[0][$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
以上内容如果你对字典和数组有一定认识的话应该可以看懂了,如果不懂先自行补充点基础知识吧
发表于 2013-5-10 07:56:41 | 显示全部楼层
等有空时给你写写解释
 楼主| 发表于 2013-5-10 00:28:28 | 显示全部楼层
我最终的目的是把要EXCEL表中的每一行的那三项数据,填入到金蝶的数据表中去。大师的代码一闪而过,我不知道怎样分行得到每一项数据。还请大师指教。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

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

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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