我有一个Excel工作表,A列应该在A4和~A50之间自动分数(取决于有多少客户端,但通常它在41-43左右,最多45个)当我添加一个新的行。
例如:A4的值为1,A5有2,A6有3等,直到A43的值为40.我想在中间的某处添加一个新行,数字应该相应改变... ,总客户数增加了,所以现在单元格A44保持新的数字41。
我搜索谷歌并发现,我必须为此编写一个VB宏(是真的,能否以更简单的方式解决?Excel是如此强大,但它可以'这样做?)它有点工作。但是,当我尝试添加一个新行时,它的行为不正确,表格末尾的数字有点混乱而且它没有正确计算:
它总是在同一个区域,数字38不会切换到39.不幸的是,我的VB技能非常有限,而且它们已经是5年前,当我上次使用它时。这是脚本:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cntClients As Integer
Dim lastCell As Integer
Dim startNum As Integer
Dim startRow As Integer
cntClients = WorksheetFunction.CountA(Range("A4:A60"))
lastCell = cntClients + 3
startNum = 1
startRow = 4
Application.EnableEvents = False
Do While startRow <= cntClients
Range("A" & startRow).Value = startNum
startRow = startRow + 1
startNum = startNum + 1
Loop
Range("A" & lastCell) = cntClients
Application.EnableEvents = True
End Sub
我希望我清楚地了解我的观点,如果有一个更容易解决这个问题的方法,一个可能不使用宏的方法,请告诉我!
如果您需要任何进一步的信息,我很乐意为他们提供!
编辑:此外,当我删除新添加的行时,数字也不会正确更改,如下所示:
不知何故,宏不喜欢数字39
答案 0 :(得分:2)
您正在使用lastCell = cntClients + 3
补偿第4行的开始,但从不使用补偿值。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cntClients As Integer
Dim lastCell As Integer
Dim startNum As Integer
Dim startRow As Integer
cntClients = WorksheetFunction.CountA(Range("A4:A60"))
lastCell = cntClients + 3
startNum = 1
startRow = 4
Application.EnableEvents = False
Do While startRow <= lastCell 'cntClients <~~ this. not that.
Range("A" & startRow).Value = startNum
startRow = startRow + 1
startNum = startNum + 1
Loop
Application.EnableEvents = True
End Sub
我还删除了一条有同样问题的不必要的行。
答案 1 :(得分:2)
没有VBA:
如果您将数据表变为TABLE
(可以使用Insert/Table
方法),则可以使用公式,例如
A4: =ROW()-3
并填写。
当您随后插入或删除行时,公式将传播,数字将正确调整。
答案 2 :(得分:0)
使用AGGREGATE函数(excel2010及更高版本):
数组形式 AGGREGATE(function_num,options,array,[k])
=AGGREGATE(4,5,$A$1:A1)+1
function_num -- 4 (MAX)
options -- 5 (Ignore hidden rows)