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。代码将保持 A4A300 不变。

【讨论】:

感谢您的回答,这正是我所需要的。对于“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 仅自动填充空单元格的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel VBA 中对一系列单元格使用自动填充

如何使用 VBA 根据活动工作表中的单元格自动填充 Excel 表单?

自动填充中断一条记录 [Excel-VBA]

Excel VBA:用相邻的单元格值填充空单元格

Excel技巧空单元格自动填充上一单元格内容

Excel技巧空单元格自动填充上一单元格内容