VBA Excel-工作簿更改

VBA Excel-工作簿更改,vba,excel,Vba,Excel,希望这个问题还没有被问到,我试着寻找答案,但什么也找不到 这可能是一个简单的问题,但我正在用excel编写我的第一个宏,我遇到了一个无法找到解决方案的问题。我编写了两个宏,它们基本上根据同一行的另一列中的值动态汇总列(这样行数可以更改,公式可以自动向下移动),我从事件工作簿\u SheetChange调用这些宏 我遇到的问题是,我从宏中更改单元格的值以显示求和结果,然后再次调用Workbook\u SheetChange,这是我不希望看到的。现在它可以工作了,但我可以跟踪它并看到Workbook

希望这个问题还没有被问到,我试着寻找答案,但什么也找不到

这可能是一个简单的问题,但我正在用excel编写我的第一个宏,我遇到了一个无法找到解决方案的问题。我编写了两个宏,它们基本上根据同一行的另一列中的值动态汇总列(这样行数可以更改,公式可以自动向下移动),我从事件
工作簿\u SheetChange
调用这些宏

我遇到的问题是,我从宏中更改单元格的值以显示求和结果,然后再次调用
Workbook\u SheetChange
,这是我不希望看到的。现在它可以工作了,但我可以跟踪它并看到
Workbook\u SheetChange
被多次调用。这使我无法向宏添加其他单元格更改,因为这样会导致无限循环

我希望每次对工作表进行更改时都能运行宏,但我看不到任何方法可以允许宏更改单元格的值,因此我不知道该怎么做。我会把我的代码贴在下面,以防有用

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
Private子工作簿\u SheetChange(ByVal Sh作为对象,ByVal Target作为范围)
暗排一样长
暗色如长
行=目标。行
Col=Target.Column
如果是第7列,那么
范围(“G”和行)。选择
Selection.Formula=“=IF(F”和Row&“=”赢“、E”和Row&“、IF(F”和Row&“=”输“、-D”和Row&“、0))”
目标。选择
如果结束
调用SumRiskColumn
端接头
私有子工作簿_SheetCalculate(ByVal Sh作为对象)
调用sumoutcome列
端接头
子汇总结果列()
长
N=单元格(Rows.Count,“A”)。结束(xlUp)。行
单元格(N+1,“G”)。公式=“=SUM(G2:G”&N&”)
端接头
子列()
长
N=单元格(Rows.Count,“A”)。结束(xlUp)。行
只要有足够的时间,就有足够的风险
CurrTotalRisk=0
对于i=2到N
如果IsEmpty(ActiveSheet.Cells(i,6))和notisempty(ActiveSheet.Cells(i,1))和notisempty(ActiveSheet.Cells(i,2))和notisempty(ActiveSheet.Cells(i,3)),那么
CurrTotalRisk=CurrTotalRisk+ActiveSheet.Cells(i,4).值
如果结束
接下来我
单元格(N+1,“D”)。值=当前总风险
端接头

谢谢你能给我的任何帮助!非常感谢。

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

Application.ScreenUpdate=False
在代码开头 和
Application.screenUpdate=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
Private子工作簿\u SheetChange(ByVal Sh作为对象,ByVal Target作为范围)
Application.EnableEvents=False
暗排一样长
暗色如长
行=目标。行
Col=Target.Column
如果是第7列,那么
范围(“G”和行)。选择
Selection.Formula=“=IF(F”和Row&“=”赢“、E”和Row&“、IF(F”和Row&“=”输“、-D”和Row&“、0))”
目标。选择
如果结束
调用SumRiskColumn
Application.EnableEvents=True
端接头
私有子工作簿_SheetCalculate(ByVal Sh作为对象)
Application.EnableEvents=False
调用sumoutcome列
Application.EnableEvents=True
端接头

非常感谢您!这正是我想要的。我想可能有什么东西我可以像这样设置,但我只是不知道如何搜索它。再次感谢<代码>希望这个问题还没有被问到,我试着搜索答案,但什么也找不到。是的(这个问题的一个变体)以前被问过。看见