Как скопировать строки и вставить их в лист с учетом значения ячейки - PullRequest
0 голосов
/ 20 января 2020

У меня есть данные в таблице, где я сравниваю два столбца J и T. Значения, которые могут принимать J и T, включают A2B, APL, BGF, CMA и другие (см. Код).

Если эти значения равны, скопируйте строку i в лист с именем только что отмеченных ячеек.

Если эти значения не равны, скопируйте строку i в листы с именем только что отмеченных ячеек.

Пример : сравнить J2 и T2,

Предположим, J2 = T2 = BGF, затем скопировать строку 2 и вставить в лист ("BGF")

Затем сравните J3 и T3

Предположим, J3 = BGF и T3 = CMA, скопируйте строку 3 и вставьте в лист (BGF) и лист (CMA)

Затем сравните J4 и T4

Предположим, J4 = Ничего и T4 = CMA, скопируйте строку 4 и вставьте в лист CMA

. Единственная другая комбинация - это когда значение Ji имеет значение, а Ti пусто.

Проблема : при запуске этого кода, если J3 = BGF и T3 = пусто (пусто), строка не копируется ни на один лист.

Вот код

Sub Sortdata()
    'step 1 clear all data
    Sheets("A2B").Cells.ClearContents
    Sheets("APL").Cells.ClearContents
    Sheets("BGF").Cells.ClearContents
    Sheets("CMA").Cells.ClearContents
    Sheets("K Line").Cells.ClearContents
    Sheets("MacAndrews").Cells.ClearContents
    Sheets("Maersk").Cells.ClearContents
    Sheets("OOCL").Cells.ClearContents
    Sheets("OPDR").Cells.ClearContents
    Sheets("Samskip").Cells.ClearContents
    Sheets("Unifeeder").Cells.ClearContents

    Dim i As Long
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim LastRow As Long


    With Worksheets("All Data")
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To LastRow
            If IsEmpty(.Range("J" & i)) Then
                Set ws1 = Nothing
            Else
                Set ws1 = Worksheets(.Range("J" & i).Value)
            End If
            If IsEmpty(.Range("T" & i)) Then
                Set ws2 = Nothing
            Else
                Set ws2 = Worksheets(.Range("T" & i).Value)
            End If

            If ws1 Is Nothing Then
                If Not ws2 Is Nothing Then
                    CopyToWs ws2, .Rows(i)
                End If
            ElseIf ws2 Is Nothing Then
                If Not ws1 Is Nothing Then
                    CopyToWs ws1, .Rows(i)
                End If
            Else
                CopyToWs ws1, Rows(i)
                If ws1.Name <> ws2.Name Then
                    CopyToWs ws2, .Rows(i)
                End If
            End If
        Next
    End With

End Sub

Sub CopyToWs(ws As Worksheet, rng As Range)
    rng.Copy
    ws.Cells(ws.Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow.PasteSpecial xlPasteValuesAndNumberFormats
End Sub

1 Ответ

0 голосов
/ 20 января 2020

Пожалуйста, попробуйте этот код. Это немного отличается от того, что вы пробовали, но я думаю, что оно выполнит свою работу.

Option Explicit

Sub Sortdata()
    ' Variatus @STO 20 Jan 2020

    Const WsNames As String = "A2B,APL,BGF,CMA,K Line,MacAndrews," & _
                              "Maersk,OOCL,OPDR,Samskip,Unifeeder"

    Dim WsS As Worksheet                ' Source
    Dim Ws As Worksheet
    Dim Rng As Range
    Dim Rt As Long                      ' target row
    Dim LastRow As Long
    Dim J As Long, T As Long
    Dim Tmp As Variant, PrevTmp As Variant
    Dim R As Long, C As Long

    'step 1 clear all data
    Tmp = Split(WsNames, ",")
    For R = LBound(Tmp) To UBound(Tmp)
        On Error Resume Next
        Worksheets(Tmp(R)).Cells.ClearContents
    Next R

    Application.ScreenUpdating = False
    Set WsS = Worksheets("All Data")
    With WsS
        J = .Columns("J").Column
        T = .Columns("T").Column
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For R = 2 To LastRow
            PrevTmp = ""
            For C = J To T Step T - J
                Tmp = .Cells(R, C).Value
                If Len(Tmp) And Tmp <> PrevTmp Then
                    On Error Resume Next
                    Set Ws = Worksheets(Tmp)
                    If Err = 0 Then
                        Set Rng = .Range(.Cells(R, 1), .Cells(R, .Columns.Count).End(xlToLeft))
                        With Ws
                            Rt = Application.Max(.Cells(.Rows.Count, "A").End(xlUp).Row + 1, 2)
                            Rng.Copy Destination:=Ws.Cells(Rt, 1)
                        End With
                    End If
                End If
                PrevTmp = Tmp
            Next C
            If R Mod 25 = 0 Then Application.StatusBar = "Currently processing row " & R
        Next R
    End With

    With Application
        .ScreenUpdating = True
        .StatusBar = "Done"
    End With
End Sub

Я думаю, что вы сможете найти выход и внести необходимые изменения. Дайте мне знать, если вам потребуется какая-либо помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...