VBA 根据特定标题从一个工作表复制并粘贴到另一个工作表

问题描述 投票:0回答:1

我刚接触这个 VBA,一直在通过查看 YTube 尝试自己,我想了解更多。我想使用相同的标题名称从一张纸复制并粘贴到另一张纸。源工作表有超过 30 列和大量公式、文本和日期。

我只想将 7 列传输到目标工作表。目标工作表和源工作表的标题位于第 8 行。

我有以下代码,但使用这段代码,它只复制并粘贴到第 1 列。我没有得到其余部分,即使标题名称相同,我也不知道这段代码有什么问题。

我期待使用匹配的标题复制和粘贴值并给我所有数据。

任何帮助请提前谢谢你。

Sub pullData()

Dim header_count As Integer
Dim row_count As Integer
Dim col_count As Integer
Dim i As Integer
Dim j As Integer
Dim ws1 As Worksheet
Dim ws2 As Worksheet

Set ws1 = ThisWorkbook.Sheets("Template")
Set ws2 = ThisWorkbook.Sheets("Prior Month")

ws2.Activate

header_count = WorksheetFunction.CountA(Range("A8", Range("A8").End(xlToRight)))
ws1.Activate
col_count = WorksheetFunction.CountA(Range("A8", Range("A8").End(xlToRight)))
row_count = WorksheetFunction.CountA(Range("A8", Range("A8").End(xlDown)))

For i = 1 To header_count
    j = 1
    Do While j <= col_count
        If ws2.Cells(1, j) = ws1.Cells(1, j).Text Then
            ws1.Range(Cells(1, j), Cells(row_count, j)).Copy
            ws2.Cells(1, j).PasteSpecial xlPasteValues
            Application.CutCopyMode = False
            j = col_count
        End If
        j = j + 1
    Loop
Next i

With ws2
    .Activate
    .Cells(1, i).Select
End With

End Sub
excel vba header copy paste
1个回答
0
投票

这是您的代码的工作版本:

Sub PullData()
    Dim template As Worksheet
    Dim priorMonth As Worksheet
    Dim priorMonthHeaderCount As Long
    Dim templateColCount As Long

    Set template = ThisWorkbook.Sheets("Template")
    Set priorMonth = ThisWorkbook.Sheets("Prior Month")    
    priorMonthHeaderCount = priorMonth.Cells(1, Columns.Count).End(xlToLeft).Column
    templateColCount = template.Cells(1, Columns.Count).End(xlToLeft).Column
    
    Dim priorMonthHeaderIndex As Long
    Dim templateColumnIndex As Long
    For priorMonthHeaderIndex = 1 To priorMonthHeaderCount
        For templateColumnIndex = 1 To templateColCount
            If priorMonth.Cells(1, priorMonthHeaderIndex) = template.Cells(1, templateColumnIndex) Then
                template.Columns(templateColumnIndex).Copy Destination:=priorMonth.Columns(priorMonthHeaderIndex)
                Exit For
            End If
        Next templateColumnIndex
    Next priorMonthHeaderIndex
End Sub

这没有像预期的那样为你工作,因为你写了

If ws2.Cells(1, j) = ws1.Cells(1, j).Text
而不是
If ws2.Cells(1, i) = ws1.Cells(1, j).Text

您可能需要一分钟时间才能看出两者之间的区别。这就是为什么给变量起有意义的名字会很有帮助。

一些变化:

  • Do ... While
    更改为嵌套的
    For
    循环以获得更好的可读性
  • 删除了
    Activate
    Select
    ,因为此代码不需要它们
  • 给出更具描述性的变量名
  • j = col_count
    更改为
    Exit For
    以提高可读性
  • 根据 ozgrid.com,在
    Destination:=
    方法中使用
    .Copy
    参数绕过剪贴板。因此你不需要清除它,我能够删除
    Application.CutCopyMode = False
    .
© www.soinside.com 2019 - 2024. All rights reserved.