Почему я получаю ошибку несоответствия типов здесь? - PullRequest
0 голосов
/ 02 октября 2018

Я создаю новый модуль и вставляю этот код:

Sub test()
   Set wsData = ThisWorkbook.Worksheets("Data")
   sCount = wsData.Columns(14).SpecialCells(xlCellTypeBlanks).Count
   msgbox sCount
End Sub

В листе «Данные» у меня есть этот код:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.CountLarge = 1 Then
        If Not Intersect(Target, Range("K:M")) Is Nothing And Target.Value <> "" Then
            'code
        End if
    End if
End Sub

Когда я запускаю test()sub, я получаю ошибку несоответствия типов на If Not Intersect(Target, Range("K:M")) Is Nothing, так как Target неправильный тип.

Почему это происходит?

Почему тест вызывает событие изменения?Я не получаю ту же ошибку, если вручную отфильтровать столбец 14 моего листа данных, чтобы оставить только пустые ячейки!

Ответы [ 2 ]

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

Я почти закрыл этот вопрос как дубликат.

Я отвечу на оба ваших вопроса, но в обратном порядке, чтобы вы могли лучше понять его.

Почему запускается тест?событие изменения?

Я объяснил это в SpecialCells, вызывающей событие SheetSelectionChange в Excel 2010

Когда я запускаю подпрограмму test (), я получаю несоответствие типовошибка при отсутствии пересечения (цель, диапазон («K: M»)) - ничто, так как цель неверного типа.Почему это происходит?

Когда процедура Test вызывает событие Worksheet_SelectionChange, ваш код завершится ошибкой в ​​строке

If Not Intersect(Target, Range("K:M")) Is Nothing And Target.Value <> "" Then

Это потому, что Target.Value <> ""виновник как SpecialCells(xlCellTypeBlanks).Count может вернуть несколько ячеек.

Если разбить вышеуказанную строку на 2 строки, вы не получите ошибку

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub
    If Not Intersect(Target, Range("K:M")) Is Nothing Then
        If Target.Value <> "" Then
             'code
        End If
    End If
End Sub
0 голосов
/ 02 октября 2018

Проблема с несовпадением типов заключается в том, что Target.Cells - это более одной ячейки.Таким образом, Target.Value <> "" выбрасывает несоответствие типов, потому что несколько ячеек нельзя сравнивать с "".См. MsgbBox с количеством ячеек:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.CountLarge = 1 Then
        If Target.Cells.CountLarge > 1 Then MsgBox Target.Cells.CountLarge
        If Not Intersect(Target, Range("K:M")) Is Nothing And Target.Value <> "" Then
            'code
        End If
    End If
End Sub

На основе бизнес-логики может быть несколько решений.

  • Самым простым является запись If Target.Cells.CountLarge > 1 Then Exit Sub в событии _SelectionChange.

  • Другой способ - отключить события вокруг

sCount = wsData.Columns(14).SpecialCells(xlCellTypeBlanks).Count как это:


Sub TestMe()
   Set wsData = ThisWorkbook.Worksheets("Data")
   Application.EnableEvents = False
   sCount = wsData.Columns(14).SpecialCells(xlCellTypeBlanks).Count
   Application.EnableEvents = True
   msgbox sCount
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...