返回列表 上一主題 發帖

[發問] [求助]欄位比較並計數的方法

回復 1# a703130
  1. Sub nn()
  2. Dim B As Range
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set B = Columns("B").Find("*")
  5. If Not B Is Nothing Then r = B.Row Else Exit Sub
  6. Do Until Cells(r, 2) = ""
  7. If d.exists(Cells(r, 2).Value) = False Then
  8. Cells(r, 3) = Application.CountIf(Columns("B"), Cells(r, 2))
  9. d(Cells(r, 2).Value) = Cells(r, 2).Value
  10. Else
  11. Cells(r, 3) = ""
  12. End If
  13. r = r + 1
  14. Loop
複製代碼
學海無涯_不恥下問

TOP

回復 3# a703130

Set B = Columns("B").Find("*") -- 是設定B欄一個範圍沒有指定長度的意思嗎??
B欄找到有資料的第一個位置指定給變數B

If Not B Is Nothing Then R = B.Row Else Exit Sub  -- 意思是B欄如果有東西則R=B欄的列數嗎??
假如B欄有資料存在就將變數R指定為B欄找到有資料的第一個位置的列號否則結束程式

If d.Exists(Cells(R, 2).Value) = False -- 這段的意思是指??
如果在字典物件d裡面比對不到B欄的值
學海無涯_不恥下問

TOP

回復 6# a703130


    FIND用法請詳見VBA說明
學海無涯_不恥下問

TOP

本帖最後由 Hsieh 於 2011-3-26 13:31 編輯

回復 9# a703130


    If d.Exists(Cells(R, 2).Value) = False Then
之所以使用字典來檢查是否該索引已經存在,是因為你的計數位置是在該所引的第一個位置顯示
從第2個位置以後就不再顯示結果,故必須判斷索引是否存在
Cells(R, 3) = Application.CountIf(Columns("B"), Cells(R, 2))
將計數的值填入C欄
d(Cells(R, 2).Value) = Cells(R, 2).Value
將索引值存到字典物件中,注意一點,若索引值對應的內容是d(Cells(R, 2).Value) =""時,Exists方法會得到FALSE
也就是認為該所引值不存在於字典物件
如果這樣無法理解,試試下面程式碼
由下往上來做迴圈
  1. Sub nn()
  2. r = [B65536].End(xlUp).Row 'B欄有資料的最大列位
  3. Do Until Cells(r, 2) = "" '直到B欄沒有內容結束迴圈
  4.    Set a = Cells(r, 2) '設定變數a為欄位的儲存格
  5.    Set b = Range([B1], a.Offset(-1, 0)).Find(a) '在B1到的上一個儲存格中尋找a
  6.    '如果找不到就將計數寫入C欄,否則C欄位置就清空
  7.    If b Is Nothing Then a.Offset(, 1) = Application.CountIf(Columns("B"), a) Else a.Offset(, 1) = ""
  8.    r = r - 1 '列位減1
  9. Loop
  10. End Sub
複製代碼
學海無涯_不恥下問

TOP

        靜思自在 : 一個人的快樂.不是因為他擁有得多,而是因為他計較得少。
返回列表 上一主題