Условное заявление VBA с Target.Cells.CountLarge не работает - PullRequest
0 голосов
/ 30 августа 2018

желаемое поведение:

Я хочу изменить значение ячейки, если и только если текущее значение ячейки другой ячейки соответствует некоторому постоянному строковому значению (только буквенные символы), которое я выбрал.

Код:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    With ActiveWindow

        Dim sht As Worksheet
        Set sht = ThisWorkbook.Sheets("Sheet1")

        Dim selection As Long
        selection = Target.Cells.CountLarge
        Dim someString As String
        someString= "something"



        If selection = 1 Then
            If (Target.Column = 4 And Target.Value = someString And IsEmpty(Target) =False) Then
                thisrow = Target.Row
                sht.Cells(thisrow, 5).Value = "N/A"
            End If
        End If


    End With
End Sub

Вопрос: Есть ли лучший способ справиться с этим? Первый оператор if необходим для обеспечения выбора одной ячейки и предотвращения несоответствия типов сообщений об ошибках.

1 Ответ

0 голосов
/ 30 августа 2018

Вот быстрое переписывание, которое делает то же самое, но без некоторых лишних вещей:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    'First test to make sure this is a cell we care about 
    '  (before declaring variables and gathering any other info)
    If Target.Column = 4 And Target.Cells.Count = 1 Then        
        'Now we know we have a single cell selected in column D

        Dim sht As Worksheet
        Set sht = ThisWorkbook.Sheets("Sheet1")

        Dim someString As String
        someString= "something"

        If Target.Value = someString Then           
            sht.Cells(Target.Row, 5).Value = "N/A"
        End If    
End Sub
  1. Удалил With, так как он не использовался (и я не могу себе представить, что activewindow пригодится в любом случае в подпрограмме, запускаемой событием, такой как
  2. Переместил всю логику в оператор If, который сначала проверяет, не заботимся ли мы вообще об изменении выбора. Это гарантирует, что мы запускаем логику и связываем системные ресурсы только в том случае, если это нас беспокоит.
  3. Удалена лишняя переменная thisrow, так как она использовалась только один раз. Хотя, возможно, у вас есть больше логики, которая не отображается.
  4. Удалена лишняя проверка для IsEmpty(Target) = False, которая, хотя и остается лишней, может быть записана также как Not IsEmpty(Target), поскольку мы уже имеем дело с логическим возвратом из функции Isempty.

В целом логика для проверки, если мы заботимся, хорошо отделена от логики, которая выполняет всю работу, что делает ее более читаемой и сокращает используемые ресурсы.


Перепишите с наименьшим размером отпечатка (опять же, я предполагаю, что у вас есть больше кода, и переменные необходимы для уменьшения кода копирования / вставки:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 4 And Target.Cells.Count = 1 Then
        If Target.Value = "something" Then          
            Sheets("Sheet1").Cells(Target.Row, 5).Value = "N/A"
        End If    
    End If
End Sub
...