如果列中的一个单元格已填满,如何使用0' s自动填充列?
示例:
原始表
我希望该列用0' s自动填充其余的单元格,如下所示...
我的第一个想法是使用像这样的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是否有某种方法可以准确返回更改的单元格,以便我可以更改该列中除该单元格之外的所有单元格的值?或者还有另一种更简单的方法吗?
答案 0 :(得分:4)
只是想出一个可能的非vba方式去做这件事。您可以先用零填充所有单元格:
然后从A2开始,突出显示范围" A2:L12"并转到主页 - >条件格式 - >新规则 - >使用公式确定要格式化的单元格并插入公式:
=COUNTIF(A$2:A$12,">0")=0
然后转到格式 - >字体并将字体颜色更改为白色(另一种选择,可能更好一种,将数字格式更改为自定义,类型为{ {1}}如Jeeped所建议的那样。
按几次OK后退出条件格式规则管理器,您的工作表应如下所示:
向单元格添加大于零的值后,您将看到列中的所有零。
由于您输入的值必须大于零,因此您尝试执行的操作可能无法接受此方法,但我认为如果您觉得可以使用它,我会发布它。
答案 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