返回列表 上一主題 發帖

[發問] 請教要如何使用 VBA 判別不規則儲存格的辦法2

回復 1# c_c_lai
寫得挺亂的,包涵哈~
d1字典 : Address , 面積
d2字典 : 面積 , 個數
依需求再自己改改吧
  1. Sub test()
  2.   Dim d1, d2, bCombine As Boolean, lCol As Long
  3.   Dim stripe As Range, stripeOffset As Range, rngTarget As Range
  4.   
  5.   Set d1 = CreateObject("scripting.dictionary")
  6.   With Sheets(1).[A1].CurrentRegion
  7.     .Replace What:="0", Replacement:=""
  8.     For lCol = 1 To .Columns.Count
  9.       If Application.CountA(.Columns(lCol).Cells) < .Columns(lCol).Cells.Count Then
  10.         For Each stripe In .Columns(lCol).SpecialCells(xlCellTypeBlanks).Areas
  11.           If stripe.Column = 1 Then
  12.             Set stripeOffset = stripe
  13.           Else
  14.             Set stripeOffset = .Parent.Range(stripe.Address).Offset(0, -1)
  15.           End If
  16.           bCombine = False
  17.           For Each prev In d1.keys
  18.             If Not Application.Intersect(.Parent.Range(prev), stripeOffset) Is Nothing Then
  19.               If d1.exists(stripe.Address) Then d1.Remove (stripe.Address)
  20.               Set stripe = Union(.Parent.Range(prev), stripe)
  21.               d1.Remove prev
  22.               d1(stripe.Address) = stripe.Count
  23.               Set stripeOffset = Union(stripeOffset, .Parent.Range(prev))
  24.               bCombine = True
  25.             End If
  26.           Next prev
  27.           If Not bCombine Then d1(stripe.Address) = stripe.Count
  28.         Next stripe
  29.       End If
  30.     Next lCol
  31.     .Replace What:="", Replacement:="0"
  32.   End With
  33.   
  34.   Set d2 = CreateObject("scripting.dictionary")
  35.   For Each x In d1.items
  36.     If d2.exists(x) Then
  37.       d2(x) = d2(x) + 1
  38.     Else
  39.       d2(x) = 1
  40.     End If
  41.   Next
  42.   For Each x In d2.keys
  43.     Debug.Print "面積 " & x & " : " & d2(x) & "個"
  44.   Next
  45. End Sub
複製代碼

TOP

回復 6# c_c_lai
跑的範圍大概多大呢(幾乘幾) ? 有檔案嗎?
我知道我的方法效率很差的,
因為我的作法是分columns,每個columns再分為數個帶狀連續的0,
然後才依這帶狀0 去判斷結合起來,
因為我也沒想到有甚麼好方法

TOP

回復 8# c_c_lai
我的能跑 ,結果如下
面積 1 : 140個
面積 2 : 178個
面積 3 : 53個
面積 6 : 36個
面積 5 : 39個
面積 10 : 27個
面積 18 : 8個
面積 11 : 13個
面積 15 : 9個
面積 21 : 7個
面積 45 : 2個
面積 13 : 15個
面積 8 : 30個
面積 51 : 3個
面積 23 : 4個
面積 32 : 11個
面積 54 : 5個
面積 31 : 4個
面積 33 : 2個
面積 22 : 14個
面積 86 : 2個
面積 4 : 56個
面積 24 : 13個
面積 12 : 15個
面積 17 : 8個
面積 7 : 38個
面積 49 : 6個
面積 93 : 1個
面積 35 : 1個
面積 122 : 1個
面積 19 : 12個
面積 50 : 1個
面積 109 : 1個
面積 9 : 25個
面積 46 : 3個
面積 60 : 2個
面積 37 : 2個
面積 28 : 9個
面積 40 : 4個
面積 26 : 3個
面積 41 : 4個
面積 14 : 9個
面積 16 : 13個
面積 30 : 3個
面積 87 : 1個
面積 48 : 2個
面積 29 : 4個
面積 72 : 4個
面積 20 : 10個
面積 77 : 1個
面積 84 : 1個
面積 128 : 1個
面積 61 : 2個
面積 39 : 2個
面積 78 : 1個
面積 59 : 1個
面積 81 : 1個
面積 56 : 2個
面積 102 : 2個
面積 36 : 1個
面積 25 : 6個
面積 34 : 4個
面積 38 : 3個
面積 100 : 3個
面積 91 : 1個
面積 75 : 1個
面積 42 : 1個
面積 89 : 1個
面積 85 : 1個
面積 27 : 1個
面積 96 : 1個
面積 108 : 1個
面積 66 : 1個
面積 82 : 1個
面積 53 : 2個
面積 63 : 1個
面積 55 : 1個
面積 119 : 1個
面積 381 : 1個

TOP

回復 9# c_c_lai
.Parent 是指到 前面 With Sheets(1).[A1].CurrentRegion 的 parent 也就是 sheets(1)
直接用 Range(prev) ,應該相當於ActiveSheet.Range(prev),照道理是沒啥影響。

TOP

本帖最後由 stillfish00 於 2013-12-7 16:05 編輯

回復 22# ML089
Nice Job,提取到Array加速很多,
我也發現我的方法邏輯上有問題,
另外,Time原本就只有到秒而已,時間亂跳是因為你把 inputbox 的時間也算了。

TOP

        靜思自在 : 道德是提昇自我的明燈,不該是呵斥別人的鞭子。
返回列表 上一主題