找回密码
 加入
搜索
查看: 14841|回复: 27

[AU3基础] 读取EXCEL中的人名,统计重复人名的数量,记录在二维数组里【已解决】

 火.. [复制链接]
发表于 2011-8-4 01:13:25 | 显示全部楼层 |阅读模式
本帖最后由 xwt620 于 2011-8-4 22:53 编辑
#AutoIt3Wrapper_Run_Debug_Mode=Y

#include <Array.au3>
#Include <ExcelCOM_UDF.au3>


Local $sFilepath = "d:\rm.xls"
Local $oExcel = _ExcelBookOpen($sFilePath)
Local $aName[1][1]

If @error = 1 Then
    MsgBox(0, "错误!", "无法创建对象!")
    Exit
ElseIf @error = 2 Then
    MsgBox(0, "错误!", "文件不存在!")
    Exit
EndIf

Local $UseRange = _ExcelSheetUsedRangeGet($oExcel, _ExcelSheetNameGet($oExcel)) ;返回最大范围
For $i = 2 To $UseRange[3] ;有标题从第二行开始读
        $sName = _ExcelReadCell($oExcel,$i)
        Local $iIndex = _ArraySearch($aName, $sName)
        If @error Then ;没有匹配的人名
                $k = UBound($aName)
                $aName[$k][0] = $sName
                $aName[$k][1] = 1
                _ArrayDisplay($aName, "添加后的数据 _ArrayAdd()")
        Else
                $aName[$iIndex][1] = $aName[$iIndex][1] + 1
        EndIf
