【问题标题】:Paste result based on the Rank of Column values根据列值的排名粘贴结果
【发布时间】:2021-04-27 08:50:33
【问题描述】:

我有这段代码,它工作得很好我一直面临的问题是代码没有根据排名粘贴结果。

我想将第一个 1 添加到排名最高的值,然后添加到第二高然后第三高等等...最后一个 1 将添加到排名最低的值.

代码将在该范围内找到它们的排名,根据该排名在其旁边的列中添加 1。这样做直到每个单元格都加 1(0 除外)。

我知道对于最终结果,排名无关紧要。但是需要添加排名逻辑。

您的帮助将不胜感激。

Sub SlowRange()

    Dim LastRow As Long
    LastRow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row
    Dim rg As Range: Set rg = Sheet1.Range("A2:A" & LastRow)
    
    Dim c As Range
    For Each c In rg.Cells
        If c.Value <> 0 Then
            c.Offset(, 1).Value = 1
        'Else
        '    c.Offset(, 1).Value = Empty
        End If
    Next c

End Sub

【问题讨论】:

  • 排名是什么意思?比如,最高的数字在前?那么,B14 然后 B17 然后 B3 等等?
  • 是的,你是对的@Christofer Weber
  • 等等,如果它们都是 1,那有什么意义呢?还是您希望它按从大到小的顺序排列 1、2、3、4 等? I know for the final result, the rank doesn't matter. But it is necessary to add the rank logic 听起来像是某种学校项目,否则这样做毫无意义。如果是这样,你不应该让其他人为你做这件事。
  • 重点是这件事可以通过排序功能来完成,但是如何在没有排序的情况下做到这一点,我毕业已经好几年了。 @西蒙
  • 在将一个分配给 B 列之间是否发生了其他事情?

标签: excel vba


【解决方案1】:

请试试这个代码。

Sub WriteRanks()
    ' 226 - 27 Apr 2021
    
    Dim Rng         As Range            ' range to rank
    Dim Arr         As Variant          ' numbers to rank
    Dim ArrNew      As Variant          ' tie-broken Ar
    Dim Ct          As Long             ' temporary column
    Dim R           As Long             ' loop counter: array rows
    
    Application.ScreenUpdating = False
    With Worksheets("Sheet1")           ' change to suit
        ' from row 2 in column A to the end of column A
        Set Rng = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp))
        Arr = Rng.Value
        ReDim ArrNew(1 To UBound(Arr))
        For R = 1 To UBound(Arr)
            ' add a tie breaker: 10th digit
            ArrNew(R) = Arr(R, 1) + (R / (10 ^ 10))
        Next R
        
        With .UsedRange                 ' find a blank column on the right
            Ct = .Column + .Columns.Count
        End With
        Set Rng = Rng.Offset(0, Ct)
        Rng.Value = Application.Transpose(ArrNew)    ' fill the helper column
        
        For R = 1 To UBound(Arr)
            If Arr(R, 1) Then .Cells(R + 1, "B").Value = WorksheetFunction.Rank(ArrNew(R), Rng, 0)
        Next R

        ' delete the helper column
        .Columns(Rng.Column).EntireColumn.Delete
    End With
    Application.ScreenUpdating = False
End Sub

请注意,决胜局将 R * 1/10000000000 (=10 ^ 10) 添加到每个数字。这应该是一个无关紧要的数字,但由于它乘以行​​号,它可能在第 100,000 行变得重要。这里的余额取决于您有多少行以及您的数字中有多少位。使用 0.0869652(7 位)直到第 1,000 行应该仍然可以,但在第 100,000 行,您可能希望切换到 10 ^ 12

决胜局不会影响您的原始数字,只会影响它们的排名。当相同的数字出现多次时。

【讨论】:

  • 我使用了完美运行的代码,但它没有跳过 0 值。 @Variatus
  • 它不应该包含排名@Variatus的0值
  • 我已修改代码以不对零值进行排名。
猜你喜欢
  • 2017-07-29
  • 1970-01-01
  • 2022-11-28
  • 2017-09-21
  • 1970-01-01
  • 2020-05-07
  • 2021-11-26
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多