Мой макрос выдает «Ошибка во время выполнения« 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