读取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里去执行代码了呢? 没出错lz打算让他执行判断中的哪部分代码呢? ?????????????????? #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,不过楼主可以这样试一下。 #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,不过楼主可以这样试一下。 回复 5# kevinch
显示的结果好像不对啊。
With ......EndWith的内容我没看懂,大概就是判断有多少行,记录到 [$o_Dic.count]中吧?
然后重新定义$aName的数组大小,那么for.....next中的$key能读取人名吗? 搞定了,错了好几个地方,数组大小没有重新定义,还有在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()")
没有那个udf,猜测名字是在第三列里的,如果不是就改一下对应的列号 回复 8# kevinch For $o_Rng In .range("c2",.cells(.rows.count,3).end(3))
我的人名是从A2开始的,是改这里的C2为A2吗?
顺便传个ExcelCOM_UDF.au3 ,这是在论坛里找到的
For $o_Rng In .range("a2",.cells(.rows.count,1).end(3))改成这样,我倒不是需要udf,只不过没有udf我不清楚一些你代码中一些利用Udf的参数的含义。 回复 10# kevinch
还是有点问题,每次编译的时候总报错
d:\My Documents\桌面\读人名.au3(27,7) : 错误: 表达式错误
Next $o_Rng
~~~~~^
d:\My Documents\桌面\读人名.au3(35,22) : 错误: 表达式错误
_ArrayDisplay($aName)
~~~~~~~~~~~~~~~~~~~~~^
我之前把$o_Rng注释掉了,但那个结果是错的。 Next $o_Rng应该是Nextvba写习惯了,到au3里竟然也这样写了。 回复 12# kevinch
可这个结果是错的。{:face (229):} 楼主,啥附件也没有,就一段代码,没办法测试,我哪知道你怎么是正确的啊,都是用猜的{:face (396):} 本帖最后由 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