在EXCEL中对某列数值自动排名次的实现方法
【打印文章】
江西省宁都县电信局 赖志强
---- 一.问题的提出
---- 在各单位的生产经营活动中,常常会组织一些竞赛评比活动。为了掌握活动的进展情况,定期发通报排名次是竞赛活动的组织者经常采用的一种方法。排名次的具体要求为:
---- 1.各竞赛单位在表中的位置是固定不变的.
---- 2.另外,增加一列数据,根据各单位完成任务的情况,动态显示各单位的名次。
---- EXECL 97是一款强大的电子表格处理软件。笔者在利用其提供的【数据/排序】命令进行排序时,其结果却不能满足上述两点使用要求。即既破坏了位置的不变性,也不能显示名次数值。实为EXCEL 97美中之不足。于是,也常见有人利用人工排出名次,再添上数值的,效率实在太低。
---- 那么,有没有一种方法能自动地、动态地完成上述排名次操作呢?笔者经过研究,终于找到了解决的方法。
---- 二.实现方法
---- 排名次就其实质而言,是一种排序算法。笔者使用VISUAL BASIC语言编制了一段宏过程qksort(),在标准冒泡排序算法的基础上,实现了排名次算法。源程序如下:
注释:**********************************************
注释:宏名:qksort()
注释:功能:本宏的作用为对选定区域的数值按降序排名次。
注释:使用:用鼠标选择一列需排名次的数值,执行【工具/宏/宏/执行】
注释:命令运行本宏,则该列的右一列数值即显注释:示该列名次结果
注释:本宏命令的录入:执行【工具/宏/宏/创建】命令既可。
注释:*********************************************
Option Base 0
Sub qksort()
Dim rnum As Integer 注释:rnum定义需排名的数的个数
rnum = Selection.Rows.Count
ReDim a(rnum) As Integer, b(rnum)
As Long, c(rnum) As Integer
注释:a(rnum)保存数的下标位序,b(rnum)保存需排名次的数值项
For i = 0 To rnum - 1
a(i) = i + 1
b(i) = Selection.Rows.Cells(i + 1)
c(i) = i + 1
Next i 注释:b(i)中为要排序的数值,a(i)中为下标位序
For k = rnum - 1 To 0 Step -1
kmax = 0
For j = 1 To k
If b(kmax) > b(j) Then
temp = b(kmax)
b(kmax) = b(j)
b(j) = temp
temp = a(kmax)
a(kmax) = a(j)
a(j) = temp
End If
kmax = j
Next j
Next k 注释:利用冒泡排序法将数值(b())及其下标位置(a())进行排序
i = 1
c(a(rnum - 1) - 1) = i
For k = 1 To rnum - 1
If b(rnum - 1 - k) < > b(rnum - k) Then
i = i + 1
c(a(rnum - 1 - k) - 1) = i
Else
c(a(rnum - 1 - k) - 1) = i
End If
Next k 注释:排出名次,并将名次放入c()数组中
For k = 0 To rnum - 1
Selection.Rows.Cells(k + 1, 2) = c(k)
Next k 注释:将c()数组中的名次依次写入选择区域的右列,完成排名
End Sub
---- 一.问题的提出
---- 在各单位的生产经营活动中,常常会组织一些竞赛评比活动。为了掌握活动的进展情况,定期发通报排名次是竞赛活动的组织者经常采用的一种方法。排名次的具体要求为:
---- 1.各竞赛单位在表中的位置是固定不变的.
---- 2.另外,增加一列数据,根据各单位完成任务的情况,动态显示各单位的名次。
---- EXECL 97是一款强大的电子表格处理软件。笔者在利用其提供的【数据/排序】命令进行排序时,其结果却不能满足上述两点使用要求。即既破坏了位置的不变性,也不能显示名次数值。实为EXCEL 97美中之不足。于是,也常见有人利用人工排出名次,再添上数值的,效率实在太低。
---- 那么,有没有一种方法能自动地、动态地完成上述排名次操作呢?笔者经过研究,终于找到了解决的方法。
---- 二.实现方法
---- 排名次就其实质而言,是一种排序算法。笔者使用VISUAL BASIC语言编制了一段宏过程qksort(),在标准冒泡排序算法的基础上,实现了排名次算法。源程序如下:
注释:**********************************************
注释:宏名:qksort()
注释:功能:本宏的作用为对选定区域的数值按降序排名次。
注释:使用:用鼠标选择一列需排名次的数值,执行【工具/宏/宏/执行】
注释:命令运行本宏,则该列的右一列数值即显注释:示该列名次结果
注释:本宏命令的录入:执行【工具/宏/宏/创建】命令既可。
注释:*********************************************
Option Base 0
Sub qksort()
Dim rnum As Integer 注释:rnum定义需排名的数的个数
rnum = Selection.Rows.Count
ReDim a(rnum) As Integer, b(rnum)
As Long, c(rnum) As Integer
注释:a(rnum)保存数的下标位序,b(rnum)保存需排名次的数值项
For i = 0 To rnum - 1
a(i) = i + 1
b(i) = Selection.Rows.Cells(i + 1)
c(i) = i + 1
Next i 注释:b(i)中为要排序的数值,a(i)中为下标位序
For k = rnum - 1 To 0 Step -1
kmax = 0
For j = 1 To k
If b(kmax) > b(j) Then
temp = b(kmax)
b(kmax) = b(j)
b(j) = temp
temp = a(kmax)
a(kmax) = a(j)
a(j) = temp
End If
kmax = j
Next j
Next k 注释:利用冒泡排序法将数值(b())及其下标位置(a())进行排序
i = 1
c(a(rnum - 1) - 1) = i
For k = 1 To rnum - 1
If b(rnum - 1 - k) < > b(rnum - k) Then
i = i + 1
c(a(rnum - 1 - k) - 1) = i
Else
c(a(rnum - 1 - k) - 1) = i
End If
Next k 注释:排出名次,并将名次放入c()数组中
For k = 0 To rnum - 1
Selection.Rows.Cells(k + 1, 2) = c(k)
Next k 注释:将c()数组中的名次依次写入选择区域的右列,完成排名
End Sub
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )
【编程爱好者论坛】