Как скопировать строки с одного листа на другой на основе критериев в столбце - вставлять только значения и форматирование (не формулы)? - PullRequest
0 голосов
/ 25 февраля 2019

Этот код работает, как и ожидалось, для копирования ячеек со значением «xxx» в столбце B. Проблема заключается в том, что он копирует все содержимое строки, включая формулы.Я хотел бы только скопировать значения ячеек и форматирование, а не формулы.

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

Однако при попытке вставитьстрок в одном листе (вероятно, потому что он находится в разделе «С»).Я не смог изменить место назначения вставки строк.В идеале я хотел бы, чтобы скопированные строки были вставлены в Sheet3.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019
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
0 голосов
/ 25 февраля 2019

Вместо вставки копии используйте значение = значение, такое что:

.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

Edit1:

Использование вашего j ...

sheets(3).rows(j).value = .rows(i).value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...