VBA - 使用 SpecialCells.Copy 后 PasteSpecial 不起作用

标签 vba excel autofilter

总而言之,我尝试将一些过滤后的数据从工作簿 A 复制到工作簿 B,并保持工作簿 B 的格式。

这是我的代码的相关部分:

With originSheet
    .AutoFilterMode = False
    With .Range("A7:AA" & lastRowOriginSheet)
        .AutoFilter Field:=2, Criteria1:=projectNumber
        .SpecialCells(xlCellTypeVisible).Copy
    End With
End With
destinationSheet.Range("B4").PasteSpecial xlPasteValues

特殊粘贴不起作用,这是使用的工作簿 A 的格式。

<小时/>

已解决:

问题是您不能在不连续的范围内使用 PasteSpecial。

所以我采用了 Siddharth Rout 的解决方案来遍历过滤范围的所有区域:

        With originSheet
            .AutoFilterMode = False

            With .Range("A7:AA" & lastRowOriginSheet)
                .AutoFilter Field:=2, Criteria1:=projectNumber

                Set filteredRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible)

                '~~> Loop through each area
                For Each area In filteredRange.Areas
                    With destinationSheet
                        '~~> Find Next available row
                        lRow = .Range("B" & .Rows.Count).End(xlUp).Row + 1

                        area.Copy
                        destinationSheet.Range("B" & lRow).PasteSpecial xlPasteValues
                    End With
                Next area
            End With
        End With

最佳答案

@Jeeped 提到的非常正确,如果过滤范围是非连续,则不能在过滤范围上使用选择性粘贴。但是有一种方法可以实现您想要的:)

您必须循环遍历过滤范围的每个区域,然后使用选择性粘贴,如下所示

Sub Sample()
    Dim ws As Worksheet
    Dim lastRowOriginSheet As Long
    Dim filteredRange As Range, a As Range
    Dim projectNumber As Long

    '~~> I have set these for testing. Change as applicable
    projectNumber = 1
    Set ws = Sheet1
    Set destinationSheet = Sheet2
    lastRowOriginSheet = 16

    With ws
        .AutoFilterMode = False

        With .Range("A7:AA" & lastRowOriginSheet)
            .AutoFilter Field:=2, Criteria1:=projectNumber

            Set filteredRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible)

            '~~> Loop through each area
            For Each a In filteredRange.Areas
                With destinationSheet
                    '~~> Find Next available row
                    lRow = .Range("B" & .Rows.Count).End(xlUp).Row + 1

                    a.Copy
                    destinationSheet.Range("B" & lRow).PasteSpecial xlPasteValues
                End With
            Next a
        End With
    End With
End Sub

实际行动 enter image description here

关于VBA - 使用 SpecialCells.Copy 后 PasteSpecial 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44547011/

相关文章:

excel - 使用 Target.Address 的有效替代方案

vba - 在多列列表框中添加行

excel - VBA:返回超过 2 个过滤条件

arrays - 隐藏重复的单元格而不使用辅助列

excel - 有没有办法在 Excel VBA 中同时对多个列运行自动筛选?

excel - 使用宏设置 Excel 数据连接 (csv)

vba - 如何从带有参数的按钮调用函数

vba - 搜索工作簿并在不打开它的情况下提取数据excel vba

linux - 读取/解析 XLSX 文件,保留字体

html - 使用 XLSX Angular 导出到 excel 时如何保持文本格式(无格式)