VBA VisibleCell不可见

时间:2015-06-23 18:27:34

标签: excel vba excel-vba

我遇到一个问题,CellIsInVisibleRange函数会选择一个不应该出现的单元格。

循环的代码如下:

wCount = 0
    loopCount = 0
    For Each wCell In wRange
        loopCount = loopCount + 1
        If CellIsInVisibleRange(wCell) Then
            MsgBox ("HERE IT BE")
            wCount = wCount + 1
            "codey-code"
        End If
    Next

对我来说失败的功能是:

Function CellIsInVisibleRange(cell As Range)

     CellIsInVisibleRange = Not Intersect(ActiveWindow.VisibleRange, cell) Is Nothing

End Function

发生了什么,我的可见行范围是1,64,65,66。这个循环在行45中接受所谓的可见wCell。 < / p>

我正在看这张表,那行绝对不可见。

你看到这个功能有什么问题吗?

感谢。

修改

@KekuSemau

感谢您的回复。该代码运行良好,但我想知道是否有更有效的方法来做这件事。行wCell.SpecialCells(xlCellTypeVisible)返回&#34;类型不匹配&#34;错误,但我觉得这样的事情会更快。我想我应该证明我已经宣布了我正在寻找的范围。

Set wRange = Range("$" & nameColumnLetter & "$1:$" & nameColumnLetter & "$" & lastRow)
    wCount = 0
    loopCount = 0
    For Each wCell In wRange
        loopCount = loopCount + 1
        'If CellIsInVisibleRange(wCell) Then
        If wCell.SpecialCells(xlCellTypeVisible) Then
            code
            code
            code
        End If
    Next

我接近一个更快的方法吗?

再次感谢。

3 个答案:

答案 0 :(得分:2)

ActiveWindow.VisibleRange似乎不是非常“聪明”,它直接将范围从顶部单元格返回到底部单元格。 试一试:例如,转到新工作表,隐藏5-10行,然后隐藏E列 然后在VB编辑器的即时窗口中输入:

?ActiveWindow.VisibleRange.Address

它将输出类似$A$1:$M$47的内容,忽略缺少的范围。

您可以将VisibleRange与非隐藏单元格相交:

Public Function CellIsInVisibleRange(cell As Range) As Boolean
    CellIsInVisibleRange = False
    ' wrong sheet active?
    If Not cell.Worksheet Is ActiveWindow.VisibleRange.Worksheet Then Exit Function

    ' <Really> visible range
    Dim rng As Range
    Set rng = Intersect( _
        ActiveWindow.VisibleRange, _
        ActiveWindow.VisibleRange.Worksheet.Cells.SpecialCells(xlCellTypeVisible))

    CellIsInVisibleRange = Not Intersect(rng, cell) Is Nothing
End Function

答案 1 :(得分:2)

我的工作进展中的答案,直到我们稍后讨论,以及我将如何修改您的代码:

Set wRange = Range("$" & nameColumnLetter & "$1:$" & nameColumnLetter & "$" & lastRow)
    wCount = 0
    'counts blanks and non-blanks, changed from original based on my guess of what you want
    loopCount = wRange.Count 
    Set wRange2 = wRange.SpecialCells(xlCellTypeVisible)
    For Each wCell In wRange2
        code
        code
        code
    Next wCell

答案 2 :(得分:0)

Range.EntireRow和Range.EntireColumn范围对象具有名为&#34;隐藏&#34;的属性。可以在执行计算上昂贵的Intersect评估之前检查。在这种情况下,您将检查是否隐藏了cell.EntireRow.Hidden。如果它被隐藏,则无法检查它是否在可见范围内。

Public Function CellIsInVisibleRange2(cell As Range) As Boolean
    If (cell.Worksheet Is ActiveWindow.VisibleRange.Worksheet) Then
        If Not cell.EntireRow.Hidden Then
            CellIsInVisibleRange2 = Not (Application.Intersect(cell, ActiveWindow.VisibleRange) Is Nothing)
        End If
    End If
End Function