wsxjwsxj 发表于 2013-5-10 00:22:21

又重新运行了大师写的代码,是可以运行的,之所以上次没运行成功是因为我自以为是的加上了#include <excel.au3>
#include<file.au3>
代码运行的速度超快,只知道完成了,但我要的数据不知道该怎么找。很艰难地试着一个个去解读大师写的代码,但大部分还是没弄明白。希望大师能把代码的作用写个解释吧

$wb=ObjGet(@ScriptDir&"\k3dyb.xls");ObjGet对 COM 对象从现有的进程或文件名检索一个参考.
With $wb.worksheets("DYB")       ;With用于减少对象类型变量的参考文本,便于快速编写
      $arr=.usedrange.value
EndWith
$wb.close(False)
If IsArray($arr) Then   ;IsArray检查某个变量是否数组类型
      $dic=ObjCreate("scripting.dictionary")   ;ObjCreate通过一个指定的类名引用一个 COM 对象
      For $n=1 To UBound($arr,2)-1       ;UBound返回数组维度的大小
                If Not $dic.exists($arr[$n]) Then $dic($arr[$n])=$n ;?
      Next
      $oexcel=ObjCreate("excel.application")   ;创建一个Excel 对象
      $oexcel.visible=True;想隐藏执行,把这里改成False
      $wb=$oexcel.workbooks.open(@ScriptDir&"\JEXL.xls")
      With $wb.worksheets("配货表")
                $rng=.cells.find("原单号")
                If IsObj($rng) Then;检查一个变量或者表达式是否为对象类型
                        $arr2=.range($rng.offset(1),.cells(.rows.count,$rng.column).end(3).offset(0,1)).value    ;?
                        For $n=0 To UBound($arr2,2)-1
                              If $dic.exists($arr2[$n]) Then
                                        $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
Else
      MsgBox(0,"","数据格式不对!")
EndIf

kevinch 发表于 2013-5-9 10:46:23

附带你给的两个文件测试

wsxjwsxj 发表于 2013-5-9 10:15:13

非常感谢大师的回复,我原来的代码确实是录制的,大师写的代码,看起来很吃力。直接拷过来运行,出现如下错误:
+>        AU3版本:        3.3.7.15
+> ============================================
>运行 AU3Check (1.54.21.0)开始目录:D:\autoit3
+>10:12:17 AU3Check 完成:0
>运行:(3.3.7.15):D:\autoit3\autoit3_x64.exe "D:\uuuu.au3"   
D:\uuuu.au3 (17) : ==> ?????????????? "With" ??.:
With $wb.worksheets("DYB")
With ^ ERROR
->10:12:17 AutoIT3.exe 完成::1
+>10:12:19 ACNWrapper 完成..
>退出代码: 1        运行时间: 1.983 秒

kevinch 发表于 2013-5-9 08:21:46

本帖最后由 kevinch 于 2013-5-9 08:22 编辑

$wb=ObjGet(@ScriptDir&"\k3dyb.xls")
With $wb.worksheets("DYB")
        $arr=.usedrange.value
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
        Next
        $oexcel=ObjCreate("excel.application")
        $oexcel.visible=True;想隐藏执行,把这里改成False
        $wb=$oexcel.workbooks.open(@ScriptDir&"\JEXL.xls")
        With $wb.worksheets("配货表")
                $rng=.cells.find("原单号")
                If IsObj($rng) Then
                        $arr2=.range($rng.offset(1),.cells(.rows.count,$rng.column).end(3).offset(0,1)).value
                        For $n=0 To UBound($arr2,2)-1
                                If $dic.exists($arr2[$n]) Then
                                        $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
Else
        MsgBox(0,"","数据格式不对!")
EndIf
如果是程序,不提倡用公式,看楼主的宏是录制的,不知道这样写你看得明白不

wsxjwsxj 发表于 2013-5-8 23:05:17

我写了一段代码,目的是从JEXL表中得到三个单元格拼合起来的产品代码,
然后根据这个产品代码,去另外一个表中找到相应的数值.
如果用VBA的宏,很好做,且已经做好了,但在AU3中运行不成,
所以想通过变量直接得到这三个数值,第一个值没问题,后两个因为要转到
另一张表,出错了,请大师指教.

wsxjwsxj 发表于 2013-5-8 22:51:39

也请大师验证一下,这段运行宏的代码是哪不合适了?

wsxjwsxj 发表于 2013-5-8 22:50:30

另外从http://www.autoitx.com/forum.php?mod=viewthread&tid=13074&extra=&highlight=%BA%EA&page=1抄了一段关于在AUTOIT里运行宏的代码放到EXCEL.AU3中,然后在程序中调用_ExcelMacroRun($oExcel, "JCSJ"),结果错误示如下
D:\autoit3\Include\excel.au3 (1286) : ==> ??????(?????).:
$o_object.Run($s_MacroName, $v_Arg1, $v_Arg2, $v_Arg3, $v_Arg4, $v_Arg5, $v_Arg6, $v_Arg7, $v_Arg8, $v_Arg9, $v_Arg10, $v_Arg11, $v_Arg12, $v_Arg13, $v_Arg14, $v_Arg15, $v_Arg16, $v_Arg17, $v_Arg18, $v_Arg19, $v_Arg20, $v_Arg21, $v_Arg22, $v_Arg23, $v_Arg24, $v_Arg25, $v_Arg26, $v_Arg27, $v_Arg28, $v_Arg29, $v_Arg30)
$o_object.Run($s_MacroName, $v_Arg1, $v_Arg2, $v_Arg3, $v_Arg4, $v_Arg5, $v_Arg6, $v_Arg7, $v_Arg8, $v_Arg9, $v_Arg10, $v_Arg11, $v_Arg12, $v_Arg13, $v_Arg14, $v_Arg15, $v_Arg16, $v_Arg17, $v_Arg18, $v_Arg19, $v_Arg20, $v_Arg21, $v_Arg22, $v_Arg23, $v_Arg24, $v_Arg25, $v_Arg26, $v_Arg27, $v_Arg28, $v_Arg29, $v_Arg30)^ ERROR
->13:06:38 AutoIT3.exe 完成::1

kevinch 发表于 2013-5-8 22:46:20

贴你的完整代码上来,附上excel文件

wsxjwsxj 发表于 2013-5-8 22:42:52

谢谢KENVICH的回复,但运行的结果如3楼,不知道错在哪里。

wsxjwsxj 发表于 2013-5-8 22:40:31

>运行:(3.3.7.15):D:\autoit3\autoit3_x64.exe "D:\333.au3"   
D:\333.au3 (65) : ==> ???????????("Object").:
$hh = $oExcel.application.worksheetfunction.match($aa,$oExcel.activesheet.range("a1:h10"),0)
$hh = $oExcel^ ERROR
->22:39:41 AutoIT3.exe 完成:[CODE

kevinch 发表于 2013-5-7 14:48:07

假设$oExcel是工作簿
$AA=$oExcel.application.worksheetfunction.match($aa,$oExcel.activesheet.range("a1:h10"),0)

不过在代码里调用工作表函数不如直接自己写函数
页: 1 [2]
查看完整版本: (已解决)EXCEL,根据已知数值,得到包含它的单元格所在行号,或该行其他单元格数值