具有Target.Cells.CountLarge的VBA条件语句不起作用

时间:2018-08-30 17:12:01

标签: excel-vba if-statement target

期望的行为:

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

代码:

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 :(得分:0)

这里是一个快速重写,它执行相同的操作,但是没有一些多余的东西:

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