一个单元格更新后,使用数据自动填充列

时间:2016-01-15 23:44:40

标签: excel vba excel-vba

如果列中的一个单元格已填满,如何使用0' s自动填充列?

示例:

原始表

Original Table

我在四月专栏的任何单元格中输入一个数字... enter image description here

我希望该列用0' s自动填充其余的单元格,如下所示... enter image description here

我的第一个想法是使用像这样的Worksheet_Change事件......

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("H6:H16") 'H6 to H16 is the range of the April column, I would repeat this for each column in a loop

If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
    Range("H6:H16").Value = 0 
End If
End Sub

但这会覆盖整个列,而我想保留原始值。

Excel是否有某种方法可以准确返回更改的单元格,以便我可以更改该列中除该单元格之外的所有单元格的值?或者还有另一种更简单的方法吗?

3 个答案:

答案 0 :(得分:4)

只是想出一个可能的非vba方式去做这件事。您可以先用零填充所有单元格:

enter image description here

然后从A2开始,突出显示范围" A2:L12"并转到主页 - >条件格式 - >新规则 - >使用公式确定要格式化的单元格并插入公式:

=COUNTIF(A$2:A$12,">0")=0

enter image description here

然后转到格式 - >字体并将字体颜色更改为白色(另一种选择,可能更好一种,将数字格式更改为自定义,类型为{ {1}}如Jeeped所建议的那样。

enter image description here

按几次OK后退出条件格式规则管理器,您的工作表应如下所示:

enter image description here

向单元格添加大于零的值后,您将看到列中的所有零。

enter image description here

由于您输入的值必须大于零,因此您尝试执行的操作可能无法接受此方法,但我认为如果您觉得可以使用它,我会发布它。

答案 1 :(得分:1)

随着4月在H6:H16,您的数据范围似乎在E6:P16。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("E6:P16")) Is Nothing Then
        On Error GoTo bm_Safe_exit
        Application.EnableEvents = False
        Dim tgt As Range, var As Variant
        For Each tgt In Intersect(Target, Range("E6:P16"))
            With Cells(6, tgt.Column).Resize(11, 1)
                If Application.Count(.Cells) = 1 Then
                    var = tgt.Value
                    .Cells = 0
                    tgt = var
                End If
            End With
        Next tgt
    End If
bm_Safe_exit:
    Application.EnableEvents = True
End Sub

在将值写入工作表之前始终禁用事件处理,否则您将触发另一个Worksheet_Change事件宏,该宏在原始事件之上运行,可能会触发一系列事件。

答案 2 :(得分:0)

Heres是我的答案,希望能给予一些帮助。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r
    Dim c
    Dim keyCells As Range
    Dim i

    r = Target.Row
    c = Target.Column
    'January in column E = 5
    'December in column P = 16
    Set keyCells = Range(Cells(6, c), Cells(16, c))

    If c >= 5 And c <= 16 Then ' if target is between the columns
        If r >= 6 And r <= 16 Then ' if the target is between the rows
            For Each i In keyCells
                If Not i.Address = Target.Address Then
                    Application.EnableEvents = False
                    i.Value = 0
                    Application.EnableEvents = True
                End If
            Next i
        End If
    End If
End Sub