Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 基于列值的排名粘贴结果_Excel_Vba - Fatal编程技术网

Excel 基于列值的排名粘贴结果

Excel 基于列值的排名粘贴结果,excel,vba,Excel,Vba,我有这个代码,它的工作非常完美。我一直面临的问题是,代码没有根据等级粘贴结果 我想将第一个1添加到排名最高的值,然后再添加到第二名,然后再添加到第三名,依此类推。。。最后一个1将添加到排名最低的值中 代码将在范围内找到它们的排名,基于该排名,在其旁边的列中添加1。执行此操作,直到将1添加到每个单元格(0除外) 我知道对于最后的结果,排名并不重要。但有必要添加秩逻辑 你的帮助将不胜感激 Sub SlowRange() Dim LastRow As Long LastRow = S

我有这个代码,它的工作非常完美。我一直面临的问题是,代码没有根据等级粘贴结果

我想将第一个
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
Sub slogrange()
最后一排一样长
LastRow=Sheet1.单元格(Sheet1.Rows.Count,1).结束(xlUp).行
尺寸rg作为范围:设置rg=图纸1。范围(“A2:A”和最后一行)
调光范围
对于rg.单元格中的每个c
如果c.值为0,则
c、 偏移量(,1)。值=1
”“否则呢
'c.偏移量(,1).值=空
如果结束
下一个c
端接头
请尝试此代码

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/1000000000(=10^10)添加到每个数字。这应该是一个不重要的数字,但由于它与行号相乘,因此在第100000行中可能变得重要。这里的平衡取决于您有多少行以及数字中有多少位。对于0.0869652(7位),在第1000行之前应该还可以,但在第100000行,您可能希望切换到
10^12


平局不影响你原来的数字,只影响他们的排名。当同一数字出现不止一次时。

你是什么意思?比如,第一个最高的数字?那么,B14,B17,B3等等?是的,你是对的@Christofer WeberWait,那么如果它们都是1,那有什么意义呢?或者你想让它以从大到小的顺序变成1,2,3,4等等<代码>我知道对于最终结果,排名并不重要。但有必要添加排名逻辑,使其听起来像某种学校项目,否则这样做毫无意义。如果是的话,你不应该让其他人帮你做。问题是这件事可以通过排序功能来完成,但如何在没有排序的情况下做到这一点,我毕业已经有好几年了@Simoni在将一个赋值给B列的过程中还发生了什么?我使用了工作正常的代码,但它没有跳过0值@Variatus它不应该包含0值以对@Variatus进行排名。我已修改代码,使其不对零值进行排名。谢谢@Variatus