如何仅自动过滤然后复制和粘贴可见单元格

时间:2020-01-16 18:42:05

标签: excel vba autofilter

我正在尝试通过分配形状来在名为“操作员”的工作表中使用列“ AN” 中的值基本上填充列“ AM” 中的任何空白单元格具有以下代码的宏。 请注意,An中的单元格中有一个方程式,因此我只想复制这些值。

Sub PendingChanges()

Range("AM1:AM10").CurrentRegion.AutoFilter Field:=1, Criteria1:="="

        Worksheets("Operator").Range("AM1:AM10").SpecialCells(xlCellTypeVisible).Value = Worksheets("Operator").Range("AN1:AN10").Value

    Selection.AutoFilter Field:=1

End Sub

我知道有一个“ SpecialCells”方法仅显示可见的单元格(因此在自动过滤之后,它将为我显示空白),但是我不确定如何将其包含在我的代码中! 以下屏幕快照是工作表最初的外观:(在本示例中, AN3 AN5 的单元格值将粘贴到 AM3 AM5

enter image description here

我的代码为所有空白单元格自动过滤“ AN” 列,然后尝试复制 AN 中的单元格并将可见的单元格值粘贴到 AM < / strong> 结果应为以下内容:

enter image description here

2 个答案:

答案 0 :(得分:2)

无需在此处过滤;您可以只使用SpecialCells(xlCellTypeBlanks),然后对结果使用Offset来引用相同的行,但要在“ AN”列中。

Sub PendingChanges()

    On Error Resume Next
    Dim blankCells as Range
    Set blankCells = Worksheets("Operator").Range("AM1:AM10").SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0

    If Not blankCells Is Nothing Then
        Dim rng as Range
        For Each rng in blankCells.Areas
            rng.Value = rng.Offset(,1).Value
        Next
    End If

End Sub

一些注意事项:

  • 需要On Error Resume NextOn Error GoTo 0,因为如果没有空格,则SpecialCells(xlCellTypeBlanks)调用将失败。它们会暂时禁用然后重新启用错误处理。
  • Areas是不连续范围内的每个不同区域。例如,如果blankCells指向AM2AM4:AM5,则AM2是第一个区域,AM4:AM5是第二个区域。
  • 您需要遍历这些区域,因为当存在多个区域时,尝试进行价值转移.Value = .Value不会正确进行。

答案 1 :(得分:0)

您不需要制作过滤器,而是在下一列中填写空白 您可以尝试下面的代码,它可以直接解决您的问题。

[VBA]
Sub test()
Dim rBlanks As Range

Set rBlanks = Nothing
With ThisWorkbook.Sheets("Operator")
On Error Resume Next
Set rBlanks = Intersect(.Range("AM:AM"), .UsedRange).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0

If Not rBlanks Is Nothing Then
rBlanks.FormulaR1C1 = "=RC[1]"
Intersect(.Range("AM:AM"), .UsedRange).Copy
.Range("AM1").PasteSpecial (xlPasteValues)
Application.CutCopyMode = False
End If
End With

End Sub
[/VBA]