在EXCEL中對某列數值自動排名次的實現方法

發表于:2007-07-14來源:作者:點擊數: 標簽:
江西省寧都縣 電信 局 賴志強 ---- 一.問題的提出 ---- 在各單位的生產經營活動中,常常會組織一些競賽評比活動。為了掌握活動的進展情況,定期發通報排名次是競賽活動的組織者經常采用的一種方法。排名次的具體要求為: ---- 1.各競賽單位在表中的位置是固
江西省寧都縣電信局 賴志強

---- 一.問題的提出

---- 在各單位的生產經營活動中,常常會組織一些競賽評比活動。為了掌握活動的進展情況,定期發通報排名次是競賽活動的組織者經常采用的一種方法。排名次的具體要求為:

---- 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

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97