【问题标题】:VBA Copy and Paste Certain Columns of a sheet to specific columns on another sheetVBA将工作表的某些列复制并粘贴到另一个工作表上的特定列
【发布时间】:2020-10-12 17:40:26
【问题描述】:

所以,我有两张表,“预算设置”和“摘要”。我需要使用 VBA 根据一个标准将预算设置的某些列(不是整行)复制并粘贴到摘要表的特定列中。

预算设置表如下所示:

这就是我的摘要表现在的样子(在运行我编写的 VBA 代码之后):

因此,如果预算设置表的 A 列中的值为“是”,我想将预算设置的 B 列中的值转移到摘要的 A 列,预算设置的 C 列到摘要的 B 列,列预算设置的 F 到摘要的 C 列,预算设置的 G 列到摘要的 H 列。

这段代码可以解决问题:

Sub PCAMMatching()

a = Worksheets("Budget Setup").Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To a

    If Worksheets("Budget Setup").Cells(i, 1).Value = "Yes" Then

        Worksheets("Budget Setup").Cells(i, 2).Copy
        Worksheets("Summary").Cells(i, 1).Select
        ActiveSheet.Paste

    End If

    If Worksheets("Budget Setup").Cells(i, 1).Value = "Yes" Then

        Worksheets("Budget Setup").Cells(i, 3).Copy
        Worksheets("Summary").Cells(i, 2).Select
        ActiveSheet.Paste
    End If

    If Worksheets("Budget Setup").Cells(i, 1).Value = "Yes" Then

        Worksheets("Budget Setup").Cells(i, 6).Copy
        Worksheets("Summary").Cells(i, 3).Select
        ActiveSheet.Paste
    End If

    If Worksheets("Budget Setup").Cells(i, 1).Value = "Yes" Then

        Worksheets("Budget Setup").Cells(i, 7).Copy
        Worksheets("Summary").Cells(i, 8).Select
        ActiveSheet.Paste
    End If

Next

Application.CutCopyMode = False


End Sub

但是,正如您在我的摘要表中看到的那样,此代码创建了 3 个空白行,因为预算设置表的前 3 行在 A 列中的状态为“否”。我真正想要的是,如果状态为“否”,只需跳过该行(而不是创建空白行)并将状态为“是”的行一一复制到摘要表中。

因此,理想情况下,我希望我的摘要表如下所示:

任何帮助将不胜感激!

【问题讨论】:

  • 您不想在“摘要”工作表中有任何空白行?
  • @GMalc 你可以这么说,但更准确地说,当预算设置表的 A 列中的行具有值“否”时,我希望 VBA 代码跳过它
  • 为了了解你不喜欢的地方,我想,最好也向我们展示一下它现在的样子。应该从现有的外观中消除什么?
  • 您可以在 A 列中筛选“是”,然后使用 SpecialCells(xlCellTypeVisible) 复制列范围并粘贴到第二个工作表中的列。

标签: excel vba copy-paste


【解决方案1】:

这是使用AutoFilterSpecialCells(xlCellTypeVisible) 的基本复制粘贴

'Assign and set your variables
Dim ws1 As Worksheet, ws2 As Worksheet, lRow As Long

Set ws1 = ThisWorkbook.Sheets("Budget Setup")
Set ws2 = ThisWorkbook.Sheets("Summary")

lRow = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row

    With ws1
        .Range("A1").AutoFilter Field:=1, Criteria1:="Yes" 'set your filter

        'copy the visible cells in each column from row 2 and resize to the last row
        'paste to the the cell you want your copied range to start in your second worksheet
        .Range("C2").Resize(lRow - 1).SpecialCells(xlCellTypeVisible).Copy Destination:=ws2.Range("B2")
        .Range("F2").Resize(lRow - 1).SpecialCells(xlCellTypeVisible).Copy Destination:=ws2.Range("C2")
        .Range("H2").Resize(lRow - 1).SpecialCells(xlCellTypeVisible).Copy Destination:=ws2.Range("H2")

        .Range("A1").AutoFilter 'clear the filter
    End With

【讨论】:

  • 谢谢!这正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多