Next
0026: 0-0:         If @error Then ;没有匹配的人名
0034: 0-0:                 $aName[$iIndex][1] = $aName[$iIndex][1] + 1
???摮硥?
D:\My Documents\??\test_DebugIt.au3 (110) : ==> ????????.:
$aName[$iIndex][1] = $aName[$iIndex][1] + 1
$aName[^ ERROR
我很郁闷看到这个消息,为什么读取第一个人名时
If @error Then
就跳到Else里去执行代码了呢?
发表于 2011-8-4 07:34:38 | 显示全部楼层
没出错lz打算让他执行判断中的哪部分代码呢?
发表于 2011-8-4 08:33:58 | 显示全部楼层
??????????????????
发表于 2011-8-4 10:09:44 | 显示全部楼层
#AutoIt3Wrapper_Run_Debug_Mode=Y

#include <Array.au3>
#Include <ExcelCOM_UDF.au3>


Local $sFilepath = "d:\rm.xls"
Local $oExcel = _ExcelBookOpen($sFilePath)
Local $aName[1][1]

If @error = 1 Then
    MsgBox(0, "错误!", "无法创建对象!")
    Exit
ElseIf @error = 2 Then
    MsgBox(0, "错误!", "文件不存在!")
    Exit
EndIf

$o_Dic=ObjCreate("scripting.dictionary")
With $oExcel.activesheet
        For $o_Rng In .range("c2",.cells(.rows.count,3).end(3))
                If $o_Dic.exists($o_Rng.value) Then
                        $o_Dic($o_Rng.value)=$o_Dic($o_Rng.value)+1
                Else
                        $o_Dic.add($o_Rng.value,1)
                EndIf
        Next $o_Rng
EndWith
ReDim $aName[$o_Dic.count][2]
$i=0
For $Key In $o_Dic.keys
        $aName[$i][0]=$Key
        $aName[$i][1]=$o_Dic($Key)
Next
_ArrayDisplay($aName)
没有excelcom的udf,不过楼主可以这样试一下。
发表于 2011-8-4 10:10:00 | 显示全部楼层
#AutoIt3Wrapper_Run_Debug_Mode=Y

#include <Array.au3>
#Include <ExcelCOM_UDF.au3>


Local $sFilepath = "d:\rm.xls"
Local $oExcel = _ExcelBookOpen($sFilePath)
Local $aName[1][1]

If @error = 1 Then
    MsgBox(0, "错误!", "无法创建对象!")
    Exit
ElseIf @error = 2 Then
    MsgBox(0, "错误!", "文件不存在!")
    Exit
EndIf

$o_Dic=ObjCreate("scripting.dictionary")
With $oExcel.activesheet
        For $o_Rng In .range("c2",.cells(.rows.count,3).end(3))
                If $o_Dic.exists($o_Rng.value) Then
                        $o_Dic($o_Rng.value)=$o_Dic($o_Rng.value)+1
                Else
                        $o_Dic.add($o_Rng.value,1)
                EndIf
        Next $o_Rng
EndWith
ReDim $aName[$o_Dic.count][2]
$i=0
For $Key In $o_Dic.keys
        $aName[$i][0]=$Key
        $aName[$i][1]=$o_Dic($Key)
Next
_ArrayDisplay($aName)
没有excelcom的udf,不过楼主可以这样试一下。
 楼主| 发表于 2011-8-4 22:36:52 | 显示全部楼层
回复 5# kevinch

显示的结果好像不对啊。
   With ......EndWith的内容我没看懂,大概就是判断有多少行,记录到 [$o_Dic.count]中吧?
然后重新定义$aName的数组大小,那么for.....next中的$key能读取人名吗?
 楼主| 发表于 2011-8-4 22:49:26 | 显示全部楼层
搞定了,错了好几个地方,数组大小没有重新定义,还有在if @error前面我加了一个MSGBOX,想看看$iIndex 的值,难怪会跳到ELSE里去。
For $i = 2 To $UseRange[3] ;有标题从第二行开始读
        $sName = _ExcelReadCell($oExcel, $i)
        Local $iIndex = _ArraySearch($aName, $sName)
        If @error Then ;没有匹配的人名
                $k = UBound($aName)
                ReDim $aName[$k + 1][2]
                $aName[$k][0] = $sName
                $aName[$k][1] = 1
        Else
                $aName[$iIndex][1] = $aName[$iIndex][1] + 1
        EndIf
Next
_ArrayDisplay($aName, "添加后的数据 _ArrayAdd()")
发表于 2011-8-5 07:00:31 | 显示全部楼层
没有那个udf,猜测名字是在第三列里的,如果不是就改一下对应的列号
 楼主| 发表于 2011-8-5 22:48:04 | 显示全部楼层
回复 8# kevinch
For $o_Rng In .range("c2",.cells(.rows.count,3).end(3))
我的人名是从A2开始的,是改这里的C2为A2吗?
顺便传个ExcelCOM_UDF.au3 ,这是在论坛里找到的

本帖子中包含更多资源

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

×
发表于 2011-8-6 07:00:34 | 显示全部楼层
For $o_Rng In .range("a2",.cells(.rows.count,1).end(3))
改成这样,我倒不是需要udf,只不过没有udf我不清楚一些你代码中一些利用Udf的参数的含义。
 楼主| 发表于 2011-8-7 10:16:55 | 显示全部楼层
回复 10# kevinch


    还是有点问题,每次编译的时候总报错
d:\My Documents\桌面\读人名.au3(27,7) : 错误: 表达式错误
        Next $o_Rng
        ~~~~~^
d:\My Documents\桌面\读人名.au3(35,22) : 错误: 表达式错误
_ArrayDisplay($aName)
~~~~~~~~~~~~~~~~~~~~~^
我之前把$o_Rng注释掉了,但那个结果是错的。
发表于 2011-8-7 16:45:08 | 显示全部楼层
        Next $o_Rng
应该是
Next
vba写习惯了,到au3里竟然也这样写了。
 楼主| 发表于 2011-8-7 17:28:05 | 显示全部楼层
回复 12# kevinch


    可这个结果是错的。
发表于 2011-8-7 21:14:37 | 显示全部楼层
楼主,啥附件也没有,就一段代码,没办法测试,我哪知道你怎么是正确的啊,都是用猜的
 楼主| 发表于 2011-8-7 21:26:59 | 显示全部楼层
本帖最后由 xwt620 于 2011-8-7 21:29 编辑

回复 14# kevinch


    我晕, 我就把c2改为a2,然后把$o_Rng注释了,可结果不对
#include <Array.au3>
#include <Excel.au3>


Local $sFilepath = "d:\rm.xls"
Local $oExcel = _ExcelBookOpen($sFilepath)
Local $aName[1][1]

If @error = 1 Then
        MsgBox(0, "错误!", "无法创建对象!")
        Exit
ElseIf @error = 2 Then
        MsgBox(0, "错误!", "文件不存在!")
        Exit
EndIf

$o_Dic = ObjCreate("scripting.dictionary")
With $oExcel.activesheet
        For $o_Rng In .range("a2", .cells(.rows.count, 3).end(3))
                If $o_Dic.exists($o_Rng.value) Then
                        $o_Dic($o_Rng.value) = $o_Dic($o_Rng.value) + 1
                Else
                        $o_Dic.add($o_Rng.value, 1)
                EndIf
        Next ;$o_Rng
EndWith
ReDim $aName[$o_Dic.count][2]
$i = 0
For $Key In $o_Dic.keys
        $aName[$i][0] = $Key
        $aName[$i][1] = $o_Dic($Key)
Next
_ArrayDisplay($aName,'')
新建一个rm.xls,从a2开始随便输几个人名,输几个重复的,测试结果只能显示第一个人名

本帖子中包含更多资源

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

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-29 18:50 , Processed in 0.082905 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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