xwt620 发表于 2011-8-4 01:13:25

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

本帖最后由 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

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 ;有标题从第二行开始读
        $sName = _ExcelReadCell($oExcel,$i)
        Local $iIndex = _ArraySearch($aName, $sName)
        If @error Then ;没有匹配的人名
                $k = UBound($aName)
                $aName[$k] = $sName
                $aName[$k] = 1
                _ArrayDisplay($aName, "添加后的数据 _ArrayAdd()")
        Else
                $aName[$iIndex] = $aName[$iIndex] + 1
        EndIf
Next0026: 0-0:         If @error Then ;没有匹配的人名
0034: 0-0:                 $aName[$iIndex] = $aName[$iIndex] + 1
???摮硥?
D:\My Documents\??\test_DebugIt.au3 (110) : ==> ????????.:
$aName[$iIndex] = $aName[$iIndex] + 1
$aName[^ ERROR
我很郁闷看到这个消息,为什么读取第一个人名时
If @error Then
就跳到Else里去执行代码了呢?

netegg 发表于 2011-8-4 07:34:38

没出错lz打算让他执行判断中的哪部分代码呢?

inter702 发表于 2011-8-4 08:33:58

??????????????????

kevinch 发表于 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

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]
$i=0
For $Key In $o_Dic.keys
        $aName[$i]=$Key
        $aName[$i]=$o_Dic($Key)
Next
_ArrayDisplay($aName)没有excelcom的udf,不过楼主可以这样试一下。

kevinch 发表于 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

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]
$i=0
For $Key In $o_Dic.keys
        $aName[$i]=$Key
        $aName[$i]=$o_Dic($Key)
Next
_ArrayDisplay($aName)没有excelcom的udf,不过楼主可以这样试一下。

xwt620 发表于 2011-8-4 22:36:52

回复 5# kevinch

显示的结果好像不对啊。
   With ......EndWith的内容我没看懂,大概就是判断有多少行,记录到 [$o_Dic.count]中吧?
然后重新定义$aName的数组大小,那么for.....next中的$key能读取人名吗?

xwt620 发表于 2011-8-4 22:49:26

搞定了,错了好几个地方,数组大小没有重新定义,还有在if @error前面我加了一个MSGBOX,想看看$iIndex 的值,难怪会跳到ELSE里去。
For $i = 2 To $UseRange ;有标题从第二行开始读
        $sName = _ExcelReadCell($oExcel, $i)
        Local $iIndex = _ArraySearch($aName, $sName)
        If @error Then ;没有匹配的人名
                $k = UBound($aName)
                ReDim $aName[$k + 1]
                $aName[$k] = $sName
                $aName[$k] = 1
        Else
                $aName[$iIndex] = $aName[$iIndex] + 1
        EndIf
Next
_ArrayDisplay($aName, "添加后的数据 _ArrayAdd()")

kevinch 发表于 2011-8-5 07:00:31

没有那个udf,猜测名字是在第三列里的,如果不是就改一下对应的列号

xwt620 发表于 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 ,这是在论坛里找到的

kevinch 发表于 2011-8-6 07:00:34

For $o_Rng In .range("a2",.cells(.rows.count,1).end(3))改成这样,我倒不是需要udf,只不过没有udf我不清楚一些你代码中一些利用Udf的参数的含义。

xwt620 发表于 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注释掉了,但那个结果是错的。

kevinch 发表于 2011-8-7 16:45:08

      Next $o_Rng应该是Nextvba写习惯了,到au3里竟然也这样写了。

xwt620 发表于 2011-8-7 17:28:05

回复 12# kevinch


    可这个结果是错的。{:face (229):}

kevinch 发表于 2011-8-7 21:14:37

楼主,啥附件也没有,就一段代码,没办法测试,我哪知道你怎么是正确的啊,都是用猜的{:face (396):}

xwt620 发表于 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

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]
$i = 0
For $Key In $o_Dic.keys
        $aName[$i] = $Key
        $aName[$i] = $o_Dic($Key)
Next
_ArrayDisplay($aName,'')
新建一个rm.xls,从a2开始随便输几个人名,输几个重复的,测试结果只能显示第一个人名
页: [1] 2
查看完整版本: 读取EXCEL中的人名,统计重复人名的数量,记录在二维数组里【已解决】