VBA - 仅将可见单元格从工作表复制到另一个工作表

Posted

技术标签:

【中文标题】VBA - 仅将可见单元格从工作表复制到另一个工作表【英文标题】:VBA - Copy only visible cells from sheet to another worksheet 【发布时间】:2019-01-11 16:43:17 【问题描述】:

我有工作表(“格式化数据”)和工作表(“Client_1 数据”)

我运行执行以下步骤的宏:

选择工作表(“Fromatted Data”) 自动过滤列“C”中值为“client_1”的数据 从工作表中复制选定的列(“格式化数据”)并将数据粘贴到工作表(“Client_1 数据”)

我的问题是什么:

不仅可以复制我过滤的数据,还可以复制所有数据,即使它们不可见。

我的宏代码:

Sub PRINT_AVIVA_ISA()

Sheets("Formatted Data").Select
ActiveSheet.Range("$A$1:$R$73").autofilter Field:=3, Criteria1:=Array( _
    "client_1"), Operator:=xlFilterValues

Dim LastRow As Long, erow As Long

LastRow = Worksheets("Formatted Data").Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To LastRow

Worksheets("Formatted Data").Cells(i, 2).Copy

        erow = Worksheets("Client_1 Data").Cells(Rows.Count, 1).End(xlUp).Row

        Worksheets("Formatted Data").Paste Destination:=Worksheets("Client_1 Data").Cells(erow + 1, 1) ' --- account number

        Worksheets("Formatted Data").Cells(i, 3).Copy

        Worksheets("Formatted Data").Paste Destination:=Worksheets("Client_1 Data").Cells(erow + 1, 2) ' --- designation

        Worksheets("Formatted Data").Cells(i, 4).Copy

        Worksheets("Formatted Data").Paste Destination:=Worksheets("Client_1 Data").Cells(erow + 1, 3) ' --- fund name

        Worksheets("Formatted Data").Cells(i, 5).Copy

        Worksheets("Formatted Data").Paste Destination:=Worksheets("Client_1 Data").Cells(erow + 1, 4) ' --- fund code

        Worksheets("Formatted Data").Cells(i, 7).Copy


    Next i
End Sub

我需要什么:

在我现有的代码中添加一些内容仅复制过滤后的数据

谢谢,

彼得。

【问题讨论】:

查看Range.SpecialCells() 我检查了这个并添加了 .SpecialCells(xlCellTypeVisible) 但它不起作用..我做错了什么。 【参考方案1】:

您遇到的问题是您正在遍历“格式化数据”工作表中的所有单元格。 VBA 代码不会检查单元格是否已被过滤。

我在下面附加了一些代码,它们应该可以完成您尝试做的事情。我进行了一些更改以对其进行一些清理,例如将工作表存储到它们自己的变量中,这样您就不必反复直接引用它们。

另外,我选择使用直接赋值而不是复制/粘贴。直接赋值通常更快,并且代码更简洁、更具自我描述性。权衡是它不会复制格式。如果你真的需要格式化,你可以添加一次(在例程的开始或结束,整个列)。

看看您是否可以修改以下代码,如果您需要更多帮助,请告诉我们。

Sub PRINT_AVIVA_ISA()
    Dim sData As Worksheet
    Dim sClient As Worksheet

    'Prevents the application from rendering graphical elements during processing
    Application.ScreenUpdating = False

    Set sData = Worksheets("Formatted Data")
    Set sClient = Worksheets("Client_1 Data")

    sData.Range("$A$1:$R$73").AutoFilter Field:=3, Criteria1:=Array( _
        "client_1"), Operator:=xlFilterValues

    LastRow = sData.Cells(Rows.Count, 1).End(xlUp).Row

    Dim i As Long

    For i = 2 To LastRow
        If sData.Rows(i).Hidden = False Then
            ' Rather than add 1 to erow 4 times later, just calculate it here
            erow = sClient.Cells(Rows.Count, 1).End(xlUp).Row + 1

            sClient.Cells(erow, 1).Value = sData.Cells(i, 2).Value
            sClient.Cells(erow, 2).Value = sData.Cells(i, 3).Value
            sClient.Cells(erow, 3).Value = sData.Cells(i, 1).Value
        End If
    Next i

    Application.ScreenUpdating = True

End Sub

【讨论】:

以上是关于VBA - 仅将可见单元格从工作表复制到另一个工作表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python(和 DataNitro)将单元格从一个 Excel 工作簿中的特定工作表复制到另一个 Excel 工作簿中的特定工作表

将单元格从打开的工作簿复制到另一个

VBA 如何批量将单元格复制到另一个工作表中

将单元格从一个工作表保存到另一个工作簿中的工作表 - 无需提示即可保存

仅将可见单元格从 Excel 保存到 CSV

根据单元格值将特定范围而不是整行复制到另一个谷歌工作表