Как скопировать значения, основанные на нескольких критериях ячейки, на другой лист - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть диапазон ввода (F9: F58) на листе «Форма», и мне нужно скопировать эти входные значения в таблицу на другом листе «На основе данных» на основе нескольких критериев (E2) и (E6) на листе «Форма».».Примечание: таблица назначения условий входных значений находится в определенном столбце.

Public Sub InputUnload()

    Set copysheet = Sheets("Form")
    Set pasteSheet = Sheets("Databased")

    pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = _
    copysheet.Range("E2").Value
    pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) = _
    copysheet.Range("E6").Value

    pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) _
            .PasteSpecial xlPasteValues, Transpose:=True _
            = copysheet.Range("F9:F58").Value

End Sub

Лист "Form"

Лист "Databased"

Заранее спасибо.

1 Ответ

0 голосов
/ 30 декабря 2018

Диапазон транспонирования

В pasteSheet у вас есть данные до и между обработанными столбцами.Если вы не будете добавлять эти столбцы в этот код, и если они не рассчитываются при обработке столбца, вы должны заменить каждый ', 1' (который вычисляет последнюю строку в столбце 1 ("A")) на соответствующий столбецномер или код будет вставлен всегда в одной строке.В этом случае первый обработанный столбец - это столбец 3 (C).

Быстрое обновление

Sub InputUnload()

    Dim copySheet As Worksheet
    Dim pasteSheet As Worksheet
    Dim vntRange As Variant
    Dim lastRow As Long

    Set copySheet = Sheets("Form")
    Set pasteSheet = Sheets("Databased")

    ' Calculate last row of data.
    lastRow = pasteSheet.Cells(Rows.Count, 1).End(xlUp).Row

    ' Copy 2 cells.
    pasteSheet.Cells(lastRow + 1, 1).Offset(0, 2) = copySheet.Range("E2").Value
    pasteSheet.Cells(lastRow + 1, 1).Offset(0, 4) = copySheet.Range("E6").Value

    ' Paste column range into array.
    vntRange = copySheet.Range("F9:F58").Value

    ' Paste transpose array into row range.
    pasteSheet.Cells(lastRow + 1, 1).Offset(0, 5).Resize(, copySheet _
            .Range("F9:F58").Rows.Count).Value = Application.Transpose(vntRange)

End Sub

Улучшенная версия

У вас есть много значений, которые должны быть в константах наначало кода, чтобы вы могли быстро изменить их.В следующем коде измените столбец cVntLastRowColumn соответствующим образом по причинам, упомянутым ранее в версии быстрого обновления.

Sub InputUnload()

    ' Source
    Const cStrSource As Variant = "Form"        ' Source Worksheet Name/Index
    Const cStrDate As String = "E2"             ' Date Cell Range Address
    Const cStrSalesman = "E6"                   ' Salesman Cell Range Address
    Const cStrRange = "F9:F58"                  ' Source Column Range Address
    ' Target
    Const cStrTarget As Variant = "Databased"   ' Target Worksheet Name/Index
    Const cVntLastRowColumn As Variant = 1      ' Last Row Column Letter/Number
    Const cVntDateColumn As Variant = 3         ' Date Column Letter/Number
    Const cVntSalesmanColumn As Variant = 5     ' Salesman Column Letter/Number
    Const cVntFirstColumn As Variant = 6        ' First Column Letter/Number

    Dim objSource As Worksheet   ' Source Worksheet
    Dim objTarget As Worksheet   ' Target Worksheet
    Dim vntRange As Variant      ' Source Range Array
    Dim lngLastRow As Long       ' Target Last Row Number

    Set objSource = Sheets(cStrSource)  ' Create reference to Source Worksheet.
    Set objTarget = Sheets(cStrTarget)  ' Create reference to Target Worksheet.

    ' Calculate Target Last Row Number in Target Worksheet.
    lngLastRow = objTarget.Cells(Rows.Count, cVntLastRowColumn).End(xlUp).Row

    ' Copy Date Cell Range value to Target Worksheet.
    objTarget.Cells(lngLastRow + 1, cVntDateColumn) _
            = objSource.Range(cStrDate).Value

    ' Copy Salesman Cell Range value to Target Worksheet.
    objTarget.Cells(lngLastRow + 1, cVntSalesmanColumn) _
            = objSource.Range(cStrSalesman).Value

    ' Paste Source Column Range into Source Array.
    vntRange = objSource.Range(cStrRange).Value

    ' Paste transpose Source Array into Target Row Range
    ' starting from First Column.
    objTarget.Cells(lngLastRow + 1, cVntFirstColumn) _
            .Resize(, objSource.Range(cStrRange).Rows.Count) _
            = Application.Transpose(vntRange)

End Sub

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

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