期望的行为:
当且仅当另一个单元格的单元格当前值与我选择的某个常量字符串值(仅字母字符)匹配时,我想更改单元格的值。
码:
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语句是确保选择一个单元格以避免错误消息类型不匹配所必需的。
这是一个快速重写,做同样的事情,但没有一些多余的东西:
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