我刚接触这个 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
这是您的代码的工作版本:
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
以提高可读性Destination:=
方法中使用 .Copy
参数绕过剪贴板。因此你不需要清除它,我能够删除Application.CutCopyMode = False
.