【问题标题】:Excel VBA : Auto Generating Unique Number for each rowExcel VBA:为每一行自动生成唯一编号
【发布时间】:2016-05-01 10:37:31
【问题描述】:

我要求使用从某个值(例如 1000)开始的唯一编号自动填充行。

  • 工作表有 2 列。

  • 当我在每行的第二列中填充一个值时,第一列应该自动填充。

  • 我已经填写了 3 行(1000,1001,1002)。

  • 现在,如果我删除自动生成值为 1001 的中间行,最初值为 1002 的行将自动更新为 1001。

  • 但根据我的要求,该值应保持唯一(应保持为 1002)。

我使用的公式是:

=IF(B2<>"",COUNTA($B$2:B2)+999,"")

我的excel在删除值之前是这样的:

Test_Case_Id    Name
1000             a
1001             b
1002             c

删除中间一行后变成:

Test_Case_Id    Name
1000             a
1001             c

预期结果:

Test_Case_Id    Name
1000             a
1002             c

请帮帮我。

谢谢, 韦维克

【问题讨论】:

  • 填写表格后,将公式更改为值然后删除不会影响

标签: excel excel-2010 excel-2007 vba


【解决方案1】:

您使用 VBA 进行了标记,但您没有使用 VBA。当工作表重新计算时,计算行数或使用当前行号的公式将始终更新。

为了实现你所描述的,你真的需要VBA。一个简单的工作表更改事件应该可以做到。按照以下思路思考

Private Sub Worksheet_Change(ByVal Target As Range)
Dim maxNumber
If Not Intersect(Target, Range("B:B")) Is Nothing Then
' don't run when more than one row is changed
    If Target.Rows.Count > 1 Then Exit Sub
' if column A in the current row has a value, don't run
    If Cells(Target.Row, 1) > 0 Then Exit Sub
' get the highest number in column A, then add 1 and write to the
' current row, column A
    maxNumber = Application.WorksheetFunction.Max(Range("A:A"))
    Target.Offset(0, -1) = maxNumber + 1
End If
End Sub

复制代码,右键单击工作表选项卡,选择“查看代码”并粘贴到代码窗口中。

这是删除 ID 为 1002 的行之前和之后的屏幕截图:

【讨论】:

  • 有了这个 VBA,只有自动增量可以正常工作。不满足删除前行计数值后具有相同值的要求。
  • 什么意思?如果删除了一行,剩余的数字将保持不变并且不进行调整。这就是您在问题的“预期结果”中显示的内容。
  • 我添加了一个截图。请根据要求告诉我什么不起作用。
  • 嗨。这都是我的错。我已将宏与公式一起使用,因此它的行为不同。宏运行正常。谢谢。
  • 感谢您的反馈并接受我的回答。
【解决方案2】:
Sub abc()
Dim a As Integer
Dim b As Integer
Dim i As Integer
Dim z As Integer

i = 1
Set sh = ThisWorkbook.Sheets("Sheet1") 'instead of sheet1 you can add name of your sheet
Dim k As Long
k = 2
Set rn = sh.UsedRange
k = rn.Rows.Count

Cells(1, 1).Value = 1001


Do Until i = k

b = (Cells(i, 1).Value)
a = b + 1
i = i + 1

Cells(i, 1).Value = a

Loop
End Sub

不确定是否需要宏。您可以将此宏添加到您的文件中。 即使你删除了单元格,一旦你再次运行宏,当前单元格的值将是上面单元格的值加一,所以一切都将按照系列。谢谢

【讨论】:

  • 您的键盘是否有用于,(逗号)和.(点或句号)的键?如果是这样,你为什么不使用它们?标点符号的发明是为了使书面交流易于理解。它告诉你的读者一个句子在哪里结束或在哪里插入停顿。省略标点符号会呈现一堵难以理解的文字墙。你的解释是一团糟。
  • 对不起@teylyn 感谢您的反馈
  • 对于自动增量,我提到的单行公式效果很好。我的主要要求是每一行都有唯一的价值。当我删除一行时,下一行的 id 不应该被修改。谢谢。
  • 如果您愿意,您可以添加一个按钮并将宏与其关联,因此所有这些工作只需单击一下即可完成。列中的所有单元格都保持唯一并且根据系列也是如此。
  • @Vevek 您需要在删除后再次运行 Vba ....==> 在第二列输入数据。试试这些步骤 (1) 运行宏 (2) 删除行 (3) 再次运行宏
【解决方案3】:

如果您使用以下方法创建唯一 ID 会怎样?

=TEXT(NOW(),"YYYYMMDD-") & TEXT(1,"0000")

20210728-0001 任务0001 20210728-0002 任务0002 20210728-0003 任务0003

但是现在需要删除 0002 项目

唯一 ID # 如何保留在相关任务中

20210728-0001 任务0001 20210728-0003 任务0003

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多