Я получаю ошибку 13 несоответствие типов VBA при запуске другого микро - PullRequest
0 голосов
/ 29 октября 2018

Я должен макрос один для изменения текста в ранжированном на верхний регистр, а другой для ясного ранжированного контента. Это первый

Private Sub Worksheet_Change(ByVal Target As Range)
If Not (Application.Intersect(Target, Range("B9:B28")) _
  Is Nothing) Then
    With Target
        If Not .HasFormula Then
            Application.EnableEvents = False
            .Value = UCase(.Value)
            Application.EnableEvents = True
        End If
    End With
End If
End Sub

Работает нормально, и когда я ввожу значение, оно меняет его на прописные, но когда я запускаю этот макрос, чтобы очистить содержимое диапазона

Sub clearCellContentsKeepFormatting()
    Dim Answer As VbMsgBoxResult
    Answer = MsgBox("Are you sure about this?", vbYesNo + vbQuestion, "Clear All Proudcts")

    If Answer = vbYes Then
        Range("B9", "B28").ClearContents
        Range("C9", "C28").ClearContents
    Else
        Exit Sub
    End If
End Sub

Я получаю

Ошибка выполнения 13 несоответствие типов

И когда я нажимаю кнопку отладки, она помечает эту строку

.Value = UCase(.Value)

Итак, как мне это исправить?

1 Ответ

0 голосов
/ 29 октября 2018

Это происходит потому, что .Value - это массив, если целевой диапазон содержит более одной ячейки, и вы не можете вызвать UCase для массива.

Вы можете обойти это, обрабатывая каждую ячейку по одному:

Dim c As Range
With Target
    If Not .HasFormula Then
        Application.EnableEvents = False
        For Each c In Target
            c.Value = UCase(c.Value)
        Next c
        Application.EnableEvents = True
    End If
End With

хотя это повлияет на производительность.

Другой момент заключается в том, что вы пытаетесь установить весь диапазон цели в верхний регистр, а не только ту часть, которая перекрывается с B9: B28. Если вы хотите, чтобы B9: B28 вводился только в верхнем регистре, вам нужно что-то вроде:

Dim rngIntersection As Range
Set rngIntersection = Application.Intersect(Target, Range("B9:B28"))

If Not (rngIntersection Is Nothing) Then
    Dim c As Range
    With rngIntersection
       If Not .HasFormula Then
            Application.EnableEvents = False
            For Each c In rngIntersection
                c.Value = UCase(c.Value)
            Next c
            Application.EnableEvents = True
        End If
    End With
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...