vba ошибка при удалении значений в нескольких строках: ошибка времени выполнения '13': несоответствие типов - PullRequest
0 голосов
/ 02 апреля 2020

У меня проблема с моим кодом VBA. Как правило, каждая строка кода работает как следует, но если я пытаюсь удалить значения (даже пустые ячейки) по крайней мере двух строк в столбце E (выбрать и удалить), я получу

Выполнить ошибка «13»: несоответствие типов

Я прочитал, что это произошло из-за того, что переменная не была объявлена, но я не знаю, чего не хватает.

Private Sub Worksheet_Change(ByVal Target As Range)

Dim KeyCellsKolumnE As Range

Set KeyCellsKolumnE = Range("E2:E100")

If Not Application.Intersect(KeyCellsKolumnE, Range(Target.Address)) _
    Is Nothing Then

    If Range(Target.Address).Value = "TEXT1" _
        Or Range(Target.Address).Value = "TEXT2" Then
            Range(Target.Address).Offset(, 3).Value = "TEXT3"

    ElseIf Range(Target.Address).Value = "TEXT4" _
        Or Range(Target.Address).Value = "TEXT5" _
        Or Range(Target.Address).Value = "TEXT6" Then
            Range(Target.Address).Offset(, 3).Value = "TEXT7"

    ElseIf Range(Target.Address).Value = "TEXT7" Then
            Range(Target.Address).Offset(, 3).Value = "TEXT7"
            Range(Target.Address).Offset(, 10).Value = "TEXT8"

    ElseIf Range(Target.Address).Value = "" Then
        Range(Target.Address).Offset(, 3).Value = ""

    Else
        Range(Target.Address).Offset(, 3).Value = ""
    End If

End If
End Sub

1 Ответ

3 голосов
/ 02 апреля 2020

Как указал BigBen, основной проблемой должен быть многоклеточный Target, который требует al oop

Также вы можете убедиться, что многоклеточный Target находится внутри столбца E *. 1005 *

Я также превратил синтаксис If ElseIf EndIf в Select Case one

Наконец, я добавляю хорошую методику кодирования, чтобы избежать множественных рекурсивных вызовов в таком обработчике событий

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim KeyCellsKolumnE As Range
    Set KeyCellsKolumnE = Range("E2:E100")

    If Not Application.Intersect(KeyCellsKolumnE, Target) Is Nothing And Target.Columns.CountLarge = 1 Then ' make sure Target is completely inside column E
        On Error GoTo SafeExit
        Application.EnableEvents = False ' disable events to prevent recursive calling

        Dim cel As Range
        For Each cel In Target ' loop through each Target cell
            With cel ' reference current cell
                Select Case .Value
                    Case "TEXT1", "TEXT2"
                        cel.Offset(, 3).Value = "TEXT3"

                    Case "TEXT4", "TEXT5", "TEXT6"
                        .Offset(, 3).Value = "TEXT7"

                    Case "TEXT7"
                        .Offset(, 3).Value = "TEXT7"
                        .Offset(, 10).Value = "TEXT8"

                    Case Else
                        .Offset(, 3).ClearContents

                End Select
            End With
        Next

    End If

SafeExit:
    Application.EnableEvents = True ' restore events back

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