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