VBA验证正在崩溃我的工作簿

时间:2016-11-16 02:14:50

标签: excel vba excel-vba

我有VBA代码来改变依赖于所选选项的单元格的验证。

Sub Worksheet_Change(ByVal Target As Range)
    Dim ws As Worksheet
    Set ws = Sheets("lkup")

    Dim VariationList As Variant
    VariationList = Application.Transpose(ws.Range("Resource_List"))
    For i = LBound(VariationList) To UBound(VariationList)

    Next i
        If Target = Range("B15") Then
        If InStr(1, Range("B15"), "Resource") > 0 Then
            With Range("D15").Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Operator:=xlEqual, Formula1:=Join(VariationList, ",")
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
            End With
        ElseIf InStr(1, Range("B15"), "Fixed Asset") > 0 Then
            Range("D15").Validation.Delete
            Range("D15").ClearContents
            With Range("D15").Validation
                .Delete
                .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
                    Operator:=xlBetween, Formula1:="100000", Formula2:="999999"
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = "Oopps"
                .InputMessage = ""
                .ErrorMessage = "Your fixed asset number can only be 6 numbers"
                .ShowInput = True
                .ShowError = True
            End With
        Else
            Range("D15").ClearContents
            Range("D15").Validation.Delete
        End If
    End If
End Sub

当工作簿处于打开状态时正常工作。它运行良好,没有错误或任何东西。但是,当我保存并重新打开工作簿时,它会给我以下内容:

  

我们发现Invoice.xlsm'中的某些内容存在问题。你想要我们吗?   试图尽可能多地恢复?如果您相信这个来源   工作簿,单击是。

然后打开工作簿,删除所有格式并删除VBA。

我已经尝试过谷歌搜索,但我们无法将其翻译成我所拥有的。

干杯,

1 个答案:

答案 0 :(得分:2)

在使用Worksheet_Change更改ActiveSheet上的值之前,您需要关闭事件。这可以防止Worksheet_Change再次触发并可能导致无限循环。确保在事件退出之前重新打开它们。

最好添加一个错误处理程序,以便在出现问题时自动重新启动事件。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error GoTo ResumeEvents
    Application.EnableEvents = False

    '----{Code}------
ResumeEvents:
    Application.EnableEvents = True
End Sub