Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 工作表更改事件卡在无限循环中_Vba_Excel - Fatal编程技术网

Vba 工作表更改事件卡在无限循环中

Vba 工作表更改事件卡在无限循环中,vba,excel,Vba,Excel,我希望以下代码执行以下操作: 在我将一个值输入到一个特定的列中之后,计算一些内容并用这些计算出的值分配单元格值 问题: 在我将值分配给另一个单元格后,将再次触发工作表.Change事件,这将重新启动子单元格并导致无限循环 如何更改代码,使其不会陷入无限循环,并且每当我向正在处理的列添加值时,我希望更新的单元格都会自动更新 代码-我要向其中添加值的列是C列: Public Sub Worksheet_Change(ByVal Target As Range) Dim xlApp As Ap

我希望以下代码执行以下操作:

在我将一个值输入到一个特定的列中之后,计算一些内容并用这些计算出的值分配单元格值 问题:

在我将值分配给另一个单元格后,将再次触发工作表.Change事件,这将重新启动子单元格并导致无限循环 如何更改代码,使其不会陷入无限循环,并且每当我向正在处理的列添加值时,我希望更新的单元格都会自动更新

代码-我要向其中添加值的列是C列:

Public Sub Worksheet_Change(ByVal Target As Range)
    Dim xlApp As Application
    Dim ws As Worksheet
    Dim r As Range
    Dim size As Long

    Set xlApp = Excel.Application
    Set ws = xlApp.ThisWorkbook.Worksheets("Sheet1")

    'get length of this individual column
    Set r = ws.Range(ws.Cells(2, 3), ws.Cells(ws.Rows.Count, 3).End(xlUp))
    'test to see if I got the correct column: i do
    r.Select
    size = r.Count

    With xlApp.WorksheetFunction
        'test to see if the offset I got was correct: it is
        r.Offset(0, 1).Select
        'get average of big range
        ws.Cells(3, 10).Value = .Average(r.Offset(0, 1)) ' <- here is where the change event will fire again
                                                         '    presumably because i just changed a value.
        'get standard deviation of big range's population
        ws.Cells(3, 11).Value = .StDev_P(r.Offset(0, 1))
        'test to see if the offset i got was correct: it is
        r.Offset(0, 2).Select
        ws.Cells(3, 12).Value = .Average(r.Offset(0, 2))
        ws.Cells(3, 13).Value = .StDev_P(r.Offset(0, 2))
    End With

    Set xlApp = Nothing
    Set ws = Nothing
    Set r = Nothing
End Sub
谢谢你的阅读

在对工作表进行任何更改之前禁用事件。在不禁用事件的情况下,您对工作表所做的每一项更改都将[重新]-激活宏,并使系统不断循环,直到excel实例崩溃

Application.EnableEvents = False
    'Changes go here
Application.EnableEvents = True
在对工作表进行任何更改之前禁用事件。在不禁用事件的情况下,您对工作表所做的每一项更改都将[重新]-激活宏,并使系统不断循环,直到excel实例崩溃

Application.EnableEvents = False
    'Changes go here
Application.EnableEvents = True

在更新值之前将Application.EnableEvents=False设置为正确,然后在完成应用程序设置之后将其重新启用`=True`。在更新值之前将EnableEvents=False设置为正确,然后在完成帮助设置之后将其重新启用`=True`;6分钟后我会接受你的回答。谢谢你的帮助;6分钟后我会接受你的回答。