如何将多个macros和Excel函数组合成一个button单击执行的macros?

我需要将多个macros组合成一个button单击执行的macros。 请原谅我,如果我写错了,因为我是全新的Excel和macros。

以下是这种情况。

脚步:

  1. 计算总数
  2. 提取参考
  3. 比较匹配引用的总字段值,如果匹配引用的总和计算为,则将其标记为“完整”

(解释…)首先,我计算了借方和贷方总额的一个新的列,为此,最初我使用SUM函数。 之后,我尝试使用button单击执行的macros相同

(旧macros)

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 

这是非常耗时的(在75klogging上执行需要大约2小时)比使用公式(在几分钟内完成)时要耗费大量的时间。 我仍然无法理解这个原因。 不过修改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中的string提取模式的第二个macros。

 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 

这个macros工作正常。

最后,在将提取的引用和总数复制到一个新工作表并为其创build数据表之后,我使用了以下函数

=IF(ISBLANK([@Reference]), "", (IF((ROUND(SUMIFS([Total],[Reference],[@Reference]),2)=0), "complete", "")))

这也工作得很好。

现在我真正想要的是我需要避免创build任何新的数据表或工作表,并在单击button单击当前工作表内的所有这一切。 有没有办法可以不使macros成为一个耗时的过程呢? 您的帮助是非常感激!

提前致谢

第一部分尝试:

 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")

你需要使用Variant数组。 这是更快。

 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