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
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
2条答案
按热度按时间omtl5h9j1#
很容易得到一列的最大数,只需使用
WorksheetFunction.Max
函数。现在你要做的就是把这个逻辑放入工作表的
Change
-Event中,检查输入的数据是否是表格的一部分(表格在VBA中称为ListObject
),以及该行的ID列是否为空,如果是,把最大ID + 1放入ID列。当您使用Cut&Paste添加数据时(因此一次输入多个值),change事件只触发一次,所以我添加了一个循环来处理所有修改过的单元格。
把下面的代码放到包含表格的工作表的 Worksheet 模块中。我假设工作表只包含一个表格,ID列是第7列(你的图像很难辨认),也许你必须根据需要修改代码。
nzk0hqpo2#
我有下面的代码,我用在这里的东西:
如果将
"B:B"
的column_to_check范围更改为索引值所在的列("G:G"
?),我认为它将满足您的需要。