- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-5-5
|
5#
發表於 2022-11-4 10:19
| 只看該作者
本帖最後由 Andy2483 於 2022-11-4 10:24 編輯
回復 4# samwang
謝謝前輩指導
超短的時間!厲害!
以下是執行結果與心得註解,請前輩再指導!
後學對解決問題的啟始都無頭緒!亂試! 仿錯方法! 又模仿的四不像!
導致效率不彰! 自己的註解也錯註!
謝謝指導
第一列未清除時:
最後結果:
Option Explicit
Sub test_samwang()
Dim Arr, Brr(1 To 10000, 1 To 100), xD, R&, C%, Sh
Dim xR As Range, x%, y$, x1%, j%, crl, T
'↑宣告變數!多個變數是短整數!沒用長整數!不知效率是否有差?再研究!
T = Timer
Set xD = CreateObject("Scripting.Dictionary")
'↑令xD是字典
Set Sh = Sheets("操作表")
'↑令Sh 是 操作表
R = Sh.UsedRange.EntireRow.Rows.Count
'↑令R 是有使用的列數
C = Sh.UsedRange.EntireColumn.Columns.Count
'↑令C 是有使用的欄數
Set Arr = Range(Sh.[a1], Sh.Cells(R, C))
'↑令Arr是儲存格集!範圍是最大的已使用格範圍
For Each xR In Arr
'↑設順迴圈!令xR 是Arr儲存格集的一員
If IsNumeric(xR.Value) = False Or xR.Value = "" Then GoTo 888
'↑如果 陣列值不是數字 或 陣列值是空字元! 就跳到 888位置繼續執行
crl = xR.Interior.Color
'↑另crl 是底色顏色號
y = 2
'↑令y 每次的迴圈初始值都是 2!這是Brr陣列裡的結果列數(以下稱_Brr結果列)
'因為這是要從第3列開始放明細值!所以初始值是2讓後程序加 1=3!
'此值倒入字典 xD(crl)後再繼續累加 1
If xD.Exists(crl) Then
'↑如果以 xR底色顏色號為KEY查察 xD字典是有此鍵!
y = xD(crl)
'↑條件成立!就令y 是字典裡對應key為 (xR底色顏色號)的item值
x1 = xD(crl & "_C")
'↑條件成立!就令x1 是字典裡對應key為 (xR底色顏色號& "_C")的item值
'x1是在Brr陣列裡的結果欄數(以下稱_Brr結果欄)的意思
Brr(2, x1) = Brr(2, x1) + xR.Value
'↑條件成立!就讓Brr陣列裡(第2列/Brr結果欄)對應的位置值與 Arr儲存格_xR值累加
Brr(y + 1, x1) = xR.Value
'↑條件成立!就讓Brr陣列裡(第y變數+1列/Brr結果欄)對應的位置等於 Arr儲存格_xR值
xD(crl) = y + 1
'↑條件成立!Brr結果列累加 1
Else
'↑如果條件不成立! 迴圈的一開始條件不會成立! 第一次遇到不同底色 條件也不會成立!
x = x + 1
'↑x是短整數!初始值是0! 累加 1!這是 底色顏色號的種類數!
'遇到字典裡沒有的 底色顏色號種類時!就要加 1
Brr(1, x) = crl
'↑Brr陣列(第一列/Brr結果欄1)值等於 底色顏色號
Brr(2, x) = xR.Value
'↑Brr陣列(第二列/Brr結果欄1)值等於 Arr儲存格_xR值(第一個數字加總值)
y = y + 1
'↑y的宣告是字串!數字字串是可以做數學運算的!超高興!學到了!
'y的第一值是 "2" + 1 後是 "3"
Brr(y, x) = xR.Value
'↑Brr陣列(第三列/Brr結果欄1)值等於 Arr儲存格_xR值(第一個明細值)
xD(crl) = y
'↑把底色顏色號為key,倒入字典中,item是 3
xD(crl & "_C") = x
'↑把(底色顏色號 & "_C")字串 為key,倒入字典中,item是 前方的底色顏色號的種類數1
End If
888: Next
Workbooks.Add
[a1] = "顏色→": [A2] = "數字加總→": [A3] = "↓以下是明細"
[B1].Resize(1000, x) = Brr
'↑從工作表[B1]開始貼入Brr陣列資料
For j = 1 To x
'↑設順迴圈!從1 到 底色顏色號的種類最後累加數
Cells(1, j + 1).Interior.Color = Brr(1, j)
'↑把第一列的底色用內容裡的底色號上色
Next
Range(Cells(1, 2), Cells(1, x + 1)) = ""
'↑把第一列的底色號清除
Cells.Columns.AutoFit
'↑全部欄位自動調整欄寬
Cells.Borders.LineStyle = 1
'↑全部儲存格格線為細實線
MsgBox Timer - T & " 秒"
End Sub
看得懂是應該的!會用又是另一回事!勤練就對了! |
|