Вот быстрое переписывание, которое делает то же самое, но без некоторых лишних вещей:
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
- Удалил
With
, так как он не использовался (и я не могу себе представить, что activewindow
пригодится в любом случае в подпрограмме, запускаемой событием, такой как
- Переместил всю логику в оператор
If
, который сначала проверяет, не заботимся ли мы вообще об изменении выбора. Это гарантирует, что мы запускаем логику и связываем системные ресурсы только в том случае, если это нас беспокоит.
- Удалена лишняя переменная
thisrow
, так как она использовалась только один раз. Хотя, возможно, у вас есть больше логики, которая не отображается.
- Удалена лишняя проверка для
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