我正在使用下面的代码将行从 Sheet1 复制到 Sheet2。我有3个问题。
Sub COPY_SA() Dim ws1 As Worksheet, ws2 As Worksheet Dim rng As Range, rngToCopy As Range Dim lastrow As Long 'change Sheets to suit Set ws1 = ThisWorkbook.Worksheets("SA") Set ws2 = ThisWorkbook.Worksheets("JC_input") With ws1 'assumung that your data stored in column A:D, Sheet1 lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row Set rng = .Range("A2:D" & lastrow) 'clear all filters .AutoFilterMode = False With rng 'apply filter .AutoFilter Field:=4, Criteria1:=">0" On Error Resume Next 'get only visible rows Set rngToCopy = .SpecialCells(xlCellTypeVisible) On Error GoTo 0 End With 'copy range If Not rngToCopy Is Nothing Then rngToCopy.CopyDestination:=ws2.Range("A2") 'clear all filters .AutoFilterMode = False End With Application.CutCopyMode = False End Sub
我设法修改如下。工作表“ws1”中的范围仍然存在问题。无法在第二行设置过滤器并从第 3 行复制范围。这就是添加:“ws2.Rows(3).Delete”的原因。代码总是复制第 1 行。第 1 行有一些注释。第 2 行获得列名。
Sub COPY_SA() Dim ws1 As Worksheet, ws2 As Worksheet Dim rng As Range, rngToCopy As Range Dim lastrow As Long 'change Sheets to suit Set ws1 = ThisWorkbook.Worksheets("SA") Set ws2 = ThisWorkbook.Worksheets("JC_input") With ws1 'assumung that data stored in column C:E, Sheet1 lastrow = .Cells(.Rows.Count, "C").End(xlUp).Row 'can not make range from row 3 ??? Set rng = .Range("C1:E" & lastrow) 'clear all filters .AutoFilterMode = False With rng 'apply filter with criteria in column 3 of range C:E 'can not make filter in row 2 ??? .AutoFilter Field:=3, Criteria1:=">0" On Error Resume Next 'get only visible rows Set rngToCopy = .SpecialCells(xlCellTypeVisible) On Error GoTo 0 End With 'copy range If Not rngToCopy Is Nothing Then rngToCopy.Range("A:C").Copy 'paste from row 3 ws2.Range("A3").PasteSpecial Paste:=xlValues 'delete no needed row ws2.Rows(3).Delete 'clear all filters .AutoFilterMode = False End With Application.CutCopyMode = False If Not ActiveSheet.AutoFilterMode Then ws1.Range("2:2").AutoFilter End If End Sub
试试这个快速修复,假设你在两张表上的标题都在第一行:
Sub COPY_SA()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim rng As Range, rngToCopy As Range
Dim lastrow As Long
'change Sheets to suit
Set ws1 = ThisWorkbook.Worksheets("SA")
Set ws2 = ThisWorkbook.Worksheets("JC_input")
With ws1
'assumung that your data stored in column A:D, Sheet1
lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
Set rng = .Range("A1:D" & lastrow)
'clear all filters
.AutoFilterMode = False
With rng
'apply filter
.AutoFilter Field:=4, Criteria1:=">0"
On Error Resume Next
'get only visible rows
Set rngToCopy = .SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With
'copy range
If Not rngToCopy Is Nothing Then rngToCopy.Range("A:A,C:D").Copy
ws2.Range("A1").PasteSpecial Paste:=xlValues
'clear all filters
.AutoFilterMode = False
End With
Application.CutCopyMode = False
End Sub
回答您的问题:
- 为什么这个函数总是复制A2行?即使值为“0”。
那是因为您已经设置了从第二行开始的范围并对其应用了过滤器。
我们可以在代码中通过设置范围来更改它,A1:D & Lastrow
并将其粘贴到ws2.Range("A1")
.
- 如何只复制值,而不复制格式?
是的,这是可能的,但您需要xlValues
按照@Peh here 的解释进行复制和粘贴
因此,代码中的更改是针对.Copy
一个范围,而在下一行.PasteSpecial
中xlValues
。
- 复制时是否可以跳过B列?Sheet1 中的“C”将是 Sheet2 中的“B”,依此类推。
是的,而不是复制整个范围,我们可以指定您要复制的列,这可以是非连续的列范围。
我们可以更改.Copy
部分以仅包含我们需要的这些特定列。
我相信整个事情可以写得更整洁,但这至少应该做你所追求的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句