VBA VisibleCell不可见

我有一个CellIsInVisibleRange函数select它不应该的单元格的问题。

循环的代码如下所示:

 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是:

 Function CellIsInVisibleRange(cell As Range) CellIsInVisibleRange = Not Intersect(ActiveWindow.VisibleRange, cell) Is Nothing End Function 

发生了什么事情,我有一个可见范围的行是1,64,65,66 。这个循环接受一个在45行中可以看到的wCell。

我正在看这张表,那行很明显是不可见的。

你看这个function有什么问题吗?

谢谢。

编辑:

@KekuSemau

谢谢回复。 该代码运行良好,但我不知道是否有一个更有效的方式去做到这一点。 该行wCell.SpecialCells(xlCellTypeVisible)返回一个“types不匹配”的错误,但我觉得这样的事情会更快。 我想我应该已经表明,我也宣布了我正在寻求的范围。

 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 

我在这里接近更快的方法吗?

再次感谢。

我的工作进行中的答案,直到我们讨论一下,这里是我将如何修改你的代码:

 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 

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

 ?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 

Range.EntireRow和Range.EntireColumn范围对象有一个名为“Hidden”的属性,可以在执行计算量较大的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