VBA Excel – Workbook_SheetChange

希望这个问题还没有被问到,我试图寻找答案,找不到任何东西。

这可能是一个简单的问题,但我正在写我的第一个macros在Excel中,我有一个问题,我找不到解决scheme。 我写了几个macros,基于同一行的另一列中的值,dynamic地总结列(以便行数可以更改,公式自动下移),并从事件Workbook_SheetChange调用这些macros。

我遇到的问题是,我从macros中更改单元格的值以显示总和的结果,然后再次调用Workbook_SheetChange ,这是我不想要的。 现在它工作,但我可以跟踪它,看到多次调用Workbook_SheetChange 。 这阻止了我将其他单元格更改添加到macros,因为这样会导致无限循环。

我希望macros在每次对表单进行更改时运行,但是我没有看到允许macros更改单元格值的任何方法,所以我不知道该怎么做。 我会在下面粘贴我的代码,以防它有用。

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim Row As Long Dim Col As Long Row = Target.Row Col = Target.Column If Col <> 7 Then Range("G" & Row).Select Selection.Formula = "=IF(F" & Row & "=""Win"",E" & Row & ",IF(F" & Row & "=""Loss"",-D" & Row & ",0))" Target.Select End If Call SumRiskColumn End Sub Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Call SumOutcomeColumn End Sub Sub SumOutcomeColumn() Dim N As Long N = Cells(Rows.Count, "A").End(xlUp).Row Cells(N + 1, "G").Formula = "=SUM(G2:G" & N & ")" End Sub Sub SumRiskColumn() Dim N As Long N = Cells(Rows.Count, "A").End(xlUp).Row Dim CurrTotalRisk As Long CurrTotalRisk = 0 For i = 2 To N If IsEmpty(ActiveSheet.Cells(i, 6)) And Not IsEmpty(ActiveSheet.Cells(i, 1)) And Not IsEmpty(ActiveSheet.Cells(i, 2)) And Not IsEmpty(ActiveSheet.Cells(i, 3)) Then CurrTotalRisk = CurrTotalRisk + ActiveSheet.Cells(i, 4).Value End If Next i Cells(N + 1, "D").Value = CurrTotalRisk End Sub 

谢谢你给我的任何帮助! 对此,我真的非常感激。

使用Application.EnableEvents防止Excel调用事件过程。

Application.ScreenUpdating = False放在代码的开头, Application.ScreenUpdating = True

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Application.EnableEvents = False Dim Row As Long Dim Col As Long Row = Target.Row Col = Target.Column If Col <> 7 Then Range("G" & Row).Select Selection.Formula = "=IF(F" & Row & "=""Win"",E" & Row & ",IF(F" & Row & "=""Loss"",-D" & Row & ",0))" Target.Select End If Call SumRiskColumn Application.EnableEvents = True End Sub Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Application.EnableEvents = False Call SumOutcomeColumn Application.EnableEvents = True End Sub