![根据单元格值复制数据范围](https://linux22.com/image/1505030/%E6%A0%B9%E6%8D%AE%E5%8D%95%E5%85%83%E6%A0%BC%E5%80%BC%E5%A4%8D%E5%88%B6%E6%95%B0%E6%8D%AE%E8%8C%83%E5%9B%B4.png)
我有一个包含 A 至 C 列的列表。B 列包含“A”、“B”或“C”。我需要根据 B 列中的值将 A 至 C 列中的所有数据复制到新工作表中。
我想在 B 列为“A”时复制到工作表 1,在 B 列为“B”时复制到工作表 2,在 B 列为“C”时复制到工作表 3。
我尝试过使用 VBA For i = 1 to .End(xlUp).Offset(0)
,但我该怎么办?我尝试的方法对我来说根本不起作用。
答案1
以下代码假设包含要复制的数据的工作表名为“Main”。它还假设您的“粘贴”工作表包含列标题,因此它将从第 2 行开始粘贴。如果这不是您想要的,请.Offset(1, 0)
从执行粘贴的行中删除调用。
您可能希望有比一行更好的错误处理Debug.Print
,但我会把这留给您决定。
在 Excel 2007 中测试,并且运行正常。
Sub DoCopy()
Const copySheetName As String = "Main"
Dim rw As Integer
Dim lngRowStart As Long
Dim lngRowEnd As Long
Dim copySheet As Excel.Worksheet: Set copySheet = ThisWorkbook.Worksheets(copySheetName)
Dim pasteSheet As Excel.Worksheet
lngRowStart = 1 'number of first row containing data to copy
lngRowEnd = 17 'number of last row containing data to copy
'the "Copy" sheet be the active sheet in order to copy/paste (avoid run-time error 1004)
ThisWorkbook.Worksheets(copySheetName).Activate
For rw = lngRowStart To lngRowEnd
copySheet.Range(Cells(rw, 1), Cells(rw, 3)).Copy
Select Case Cells(rw, 2)
Case "a"
Set pasteSheet = ThisWorkbook.Worksheets("Sheet1")
Case "b"
Set pasteSheet = ThisWorkbook.Worksheets("Sheet2")
Case "c"
Set pasteSheet = ThisWorkbook.Worksheets("Sheet3")
Case Else
Debug.Print "Invalid Value: " & Cells(rw, 2) & " (row " & rw & ")"
GoTo SkipRow
End Select
pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
SkipRow:
Next rw
Application.CutCopyMode = False
Set copySheet = Nothing
Set pasteSheet = Nothing
End Sub
答案2
抱歉,我刚好有时间测试这个,但不起作用。它在“ Dim copySheet As Excel.Worksheet: Set copySheet = ThisWorkbook.Worksheets(copySheetName)”期间挂起了
我工作表“数据”中的原始数据,我已将名称更新为 Const copySheetName As String =“data”
你知道为什么它不起作用吗?谢谢。