2017-07-25 176 views
1

我需要將多個宏組合成一個按鈕單擊執行的宏。請原諒我,如果我寫錯了什麼,因爲我對excel宏和vb是全新的。如何將多個宏和excel函數結合成一個按鈕單擊執行的宏?

以下是方案。

步驟:

  1. 計算總
  2. 提取參考
  3. 匹配參考比較總字段值和標記爲「完成」如果匹配的參考總的總和計算出)。

(解釋...) 首先,我計算出借方和貸方金額稱爲總新列,對於這一點,首先我用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", "")))

這兩個複製所提取的參考和總到一個新的工作表和創建數據表後也工作得很好。

現在我真正想要的是我需要避免創建任何新的數據表或工作表,並在單擊按鈕上單擊當前表單中的所有內容。無論如何可以做到這一點,而不會使宏成爲一個耗時的過程?非常感謝您的幫助!

由於提前

+1

變體陣列的解釋是[此](https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros/10717999#10717999) –

回答

1

的第一部分嘗試:

Private Sub getTotal_Click() 
Dim lastRow As Long 
Dim sumRange As Range 

    With ActiveSheet 
     lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
    End With 
    Set sumRange = Range(Range("K5"), Range("K" & lastRow)) 
    sumRange.FormulaR1C1 = "=RC[-5]+RC[-4]" 
    sumRange.Copy 
    sumRange.PasteSpecial Paste:=xlPasteValues 
    Application.CutCopyMode = False 
End Sub 

另外,如果你仍然要循環的通知,調用細胞像.Cells(1, 1)快於Range("A1")

+0

三江源,我嘗試了上面的代碼,但Dy.Lee解決方案似乎比以上更快。 – eccentricCoder

+1

相當令人意外,但我做了一個測試,@ Dy.Lee代碼的速度提高了9倍,所以今天我學到了一些新東西:) – avb

+0

明確地說,宏現在工作得非常快。我想多點贊成,但你只能投一次票。 @ Dy.Lee如果 – eccentricCoder

1

你需要使用變陣列。它更快。

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("f5", "g" & 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("k5").Resize(n) = vR 
    End With 

End Sub 
+0

Thankyou @ Dy.Lee它的工作速度非常快。你救了我的一天! – eccentricCoder

+0

應該如何使用Excel變體的公式? – eccentricCoder