Excel vba 仅自动填充空单元格
Posted
技术标签:
【中文标题】Excel vba 仅自动填充空单元格【英文标题】:Excel vba Autofill only empty cells 【发布时间】:2017-01-23 16:03:29 【问题描述】:我有一列 A 的数据最多为 A300。
在此范围内,这些单元格中有些是空的,有些包含值。
在 VBA 中,我设置单元格 A1 的公式,然后使用自动填充功能将其设置在我的列中(最多 A300),如下所示:
ws.Range("A1").Select
Selection.AutoFill Destination:=ws.Range(ws.Cells(1, 1), ws.Cells(300, 1))
我的问题是某些单元格上包含的数据也被删除了!我正在尝试自动填充,但只能通过空单元格。
我试图像这样在我的工作表上添加一个过滤器:
ws.Range("$A$1:$A$300").AutoFilter Field:=1, Criteria1:="="
然后我重用了自动填充功能,但它似乎填充了过滤后的单元格......
我们不能在自动填充功能中添加“仅清空单元格”之类的参数吗?像这样的:
Selection.AutoFill Destination:=ws.Range(ws.Cells(1, 1), ws.Cells(300, 1)), Criteria1:="="
感谢您的回复!
【问题讨论】:
你想用什么来填充它们?静态的还是渐进的价值观?请参阅带有 xlCellTypeBlanks 的 Range.SpecialCells method。 我还有一个关于“SpecialCells(xlCellTypeBlanks)”的问题。结果是如果复制然后粘贴一个空单元格,这些单元格不再被视为空白单元格,并且此代码未选择它(但此单元格仍然为空),这是 SpecialCells(xlCellTypeBlanks)的已知问题。所以即使我有一个空白单元格,我也会收到错误“没有单元格匹配”。你知道这个问题的任何解决方案吗? 【参考方案1】:数据如下:
我会做一个单独的副本而不是填写:
Sub luxation()
Range("A1").Formula = "=ROW()"
Dim rDest As Range
Set rDest = Intersect(ActiveSheet.UsedRange, Range("A1:A300").Cells.SpecialCells(xlCellTypeBlanks))
Range("A1").Copy rDest
End Sub
结果如下:
注意:
公式复制后会调整。
编辑#1:
请注意,在某些情况下此代码不起作用。 UsedRange
可能没有向下延伸到单元格 A300。
例如,如果工作表完全为空,除了 A1 中的公式和 A3 中的某些值。在这种情况下,Rdest
将只包含单个单元格 A2。代码将保持 A4 到 A300 不变。
【讨论】:
感谢您的回答,这正是我所需要的。对于“usedRange”,我已经遇到了问题。当您删除某些数据或其他数据时,它似乎不会重新计算,但我可以在不使用 usedrange 的情况下这样做。再次感谢! 我还有一个关于“SpecialCells(xlCellTypeBlanks)”的问题。结果是如果复制然后粘贴一个空单元格,这些单元格不再被视为空白单元格,并且此代码未选择它(但此单元格仍然为空),这是 SpecialCells(xlCellTypeBlanks)的已知问题。所以即使我有一个空白单元格,我也会收到错误“没有单元格匹配”。你知道这个问题的任何解决方案吗?【参考方案2】:假设您想要静态值,我会使用循环。下面的一个将用便便填充所有空单元格:
Sub AllFillerNoKiller()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
For Each c In ws.Range("A1:A300")
If c.Value = "" Then c.Value = "poop"
Next
End Sub
【讨论】:
谢谢,您的代码适用于 A1:A300 范围,但我使用的是作为示例,我的真实工作簿将有超过 10k 行,我会避免循环。但是感谢您的帮助!【参考方案3】:抱歉,我没听懂你的问题 - 想用 A1 中的值填充所有空白单元格吗? - 给你:
Sub Replace()
If Trim(Range("A1").Value) = "" Then
MsgBox "There's no value in A1 to copy so there's nothing to copy to all blank cells", vbInformation, "Nothing in A1"
Exit Sub
Else
Range("A1:A300").SpecialCells(xlCellTypeBlanks).Select
Selection.Value = Range("A1").Value
End If
End Sub
【讨论】:
谢谢这是更简单的答案! 我还有一个关于“SpecialCells(xlCellTypeBlanks)”的问题。结果是如果复制然后粘贴一个空单元格,这些单元格不再被视为空白单元格,并且此代码未选择它(但此单元格仍然为空),这是 SpecialCells(xlCellTypeBlanks)的已知问题。所以即使我有一个空白单元格,我也会收到错误“没有单元格匹配”。你知道这个问题的任何解决方案吗? 不完全确定问题出在哪里.. 第一行找到所有空单元格并选择它们,第二行将 A1 中的值输入到选定的单元格中,所以不可能......除非你单元格中有一个不被视为空白的空格(“”) - 这是怎么回事? 我使用的公式在单元格上放一个值,或者放“”。所以第一次,我的单元格是空的,然后公式把“”放在上面。第二次我通过错误运行我的宏结果。基本上,VBA 认为带有“”的单元格不是空白。空白单元格是未初始化的单元格。把“”放到一个单元格中初始化它。 specialcells(xlCellTypeBlanks) 不会将初始化的空单元格视为空白单元格,因此会导致错误... 如果你能看懂法语,这个话题可以清晰地解释问题:developpez.net/forums/d526009/logiciels/microsoft-office/excel/…【参考方案4】:您也可以使用以下代码:
stAddress = Sheet1.Range("A1").CurrentRegion.SpecialCells(xlCellTypeBlanks).Address
Sheet1.Range(st).Value = "Empty"
【讨论】:
感谢此代码也有效,即使它比杰里米的答案更复杂。谢谢顺便说一句! 我还有一个关于“SpecialCells(xlCellTypeBlanks)”的问题。结果是如果复制然后粘贴一个空单元格,这些单元格不再被视为空白单元格,并且此代码未选择它(但此单元格仍然为空),这是 SpecialCells(xlCellTypeBlanks)的已知问题。所以即使我有一个空白单元格,我也会收到错误“没有单元格匹配”。你知道这个问题的任何解决方案吗?以上是关于Excel vba 仅自动填充空单元格的主要内容,如果未能解决你的问题,请参考以下文章