Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Excel 避免相关事件相互触发_Excel_Vba - Fatal编程技术网

Excel 避免相关事件相互触发

Excel 避免相关事件相互触发,excel,vba,Excel,Vba,我有一个工作表_更改,其中两个事件被选中:对C列单元格的编辑和对D列单元格的编辑。问题是对C列单元格的编辑修改了D列单元格的值,反之亦然,因此工作表_更改被反复触发,excel最终崩溃 如何在维护功能的同时避免问题 Private Sub Worksheet_Change(ByVal Target As Range) Dim rgFound As Range Dim defVal As Range Dim currParam As Range Dim currParamDict A

我有一个工作表_更改,其中两个事件被选中:对C列单元格的编辑和对D列单元格的编辑。问题是对C列单元格的编辑修改了D列单元格的值,反之亦然,因此工作表_更改被反复触发,excel最终崩溃

如何在维护功能的同时避免问题

    Private Sub Worksheet_Change(ByVal Target As Range)



Dim rgFound As Range
Dim defVal As Range
Dim currParam As Range
Dim currParamDict As Range

Set targ = Intersect(Target, Range("A:A"))
If Not targ Is Nothing Then


With Worksheets("FT_CASE_xx")
    For Each defVal In .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Offset(, 1)

            Set currParam = defVal.Offset(, -1)

            Dim xlFirstChar As String
            xlFirstChar = Left$(currParam, 1)


            If xlFirstChar = "B" Then

                Set rgFound = Worksheets("DEF_BOOLEAN").Range("A:A").Find(currParam.value)
                defVal.Offset(, 1).Interior.Color = RGB(230, 230, 230)
                defVal.Offset(, 1).Locked = True

                defVal.Offset(, 2).Select

                With Selection.Validation
                                .Delete
                                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="TRUE,FALSE"
                                .IgnoreBlank = True
                                .InCellDropdown = True
                                .InputTitle = ""
                                .ErrorTitle = ""
                                .InputMessage = ""
                                .ErrorMessage = ""
                                .ShowInput = True
                                .ShowError = True
                End With
            Else
                Set rgFound = Worksheets("DEF_FLOAT").Range("A:A").Find(currParam.value)
                defVal.Offset(, 1).Interior.ColorIndex = 0
                defVal.Offset(, 1).Locked = False
                defVal.Offset(, 2).Locked = False

                defVal.Offset(, 1).NumberFormat = "0.000"
                defVal.Offset(, 2).NumberFormat = "0.000"
                defVal.Offset(, 3).NumberFormat = "0.000"
            End If

            If rgFound Is Nothing Then
                Debug.Print "Name was not found."
            Else

            If xlFirstChar = "B" Then
                Set currParamDict = rgFound.Offset(, 3)
            Else
               Set currParamDict = rgFound.Offset(, 5)
            End If

            defVal.value = currParamDict.value

            End If

    Next defVal
End With

Else
    Set targ = Intersect(Target, Range("C:C"))
    If Not targ Is Nothing Then

        Dim coeffVal As Range
        Dim currVal As Range
        Dim RequestedVal As Range

        With Worksheets("FT_CASE_xx")
            For Each coeffVal In .Range("C2", .Range("C" & Rows.Count).End(xlUp))

                    Set currVal = coeffVal.Offset(, -1)
                    Set RequestedVal = coeffVal.Offset(, 1)
                    Set ParamName = coeffVal.Offset(, -2)

                    Dim xlFirstChar2 As String
                    xlFirstChar2 = Left$(ParamName, 1)

                    If ((xlFirstChar2 = "F") And (IsEmpty(coeffVal.value) = False)) Then
                       RequestedVal.value = coeffVal.value * currVal.value
                    End If

            Next coeffVal
        End With

    Else

            Set targ = Intersect(Target, Range("D:D"))
            If Not targ Is Nothing Then

            Dim coeffsVal As Range
            Dim val As Range
            Dim reqVal As Range
            Dim Parameter As Range

            With Worksheets("FT_CASE_xx")
                For Each reqVal In .Range("D2", .Range("D" & Rows.Count).End(xlUp))

                        Set coeffsVal = reqVal.Offset(, -1)
                        Set val = reqVal.Offset(, -2)
                        Set Parameter = reqVal.Offset(, -3)

                        Dim xlFirstChar3 As String
                         xlFirstChar3 = Left$(Parameter, 1)

                        If ((xlFirstChar3 = "F") And (IsEmpty(reqVal.value) = False)) Then
                            If val.value = 0 Then
                                coeffsVal.value = reqVal.value
                            Else
                                coeffsVal.value = reqVal.value / val.value
                            End If
                        End If

              Next reqVal
            End With

    Else
                Exit Sub
    End If
    End If
End If

End Sub

也许是目标交叉口的不同管理?如何操作?

我最喜欢的方法是根据需要在全局或模块级别创建一个变量,然后在每次运行代码时检查此方法,这在其他情况下也很有用

Private disableEvents as Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    If disableEvents Then Exit Sub
    disableEvents=True

    <code here>

    disableEvents=False
End sub       

看看application.enableevents True/false这就是application.enableevents的基本功能。很好的建议。是的,但它更具体。Application.EnableEvents是钝的,因为它将停止所有事件。使用此方法可以停止特定事件的触发。在这种情况下,两者都可以,使用哪一个是个人的选择。