excel 新建行时自动在单元格中插入整数

knpiaxh1  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(150)

我尝试了很多方法来实现这个功能,但是所有的方法(SEQUENCE、ROW()、Fill等)都不能保持历史记录--我想我可能需要一点VBA来实现这个功能。当插入一个新行时,我如何检查一列中的所有整数并产生下一个序列,以便在对工作表排序时,编号序列保持静态?例如,请参见下面的示例:
我有一个包含EMP_ID字段的表,当我插入一个新行时,它应该检查存在哪些值,然后插入下一个连续值(51)并保持静态。

omtl5h9j

omtl5h9j1#

很容易得到一列的最大数,只需使用WorksheetFunction.Max函数。
现在你要做的就是把这个逻辑放入工作表的Change-Event中,检查输入的数据是否是表格的一部分(表格在VBA中称为ListObject),以及该行的ID列是否为空,如果是,把最大ID + 1放入ID列。
当您使用Cut&Paste添加数据时(因此一次输入多个值),change事件只触发一次,所以我添加了一个循环来处理所有修改过的单元格。
把下面的代码放到包含表格的工作表的 Worksheet 模块中。我假设工作表只包含一个表格,ID列是第7列(你的图像很难辨认),也许你必须根据需要修改代码。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Const IDCol = 7

    Dim cell As Range
    For Each cell In Target
        If Not Intersect(Me.ListObjects(1).Range, cell) Is Nothing Then    ' Cell is part of the table
            If Not IsEmpty(cell.Value) And cell.Column <> IDCol And IsEmpty(Me.Cells(cell.row, IDCol)) Then
                Dim maxID As Long
                maxID = WorksheetFunction.Max(Me.Columns(IDCol).EntireColumn)
                Me.Cells(cell.row, IDCol) = maxID + 1
            End If
        End If
    Next
End Sub
nzk0hqpo

nzk0hqpo2#

我有下面的代码,我用在这里的东西:

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim c As Range, checkrange As Range, last_used_index As Long, column_to_check As Long

    column_to_check = Me.Range("B:B").Column
    
    Set checkrange = Intersect(Target, Me.Columns(column_to_check).EntireColumn, Me.UsedRange)
    
    If Not checkrange Is Nothing Then
        last_used_index = WorksheetFunction.Max(Me.Columns(column_to_check).EntireColumn)
        For Each c In checkrange
            If IsEmpty(c.Value) Then
                last_used_index = last_used_index + 1
                Me.Cells(c.Row, column_to_check) = last_used_index
            End If
        Next
    End If
End Sub

如果将"B:B"的column_to_check范围更改为索引值所在的列("G:G"?),我认为它将满足您的需要。

相关问题