Board logo

標題: [發問] [求助]欄位比較並計數的方法 [打印本頁]

作者: a703130    時間: 2011-3-23 16:25     標題: [求助]欄位比較並計數的方法

請問各位大老,有爬過相關文章,都無法獲得我想要的解答(小學生還無法下載檔案),所以在這邊有幾個問題想請教:
1.如在此sheet1上,如下列所示,我要如何用程式知道(B欄位第2列)開始有資料,且共有9列資料??
2.如果想要得知B欄位上每筆資料重複的共有幾筆並顯示在C欄位上,如下列所示,該如何做??

請各位大老不吝告知,謝謝

         A         B           C
   2          0x0001       4
   3          0x0001
   4          0x0001
   5          0x0001
   6          0x0002       3
   7          0x0002
   8          0x0002
   9          0x0003       1
作者: Hsieh    時間: 2011-3-23 18:07

回復 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
複製代碼

作者: a703130    時間: 2011-3-23 20:17

回復 2# Hsieh


謝謝大老幫忙,不過仍有些問題,希望能幫忙回答

Set B = Columns("B").Find("*") -- 是設定B欄一個範圍沒有指定長度的意思嗎??

If Not B Is Nothing Then R = B.Row Else Exit Sub  -- 意思是B欄如果有東西則R=B欄的列數嗎??

If d.Exists(Cells(R, 2).Value) = False -- 這段的意思是指??

謝謝大老不吝賜教~!
作者: Hsieh    時間: 2011-3-23 21:57

回復 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欄的值
作者: hugh0620    時間: 2011-3-24 09:09

本帖最後由 hugh0620 於 2011-3-24 09:11 編輯

不一定要用程式唷~
其實用函數也是可以解決唷~ 提供一個函數的處理方式~ 僅供參考
=IF(B1=B2,"",COUNTIF($B$2 : $B$65536,B2))

只是當資料多於你的函數列時~ 要自己再將函數往下拉~
作者: a703130    時間: 2011-3-24 16:48

不好意思一直發問,VBA的函數還真博大精深...

Set B = Columns("B").Find("*")
B欄找到有資料的第一個位置指定給變數B


請問 ("*") 是代表有資料的第一個位置嗎??
未來如果要搜尋特定的字串或是文字的的一個位置也可以如法炮製嗎??
作者: Hsieh    時間: 2011-3-24 17:28

回復 6# a703130


    FIND用法請詳見VBA說明
作者: FAlonso    時間: 2011-3-24 20:01

本帖最後由 FAlonso 於 2011-3-24 20:29 編輯
  1. Sub my()
  2. Dim mydic As Object, mycell As Range, i As Integer, j As Integer, ar()
  3. Set mydic = CreateObject("scripting.dictionary")
  4. For Each mycell In Range([b1], [b65536].End(xlUp))
  5. If mydic.exists(mycell.Value) Then
  6. mydic(mycell.Value) = mydic(mycell.Value) + 1
  7. Else
  8. mydic(mycell.Value) = 1
  9. j = mycell.Row
  10. i = i + 1
  11. ReDim Preserve ar(i)
  12. ar(i) = j
  13. End If
  14. Next
  15. For i = 1 To UBound(ar)
  16. Cells(ar(i), 3).Value = mydic(Cells(ar(i), 2).Value)
  17. Next
  18. Set mydic = Nothing
  19. End Sub
複製代碼
程式寫到一團糟,勉強完成
作者: a703130    時間: 2011-3-25 15:17

回復 2# Hsieh


If d.Exists(Cells(R, 2).Value) = False Then

Cells(R, 3) = Application.CountIf(Columns("B"), Cells(R, 2))

d(Cells(R, 2).Value) = Cells(R, 2).Value

sorry 大佬~這段程式應該是判斷是否有重複的欄位並且計數

各行程式的主要意思是否能大概說明一下??

網路是可以找,不過大佬願意幫忙,上手會更快一點^^"

一直請教不好意思~
作者: Hsieh    時間: 2011-3-25 15:38

本帖最後由 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
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)