我需要將多個宏組合成一個按鈕單擊執行的宏。請原諒我,如果我寫錯了什麼,因爲我對excel宏和vb是全新的。如何將多個宏和excel函數結合成一個按鈕單擊執行的宏?
以下是方案。
步驟:
- 計算總
- 提取參考
- 匹配參考比較總字段值和標記爲「完成」如果匹配的參考總的總和計算出)。
(解釋...) 首先,我計算出借方和貸方金額稱爲總新列,對於這一點,首先我用SUM函數。之後,我使用按鈕執行宏單擊嘗試同樣
(舊宏)
Private Sub getTotal_Click()
With ActiveSheet
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
For i = 5 To lastRow
Range("K" & i).Value = Range("F" & i).Value + Range("G" & i).Value
Next i
End Sub
這是這麼多耗時(花了約2小時的時候在75K記錄執行)比使用公式時(在幾分鐘內完成)。我仍然無法理解這個原因。無論如何修改Dy.Lee的答案,只需花費幾秒來計算總數。
(改性基於Dy.Lee的回答)
Private Sub getTotal_Click()
Dim vDB As Variant, vR() As Variant
Dim i As Long, n As Long, lastRow As Long
With ActiveSheet
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
vDB = .Range("R5", "S" & lastRow)
n = UBound(vDB, 1)
ReDim vR(1 To n, 1 To 1)
For i = 1 To n
vR(i, 1) = vDB(i, 1) + vDB(i, 2)
Next i
.Range("AL5").Resize(n) = vR
End With
End Sub
立即移動到其餘用於在列d來提取字符串的圖案第二宏和E.
Function extractReference(cid_No As String, pm_source As String)
Dim regExp As Object, findMatches As Object, match As Object
Dim init_result As String: init_result = ""
Set regExp = CreateObject("vbscript.regexp")
With regExp
.Global = True
.MultiLine = False
.Pattern = "(?:^|\D)(\d{5,6})(?!\d)"
End With
Set findMatches = regExp.Execute(pm_source)
For Each match In findMatches
init_result = init_result + match.SubMatches.Item(0)
Next
If init_result <> "" Then
extractReference = cid_No & " | " & init_result
Else
extractReference = ""
End If
End Function
這個宏工作正常。
最後,我使用了以下函數,該函數
=IF(ISBLANK([@Reference]), "", (IF((ROUND(SUMIFS([Total],[Reference],[@Reference]),2)=0), "complete", "")))
這兩個複製所提取的參考和總到一個新的工作表和創建數據表後也工作得很好。
現在我真正想要的是我需要避免創建任何新的數據表或工作表,並在單擊按鈕上單擊當前表單中的所有內容。無論如何可以做到這一點,而不會使宏成爲一個耗時的過程?非常感謝您的幫助!
由於提前
變體陣列的解釋是[此](https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros/10717999#10717999) –