忽略否定。排名函数VBA中的值

时间:2018-12-09 21:42:10

标签: excel vba excel-vba

我有一个很大的文件,我想将所有值放在一列中,其中值“ 0”将给我排名第一。到目前为止没有问题。主要问题是我也有负数,只要我有这些负数,它们的排名就总是比“ 0”或任何其他数字“低”。

无论如何,是否要从.Rank函数中排除负数?

我可以给他们一个占位符数字,但这不能达到目的,因为我想在多个“等级”上运行此代码,并且我还需要“真实”数字进行其他计算。

剥离了一些代码,这基本上是我现在运行的代码:

Sub test()
lastrow = Worksheets("Sheet").Range("A65536").End(xlUp).Row
Dim Lista As Range
Set Lista = Sheets("Sheet").Range("A1:A100")


For i = 1 To lastrow
    irRanking = WorksheetFunction.Rank_Eq(Worksheets("Sheet").Cells(i,1) 
.Value, Lista, 1)
    Worksheets("Sheet").Cells(i, 4).Value = irRanking
Next i
End Sub

还是有另一种方法,跳过.Rank在一起?

还必须补充一点,我知道使用公式的可能性,但是我真的需要VBA中的解决方案

2 个答案:

答案 0 :(得分:0)

假设您的电话号码位于A2:AXX单元格中

=IF($A2>0,MATCH($A2,SMALL(IF($A$2:$A$XX>0,$A$2:$A$XX),ROW(INDIRECT("1:"&COUNTIF($A$2:$A$XX,">0")))),0),"")

答案 1 :(得分:0)

您可以计算负值,然后将此总数减去该排名:

Option Explicit

Sub test()
    Dim lastrow As Long, i As Long, nNegs As Long
    Dim Lista As Range

    With Worksheets("Sheet")
        lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set Lista = .Range("A1:A" & lastrow)
        For i = 1 To lastrow
            If Lista(i, 1) >= 0 Then .Cells(i, 4) = WorksheetFunction.Rank_Eq(Lista(i, 1), Lista, 1)
        Next i

        nNegs = WorksheetFunction.CountIf(Lista, "<0") ' count negative occurrences
        If nNegs > 0 Then 'if any
            Dim cell As Range
            For Each cell In Lista.Offset(, 3).SpecialCells(xlCellTypeConstants, xlNumbers) ' loop through ranks and correct them by subtratcing the number of negative values
                cell.Value = cell.Value - nNegs
            Next
        End If
    End With
End Sub