选择所有单元格时,Selection.Count溢出

时间:2014-10-14 12:13:49

标签: excel vba excel-vba overflow

在Excel 2007中,我想在单击单元格(L2)时提示消息。我有一段可行的代码,但问题是,当我使用Ctrl+A选择工作表中的所有单元格时,我会在06: overflow行上获得错误编号If Selection.Count = 1 Then

强制性VBA代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.Count = 1 Then
        If Not Intersect(Target, Range("L2")) Is Nothing Then
            MsgBox "ACTION!"
        End If
    End If
End Sub

4 个答案:

答案 0 :(得分:6)

轻松修复:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.CountLarge = 1 Then
        If Not Intersect(Target, Range("L2")) Is Nothing Then
            MsgBox "ACTION!"
        End If
    End If
End Sub

答案 1 :(得分:2)

试试这个:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        If InStr(1, CStr(Target.Address), ":") < 1 Then
            If Selection.Count = 1 Then
                If Not Intersect(Target, Range("L2")) Is Nothing Then
                    MsgBox "ACTION!"
                End If
            End If
        End If

End Sub

答案 2 :(得分:0)

您必须按如下方式更改代码。不需要错误陷阱: Private Sub Worksheet_SelectionChange(ByVal Target As Range)     如果Selection.Area.Count = 1那么         如果不相交(目标,范围(“L2”))则没有             MsgBox“行动!”         万一     万一 结束子

答案 3 :(得分:0)

如果您使用64位Excel,我会告诉您使用CountLarge而不是Count。 Excel 2007仅提供32位版本,因此这不是您的选择。

您的问题是Range.Count返回一个Long变量,并且如果单元格的数量大于Long可以存储的单元数,则会引发错误。

要解决此问题,您可以执行以下操作:

  1. 使用存储在Decimal内的Variant数据类型。在Excel工作表中,组合的数量可以超过1,048,576行x 16,384列的单元格。

  2. 一次将单元格计数为一列,以免发生Range.Count错误。

我写了一个函数来做到这一点。将此功能保存在常规代码模块(而不是工作表或工作簿模块)中,并按以下方式使用它:

If CountLarge32(Selection) = 1 Then

这是实际功能:

Public Function CountLarge32(ByVal rangeOrSelection As Variant) As Variant

    Dim target As Excel.Range
    On Error Resume Next
    Set target = rangeOrSelection
    On Error GoTo 0


    Dim cnt As Variant
    Dim iColumn As Excel.Range

    If Not target Is Nothing Then                   ' parameter -IS- a valid Range

        ' Use Range.Count on one column at a time to avoid the overflow error
        '   if counting higher than the limit of the Long data type.
        For Each iColumn In target.Columns
            cnt = CDec(cnt + iColumn.Cells.Count)
        Next iColumn

        CountLarge32 = cnt

    End If
End Function

此功能还可以避免“选择”是对象(例如按钮,形状,图表等)而不是单元格时发生的错误。