wsxjwsxj 发表于 2013-5-7 10:59:06

(已解决)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没有定义。

请高手指教

8393671 发表于 2018-5-7 21:09:43

如果是2给Excel文件能不能实现这样的功能呢?

8393671 发表于 2018-5-7 21:09:40

如果是2给Excel文件能不能实现这样的功能呢?

ak47gglllk 发表于 2015-2-24 14:16:28

感谢大神
学习下,非常感谢

jianganew 发表于 2014-7-27 10:39:34

好贴,必须认真研究一下。

空城的守望 发表于 2013-10-22 09:43:50

很有用的代码,慢慢学习!

wsxjwsxj 发表于 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[$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)

wsxjwsxj 发表于 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再来运行,也没找出规律。请大师指教。

wsxjwsxj 发表于 2013-5-19 11:20:22

我的最终目的,是想从百胜ERP软件中导出EXCEL表,然后再导入到金蝶K3中去,请大师再费费心,看一看。

wsxjwsxj 发表于 2013-5-19 11:14:07

wsxjwsxj 发表于 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[$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

wsxjwsxj 发表于 2013-5-13 22:52:14

这几天一直在琢磨大师写的这段代码,翻看什么是数组和字典。再回头来看大师的代码,还是不大懂。准备再深入学习一下,过半个月再返来看。在这里先谢谢大师KENVINCH。

kevinch 发表于 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[$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以上内容如果你对字典和数组有一定认识的话应该可以看懂了,如果不懂先自行补充点基础知识吧

kevinch 发表于 2013-5-10 07:56:41

等有空时给你写写解释

wsxjwsxj 发表于 2013-5-10 00:28:28

我最终的目的是把要EXCEL表中的每一行的那三项数据,填入到金蝶的数据表中去。大师的代码一闪而过,我不知道怎样分行得到每一项数据。还请大师指教。
页: [1] 2
查看完整版本: (已解决)EXCEL,根据已知数值,得到包含它的单元格所在行号,或该行其他单元格数值