- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-5-5
|
5#
發表於 2022-11-3 16:29
| 只看該作者
回復 3# quickfixer
謝謝前輩
以下研習心得註解如下!請前輩再指導!
Option Explicit
Sub test_quickfixer()
Dim Find_Num, reg As Object, brr, crr, i&, j&, runtime As Double
'↑宣告變數
runtime = Timer
Application.ScreenUpdating = False
brr = Range([操作表!B2], [操作表!B65536].End(3))
'↑令 brr是陣列!倒入 操作表B欄的資料格值
Set reg = CreateObject("VBScript.RegExp")
'↑令 reg是正則
reg.Pattern = "\d+"
'↑令Pattern是數字串
reg.Global = True
'↑暫時不懂做什麼用的!先學著用!
ReDim crr(1 To UBound(brr), 0)
'↑宣告crr陣列範圍!縱向是1 到brr陣列縱向列數,橫向是 1欄
'今天才知道二維空陣列單獨 1欄可以 0表示!以前只知道 1 TO 1,
', 0)表示陣列 0 TO 0 欄,因為唯一,所以可以以 0 陳述!UBound(crr, 2)=0
', 1)表示陣列 0 TO 1 欄!共兩欄! ,
', 1 TO 1)是表示不用第 0欄
'但是 brr = Range([操作表!B2], [操作表!B65536].End(3)) 是
'從brr(1,1)開始擺放!不是從brr(0,0)開始擺放!今天好像更清楚些!謝謝!
For i = 1 To UBound(brr)
'↑設外順迴圈從 1到brr陣列縱向列位數
Set Find_Num = reg.Execute(brr(i, 1))
'↑令 Find_Num是執行 brr陣列迴圈元素執行正則的結果
If Find_Num.Count > 0 Then
'↑如果 正則的結果數量是>0 !
For j = 0 To Find_Num.Count - 1
'↑設內順迴圈從 0到 正則的結果數量減 1
'減1的原因是 正則的結果是從序號 0開始排佈
crr(i, 0) = crr(i, 0) + Val(Find_Num(j))
'↑crr陣列放入字串正則取得的數字字串轉化為數值,
'在內迴圈中累加
Next j
End If
Next i
Range("d2").Resize(UBound(brr) + 10, 2) = crr
'↑從[d2]擴展(brr陣列最大縱向列位數_列,1_欄)範圍儲存格,
'令上述範圍儲存格 等於crr陣列!
'也就是要從crr陣列的最左上角資料對等[d2]位置帶入crr陣列值
'假設Resize()的範圍比crr陣列範圍小! 只取crr陣列的局部範圍
'假設Resize()的範圍比crr陣列範圍大! Resize()超出的局部範圍,
'橫向超出:會再重複陣列左上角資料開始帶入!
'縱向超出:會貼入 "#N/A" 字串
'這部分知識今天好像更清楚些!謝謝!
Application.ScreenUpdating = True
Debug.Print Timer - runtime
'↑後學都用Msgbox! 這即時運算視窗顯示不知道有什麼特別好處?
'今天知道迴圈裡的Msgbox要按很多次,沒效率!Debug.Print 直接顯示
'謝謝前輩
Set reg = Nothing
End Sub |
|