我遇到一个问题,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
我接近一个更快的方法吗?
再次感谢。
答案 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