此代码可以正常工作,以复制B列中给定值为“ xxx”的单元格。 问题在于它会复制整个行的内容,包括公式。我只想复制单元格的值和格式,而不是公式。
Sub CommandButton1_Click()
Dim LastRow As Long
Dim i As Long, j As Long
'Find the last used row in a Column: column A in this example (source sheet = sheet2)
With Worksheets("Sheet2")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
'Message box to confirm how many rows were scanned to ensure all rows were scanned
MsgBox ("Number of rows scanned: " & LastRow)
'First row number where you need to paste values in Sheet3 (destination sheet = sheet3)'
With Worksheets("Sheet3")
j = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
End With
For i = 1 To LastRow
With Worksheets("Sheet2")
If .Cells(i, 2).Value = "xxx" Then
.Rows(i).Copy Destination:=Worksheets("Sheet3").Range("A" & j)
j = j + 1
End If
End With
Next i
End Sub
我尝试将最后一部分修改为类似
.Rows(i).Copy
.Range("A" & j).PasteSpecial xlPasteValuesAndNumberFormats
但是,这试图将行粘贴到同一工作表中(可能是因为该行位于“ With”下)。我无法更改行粘贴的目的地。理想情况下,我希望将复制的行粘贴到Sheet3中。
答案 0 :(得分:1)
使用value = value代替复制粘贴:
.Rows(j).value = .rows(i).value
要移动到另一张纸,可以添加纸参考和最后一行:
sheets(3).rows(sheets(3).cells(sheets(3).rows.count,1).end(xlup).offset(1,0).row).value = .rows(i).value
编辑1:
使用您的j ...
sheets(3).rows(j).value = .rows(i).value
答案 1 :(得分:0)
Public Function FilterByTable(fromWs As Worksheet, destWs As Worksheet, tableFilter As String) As Boolean
Dim copyFrom As Range
Dim lRow As Long
'Assume false
FilterByTable = False
With fromWs
.AutoFilterMode = False
'This gives the value for the last row in this range
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
With .Range("A1:A" & lRow)
'Looking for any row that meets this filter i.e. val=tableFilter
.AutoFilter Field:=1, Criteria1:="=" & tableFilter
Set copyFrom = .SpecialCells(xlCellTypeVisible).EntireRow
End With
.AutoFilterMode = False
End With
With destWs
'Some error checking since this will fail if you try to perform the operation on an empty data set
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lRow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lRow = 1
End If
copyFrom.Copy .Rows(lRow)
End With
FilterByTable = True
End Function