Сначала приведенный ниже код работает нормально, но если я удаляю все данные из ячеек, я получаю ошибку «ошибка 13», а затем код перестает работать. Есть ли способ решить эту проблему? Я включил код ниже:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

Application.EnableEvents = False

If Target.Column = 1 Then
    Target = StrConv(Target, vbProperCase)
End If
Application.EnableEvents = True

If Target.Column = 3 Then
    Target = StrConv(Target, vbProperCase)
End If
Application.EnableEvents = True

If Target.Column = 6 Then
    Target = StrConv(Target, vbProperCase)
End If
Application.EnableEvents = True

If Target.Column = 7 Then
    Target = StrConv(Target, vbProperCase)
End If
Application.EnableEvents = True

End Sub

1 ответ1

0

Когда вы удаляете одну строку, ваши ошибки кода в строке Target = StrConv(Target, vbProperCase) (Col 1)

Вы меняете все ячейки в строке, поэтому цель содержит несколько ячеек

  • StrConv() принимает только одну строку
  • Перед ошибкой вы включаете Application.EnableEvents = False
  • После ошибки код останавливается и не попадает в Application.EnableEvents = True

так что теперь все события выключены


Эта версия проверит эти возможности:


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

    Application.EnableEvents = False
    With Target
        If .CountLarge = 1 Then            'one cell
            Select Case .Column
                Case 1, 3, 6, 7:
                    If Not IsError(.Value2) Then
                        If Len(.Value2) > 0 Then .Value2 = StrConv(.Value2, vbProperCase)
                    End If
            End Select
        Else
            Dim cel As Range, ur As Range
            For Each cel In Target         'multiple cells (copy/paste, del/insert rows/cols)
                With cel
                    Set ur = UsedRange
                    If .Row > ur.Rows.Count Or .Column > ur.Columns.Count Then Exit For
                    Select Case .Column
                        Case 1, 3, 6, 7:
                            If Not IsError(.Value2) Then
                                If Len(.Value2) > 0 Then
                                    .Value2 = StrConv(.Value2, vbProperCase)
                                End If
                            End If
                    End Select
                End With
            Next
        End If
    End With
    Application.EnableEvents = True
End Sub

Это прекрасно работает и в Worksheet_SelectionChange()

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .