微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找最后一个大于 0 的单元格

如何解决查找最后一个大于 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,然后一直这样做直到跳过 >01 并打印地址 I1 作为结果。>

enter image description here

由于这个从右到左循环,它应该比你的代码更快地找到结果(在大多数情况下)。

,

替代使用 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 举报,一经查实,本站将立刻删除。