你真的知道如何使用Target.Count嗎?

工作表的Change和SelectChange事件是VBA開發中最常用的事件。

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

兩個過程的參數都有Range類型的對象變量Target,爲了確保用戶在Excel操作時只選中了單個單元格,經常會使用如下代碼。這句代碼已經是簡單得不能再簡單的語句了,它會有什麼問題嗎?

If Target.Count > 1 Then

我們來做個試驗,新建一個Excel文件,在工作表模塊中添加如下事件代碼,如果用戶選中多個單元格就在立即窗口中輸入選中區域的地址。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count > 1 Then
        Debug.Print Target.Address
    End If
End Sub

單擊工作表左上角選中全部單元格,立刻出現如下圖所示的錯誤提示。
在這裏插入圖片描述
單擊【調試】按鈕將打開VBE窗口,定位到出錯的代碼,如下圖所示,這句簡單的代碼出什麼幺蛾子呢?
在這裏插入圖片描述

查閱一下關於Range對象的Count屬性幫助文檔,Count屬性返回值爲Long,查閱一下幫助可以得知Long類型數據的範圍是:-2,147,483,648至2,147,483,647。從Excel 2007開始,一個工作表中的單元格數量爲 1048576(行) * 16384 (列)= 17,179,869,184,這個數遠遠超過了Long類型數據的範圍。
在這裏插入圖片描述
這個問題的解決方法其實很簡單,只需要使用CountLarge屬性替代Count屬性就可以了,CountLarge屬性返回值爲Variant 類型,可以處理工作表中全部單元格區域。代碼更新如下。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.CountLarge > 1 Then
        Debug.Print Target.Address
    End If
End Sub

如果不使用CountLarge屬性,使用其他的方法也可以實現相同的功能。我們首先來分析一下用戶選中單元格的行爲的幾個不同類型。

選中類型 選中區域地址
單個單元格 $AA$188
多個單元格連續區域 $AA$188:$BB$199
多個單元格非連續區域 $A$88,$AA$188:$BB$199

如果希望只處理用戶選中單個單元格的場景,那麼Target.Address屬性返回值加可以進行判斷,如果返回值中包含冒號或者逗號,那麼一定是選中了多個單元格,無論是連續區域還是非連續區域。
示例代碼如下。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address Like "*[:,]*" Then
        Debug.Print "選中了多個單元格"
    Else
        Debug.Print "選中了單個單元格"
    End If
End Sub

大家可以測試一下,即使選中全部工作表單元格,此代碼過程也不會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章