找回密码
 加入
搜索
楼主: wsxjwsxj

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

  [复制链接]
 楼主| 发表于 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[0][$n]) Then $dic($arr[0][$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[0][$n]) Then
                                        $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
Else
        MsgBox(0,"","数据格式不对!")
EndIf
发表于 2013-5-9 10:46:23 | 显示全部楼层
附带你给的两个文件测试
 楼主| 发表于 2013-5-9 10:15:13 | 显示全部楼层
非常感谢大师的回复,我原来的代码确实是录制的,大师写的代码,看起来很吃力。直接拷过来运行,出现如下错误:
+>        AU3版本:        3.3.7.15
+> ============================================
>运行 AU3Check (1.54.21.0)  开始目录:D:\autoit3
+>10:12:17 AU3Check 完成[CODE]: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 完成:[CODE]:1
+>10:12:19 ACNWrapper 完成..
>退出代码: 1        运行时间: 1.983 秒
发表于 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[0][$n]) Then $dic($arr[0][$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[0][$n]) Then
                                        $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
Else
        MsgBox(0,"","数据格式不对!")
EndIf
如果是程序,不提倡用公式,看楼主的宏是录制的,不知道这样写你看得明白不
 楼主| 发表于 2013-5-8 23:05:17 | 显示全部楼层
我写了一段代码,目的是从JEXL表中得到三个单元格拼合起来的产品代码,
然后根据这个产品代码,去另外一个表中找到相应的数值.
如果用VBA的宏,很好做,且已经做好了,但在AU3中运行不成,
所以想通过变量直接得到这三个数值,第一个值没问题,后两个因为要转到
另一张表,出错了,请大师指教.

本帖子中包含更多资源

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

×
 楼主| 发表于 2013-5-8 22:51:39 | 显示全部楼层
也请大师验证一下,这段运行宏的代码是哪不合适了?
 楼主| 发表于 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 完成:[CODE]:1
发表于 2013-5-8 22:46:20 | 显示全部楼层
贴你的完整代码上来,附上excel文件
 楼主| 发表于 2013-5-8 22:42:52 | 显示全部楼层
谢谢KENVICH的回复,但运行的结果如3楼,不知道错在哪里。
 楼主| 发表于 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
发表于 2013-5-7 14:48:07 | 显示全部楼层
假设$oExcel是工作簿
$AA=$oExcel.application.worksheetfunction.match($aa,$oExcel.activesheet.range("a1:h10"),0)

不过在代码里调用工作表函数不如直接自己写函数
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-24 02:15 , Processed in 0.097043 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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