首页 > 解决方案 > 如何自动过滤然后仅复制和粘贴可见单元格

问题描述

我试图通过使用以下代码将形状分配给宏来基本上用名为“运算符”的工作表中的“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”方法只显示可见单元格(所以在自动过滤后,它会为我显示空白)但我不知道如何将它包含到我的代码中!以下屏幕截图是工作表最初的外观:(在此示例中,AN3AN5的单元格值将分别粘贴到AM3AM5中:

在此处输入图像描述

我的代码为任何空白单元格自动过滤列“AN”,然后尝试复制AN中的单元格并将可见单元格值粘贴到AM中 的单元格中结果应该如下:

在此处输入图像描述

标签: excelvbaautofilter

解决方案


这里不需要过滤;您可以只使用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当存在多个区域时,尝试进行价值转移将无法正常工作。

推荐阅读