用于更改ID值的Excel宏

时间:2014-02-14 19:25:54

标签: excel excel-vba vba

  

例如:

  • 695678需要为1
  • 695678需要为1
  • 695678需要为1
  • 695678需要为1
  • 695683需要2
  • 695683需要2
  • 695683需要2
  • 696217需要3
  • 696217需要3

我得到了这个ID的列表(每个数字对应一个人)然而这些数字例如695678,695683,696217不会上升一个。他们都从低到高排名。有没有办法自动将这些值更改为1,2,3,...等等,方法是将最低值更改为1,将第二个最小值更改为2,依此类推。 (无法弄清楚如何用宏来做)

需要注意的是,ID会重复,因为这些人进行了多次交易。

谢谢!

4 个答案:

答案 0 :(得分:3)

如果您需要 VBA 解决方案,则:

Sub Renumber()
    Dim N As Long, I As Long, OldValue As Long
    Dim K As Long
    K = 1
    N = Cells(Rows.Count, "A").End(xlUp).Row
    OldValue = Cells(1, 1).Value
    For I = 1 To N
        If Cells(I, 1).Value = OldValue Then
            Cells(I, 1).Value = K
        Else
            OldValue = Cells(I, 1).Value
            K = K + 1
            Cells(I, 1) = K
        End If
    Next I
End Sub

答案 1 :(得分:0)

请尝试:

=IF(ISBLANK(A1),1,IF(A1=A2,B1,B1+1))  

向下复制到适合(在顶行数据中有空白)。

为了澄清,假设数据在ColumnA中但从A2开始(A1和B1为空白),则上面的公式放在B2中并向下复制以适应。

首先测试的是A1是否为空(如果为True,则返回1起点 - 尽管这可以键入B2,然后在B3中使用更简单的公式,依此类推)。如果A1不是空白,则进一步测试,无论该值是否已更改。如果它没有(True),则使用上面的值,如果它已经改变(False),则使用上面增加1的值。

答案 2 :(得分:0)

另一个公式包含您的数据需要未分类,并且应该比任何宏更快:

=SUMPRODUCT( (FREQUENCY($A$1:$A$9, $A$1:$A$9) > 0) * (A1 >= $A$1:$A$10) )

答案 3 :(得分:0)

@ Gary的学生,你的解决方案接近完美,我调查了这个并添加了一个小的修正,编译它会给出一个运行时错误,你的K值为1,而在你的else子句中它只是再次采用相同的值。

将其调整为excel文件后,它完美无缺:

Sub Renumber()
Dim N As Long, I As Long, OldValue As Long
Dim K As Long
K = 1
N = Cells(Rows.Count, 2).End(xlUp).Row
OldValue = Cells(2, 2).Value
For I = 2 To N
    If Cells(I, 2).Value = OldValue Then
        Cells(I, 2).Value = K
    Else
        OldValue = Cells(**I + 1**, 2).Value
        K = K + 1
        Cells(I, 2) = K
    End If
Next I
End Sub

**之间的I + 1是窃听的部分。 我也相应地更改了单元格索引。

亲切的问候,

大卫