Excel 带有Target.Cells.CountLarge的VBA条件语句不工作

Excel 带有Target.Cells.CountLarge的VBA条件语句不工作,excel,vba,if-statement,target,Excel,Vba,If Statement,Target,期望的行为: 当且仅当另一个单元格的单元格当前值与我选择的某个常量字符串值(仅alpha字符)匹配时,我想更改单元格的值 代码: Private Sub Worksheet_SelectionChange(ByVal Target As Range) With ActiveWindow Dim sht As Worksheet Set sht = ThisWorkbook.Sheets("Sheet1") Dim selection

期望的行为:

当且仅当另一个单元格的单元格当前值与我选择的某个常量字符串值(仅alpha字符)匹配时,我想更改单元格的值

代码:

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
  • 删除了带有的
    ,因为它没有被使用(我无法想象在这样一个事件触发的子例程中,
    activewindow
    有什么用处
  • 将所有逻辑移到
    If
    语句中,该语句首先检查我们是否关心选择更改。这确保我们只运行逻辑并占用系统资源(如果我们关心)
  • 删除了多余的
    thisrow
    变量,因为它只使用了一次,尽管这里可能没有显示更多的逻辑
  • 删除了对
    IsEmpty(Target)=False的多余检查,该检查虽然仍然多余,但也可以写入
    非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
    

    为了确保,您希望使用选择更改事件?即,只有在第4列中选择“某物”单元格时,第5列中的单元格才会为“N/A”?一个注释
    IsEmpty(Target)=False
    有点多余。如果它等于
    somestring
    则不能为空,如果为空则不等于该字符串。其他问题:是否为空“Sheet1”与SelectionChange事件所在的页面相同?如果是,则不需要将sht关联到“Sheet1”。ActiveWindow有什么好处?