Excel Macro выдает ошибку времени выполнения «1004» через раз - PullRequest
0 голосов
/ 17 октября 2019

Мой макрос выдает «Ошибка во время выполнения« 1004 »: ошибка приложения или объекта» при каждом запуске. Ошибка возникает на «.Add» в cel.Validation.

Первоначально код выдавал ошибку при каждой попытке. После некоторых исследований, которые я обнаружил, могут быть проблемы при включенной защите, отсюда и закомментированный раздел кода.

Этот код проверяет значения на других листах и, как предполагается, устанавливает валидацию при соблюдении определенных условий.

Private Sub CommandButton1_Click()

    Dim Table1Check As Range
    Dim Table2Check As Range
    Dim LocalCells As Range
    Dim cellCheck As Range
    Dim cellAddr As String

    Set Table1Check = Worksheets("Table1").Range("A16:AC467")
    Set Table2Check = Worksheets("Table2").Range("A16:AC467")
    Set LocalCells = ActiveSheet.Range("R13:R464")

    ActiveSheet.Unprotect "<pw>"
    ActiveSheet.Range("R13:R464").Locked = False
    ActiveSheet.CheckBox1.Value = False
    'ActiveSheet.EnableOutlining = True
    'ActiveSheet.Protect Password:="<pw>", UserInterFaceOnly:=True, AllowFiltering:=True, AllowFormattingColumns:=True

    For Each cel In LocalCells

        Test0 = WorksheetFunction.VLookup(Cells(cel.Row, cel.Column + 1), Table1Check, 16, False)
        cellAddr = ActiveSheet.Cells(cel.Row + 3, cel.Column - 3).Address(RowAbsolute:=False, ColumnAbsolute:=False)
        Set cellCheck = Worksheets("Table2").Range(cellAddr)

        If Test0 = "Option1" Or Test0 = "Option2" Then
            cel.Interior.Color = xlNone
            cel.Interior.Pattern = xlPatternNone
            If cellCheck.Interior.Pattern <> xlPatternUp Then
                With cel.Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                        Formula1:="A,B"
                End With
            Else
                With cel.Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                        Formula1:="A"
                End With
            End If
        ElseIf cellCheck.Interior.Pattern <> xlPatternUp Then
            cel.Interior.Color = xlNone
            cel.Interior.Pattern = xlPatternNone
            With cel.Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Formula1:="B"
            End With
        Else
            cel.Interior.Color = xlNone
            cel.Interior.Pattern = xlPatternUp
            cel.Interior.PatternColor = RGB(0, 0, 0)
            cel.Validation.Delete
        End If



    Next cel

    'ActiveSheet.Unprotect "<pw>"
    ActiveSheet.Range("R13:R464").Locked = True
    ActiveSheet.CheckBox1.Value = True
    ActiveSheet.EnableOutlining = True
    ActiveSheet.Protect Password:="<pw>", UserInterFaceOnly:=True, AllowFiltering:=True, AllowFormattingColumns:=True

End Sub

Что касается защиты, то как каждый лист защищен при открытии книги:

Private Sub Workbook_Open()

    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets

        ws.EnableOutlining = True

        If ws.Name = "Version" Then
            ws.Protect Password:="<pw>", UserInterFaceOnly:=True, AllowFiltering:=True, AllowFormattingColumns:=True, AllowInsertingRows:=True
        Else
            ws.Protect Password:="<pw>", UserInterFaceOnly:=True, AllowFiltering:=True, AllowFormattingColumns:=True
        End If

    Next ws

End Sub

Пожалуйста, прости мое невежество, если это простая проблема (мои навыки в excel-vba самообучаются),Я пытался найти другие решения, но не смог найти ни одного. Я не понимаю, почему это работает при каждом другом выполнении.

ОБНОВЛЕНИЕ: Я только что обнаружил, что если нажать CommandButton1, пока проверяется CheckBox1, то макрос завершится неудачей. Если CheckBox1 не проверено, то это работает. Это объясняет, почему он работал каждый раз, потому что мой макрос не выполнялся при сбое, поэтому он никогда не достигал строки ActiveSheet.CheckBox1.Value = True. Поэтому в следующий раз, когда я его запустил, CheckBox1 не было проверено. Я до сих пор не понимаю, почему это происходит, потому что я «снимаю галочку» в коде до запуска цикла for: ActiveSheet.CheckBox1.Value = False

1 Ответ

0 голосов
/ 17 октября 2019

На основании моего ОБНОВЛЕНИЯ я смог найти решение. Я не уверен на 100%, что происходило, но теперь оно работает, если я закомментирую эти две строки:

ActiveSheet.CheckBox1.Value = False
ActiveSheet.CheckBox1.Value = True

Возможно, это мешало моему макросу, потому что код CheckBox1_Click() блокирует / разблокируетLocalCells диапазон. Активирует ли изменение значения флажка макрос клика?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...