如何解决查找最后一个大于 0 的单元格
我在 VBA 中有以下代码来查找大于 0 的范围内的最后一个单元格:
Set myRange = .Range(.Cells(1,14),.Cells(1,23))
count = 0 'Counter
For Each cll In myRange
If cll.Value > 0 Then
count = count + 1
NoZeroDir = cll.Address
End If
Next
它获取该范围内最后一个大于 0 的单元格的地址。 但是,在最后一个之前,我如何从大于 0 的单元格中获取地址?
我正在考虑使用偏移量,但这样我会在最后一个 > 0 之前获得单元格,但该单元格不能 > 0。
2 3 5 0 1 7 0 8 1 0 1
最后一个单元格的地址 > 0 将是 (1,11) 但我想要那个之前的单元格 > 0,即 (1,9),而不是 (1,10),因为这是 0。>
解决方法
查找倒数第二个 >0
Option Explicit
Public Sub FindSecondLastValueGreaterZero()
Dim MyRange As Range
Set MyRange = Range("A1:K1")
Const MAXSKIPS As Long = 1 ' skip 1 number that is >0
Dim Skips As Long
Dim iCol As Long
For iCol = MyRange.Columns.Count To 1 Step -1
If MyRange(1,iCol).Value > 0 And Skips < MAXSKIPS Then
Skips = Skips + 1
ElseIf MyRange(1,iCol).Value > 0 Then
Debug.Print "Found at: " & MyRange(1,iCol).Address
Exit For
End If
Next iCol
End Sub
这将在 K 循环中向后开始,直到它找到 0
,然后一直这样做直到跳过 >0
是 1
并打印地址 I1
作为结果。>
由于这个从右到左循环,它应该比你的代码更快地找到结果(在大多数情况下)。
,替代使用 Worksheetfunction Filter()
(相对于 MS 365)
基于较新的 WorksheetFunction Filter()
(自 MS/Excel 365 版本可用)并使用 OP 的范围指示
=FILTER(COLUMN(A1:K1),A1:K1>0)
您可以通过对广义公式模式的评估从大于零 (0) 的单元格 中获取列号数组。
如果您得到至少两个剩余的列(即上限 UBound() > 1
),您可以通过 i = cols(UBound(cols) - 1)
获得想要的倒数第二列编号,并且可以通过 Cells(1,i).Address
将其转换为地址。
Public Sub SecondLastValGreaterZero()
'a) construct formula to evaluate
Const FormulaPattern As String = "=FILTER(COLUMN($),$>0)"
Dim rng As Range
Set rng = Sheet1.Range("A1:K1") ' << change to your needs
Dim myFormula As String
myFormula = Replace(FormulaPattern,"$",rng.Address(False,False,external:=True))
'b) get tabular column numbers via Evaluate
Dim cols As Variant
cols = Evaluate(myFormula)
'c) get the 2nd last column number of cell values > 0
Dim i As Long
If Not IsError(cols) Then
If UBound(cols) > 1 Then i = cols(UBound(cols) - 1)
End If
'd) display result
If i > 0 Then
Debug.Print "Found at column #" & i & ": " & Cells(1,i).Address
Else
Debug.Print "Invalid column number " & CStr(i)
End If
End Sub
VB 编辑器的即时窗口中的示例结果
Found at column #9: $I$1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。