自动更改Excel

时间:2016-01-04 10:43:14

标签: excel excel-vba vba

我有一个Excel工作表,A列应该在A4和~A50之间自动分数(取决于有多少客户端,但通常它在41-43左右,最多45个)当我添加一个新的行。

例如:A4的值为1,A5有2,A6有3等,直到A43的值为40.我想在中间的某处添加一个新行,数字应该相应改变... ,总客户数增加了,所以现在单元格A44保持新的数字41。

我搜索谷歌并发现,我必须为此编写一个VB宏(是真的,能否以更简单的方式解决?Excel是如此强大,但它可以'这样做?)它有点工作。但是,当我尝试添加一个新行时,它的行为不正确,表格末尾的数字有点混乱而且它没有正确计算:

Excel numeration problem

它总是在同一个区域,数字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

我希望我清楚地了解我的观点,如果有一个更容易解决这个问题的方法,一个可能不使用宏的方法,请告诉我!

如果您需要任何进一步的信息,我很乐意为他们提供!

编辑:此外,当我删除新添加的行时,数字也不会正确更改,如下所示:

Excel problem 2

不知何故,宏不喜欢数字39

3 个答案:

答案 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)