Разделение данных на строки на основе значения ячейки - PullRequest
0 голосов
/ 27 мая 2019

Впервые здесь, поэтому заранее прошу прощения, если я спрашиваю об этом неправильно.

У меня есть довольно хорошее понимание Excel, но я действительно когда-либо использовал его только для некоторых формул, которые можно легко модерировать.Я пытаюсь понять, с чего начать с имеющейся у меня проблемы, но я даже не уверен, что искать, чтобы найти ответ.Из того, что я смог найти - это может быть достигнуто с помощью Power Query или макроса Excel-VBA?

У меня может быть 400 строк данных на листе.Мне нужно отделить каждую строку данных на основе значений в 4 столбцах.

Это скриншот, который я сделал с кратким примером того, чего я пытаюсь достичь.

enter image description here

В верхней части скриншота показано, как данные теперь.Нижняя часть - это то, как я хочу, чтобы данные были изменены.Новая строка создается для любой платы, которая была понесена (базовая плата для каждой строки, затем, если они понесли плату за заказ, то добавляется новая строка, если была произведена плата за приоритет, добавляется новая строка и т. Д. Если это«0», то нет новой строки).

Если у кого-нибудь есть какое-либо руководство о том, как это сделать, было бы замечательно.Я не спрашиваю о решении, но просто несколько советов о том, что я могу исследовать или что я должен учиться, чтобы достичь чего-то подобного!

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Если предположить, что заголовки столбцов в вашем примере (имя, электронная почта, дата заказа, сумма заказа, валюта, ускоренная оплата, валюта, плата за курьер, валюта) с исходными данными в именованном диапазоне с заголовками Table1, код powerquery будет ниже,

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Custom" = Table.AddColumn(Source, "Base Fee", each "USD:150"),
#"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Added Custom", {{"Order Amount", type text}}, "en-US"),{"Currency", "Order Amount"},Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Order Amount1"),
#"Merged Columns1" = Table.CombineColumns(Table.TransformColumnTypes(#"Merged Columns", {{"Expedite Fee", type text}}, "en-US"),{"Currency2", "Expedite Fee"},Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Expedite Fee1"),
#"Merged Columns2" = Table.CombineColumns(Table.TransformColumnTypes(#"Merged Columns1", {{"Courier Fee", type text}}, "en-US"),{"Currency3", "Courier Fee"},Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Courier Fee1"),
#"Removed Other Columns" = Table.SelectColumns(#"Merged Columns2",{"Name", "Order Amount1", "Expedite Fee1", "Courier Fee1","Base Fee"}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Removed Other Columns", {"Name"}, "Description", "Value"),
#"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Other Columns", "Value", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"Currency", "Fee"}),
#"Replaced Value" = Table.ReplaceValue(#"Split Column by Delimiter","1","",Replacer.ReplaceText,{"Description"})
in #"Replaced Value"
0 голосов
/ 28 мая 2019

Я тороплюсь, поэтому этот код торопится.Могу вернуться и объяснить вещи, если это необходимо.Но он дает мне вывод, который вы показали.

Option Explicit

Private Sub UnpivotColumns()

    Dim sourceSheet As Worksheet
    Set sourceSheet = ThisWorkbook.Worksheets("Sheet1")

    Dim lastSourceRow As Long
    lastSourceRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).Row

    Dim lastSourceColumn As Long
    lastSourceColumn = sourceSheet.Cells(1, sourceSheet.Columns.Count).End(xlToLeft).Column

    Dim sourceData As Range
    Set sourceData = sourceSheet.Range("A2", sourceSheet.Cells(lastSourceRow, lastSourceColumn))

    Dim destinationSheet As Worksheet
    Set destinationSheet = ThisWorkbook.Worksheets("Sheet2")

    destinationSheet.Cells.Clear
    destinationSheet.Range("A1:D1").Value = Array("Name", "Description", "Currency", "Fee")

    Dim destinationRowIndex As Long
    destinationRowIndex = 1 ' Skip header row

    Dim outputArray(1 To 4) As Variant ' Re-use same array throughout procedure

    Dim sourceRowIndex As Long
    For sourceRowIndex = 2 To lastSourceRow

        ' Base fee always needs writing (unconditionally)
        outputArray(1) = sourceSheet.Cells(sourceRowIndex, "A") ' Name
        outputArray(2) = "Base Fee"  ' Description
        outputArray(3) = "USD" ' Currency
        outputArray(4) = 150 ' Fee amount

        destinationRowIndex = destinationRowIndex + 1
        destinationSheet.Cells(destinationRowIndex, "A").Resize(1, 4).Value = outputArray

        Const FIRST_COLUMN_TO_UNPIVOT As Long = 4 ' Skip first three columns

        Dim sourceColumnIndex As Long
        For sourceColumnIndex = FIRST_COLUMN_TO_UNPIVOT To lastSourceColumn Step 2
            outputArray(2) = sourceSheet.Cells(1, sourceColumnIndex)  ' Unpivoted description
            outputArray(3) = sourceSheet.Cells(sourceRowIndex, sourceColumnIndex + 1) ' Unpivoted currency
            outputArray(4) = sourceSheet.Cells(sourceRowIndex, sourceColumnIndex) ' Unpivoted fee amount

            ' Skip amount if nil/zero
            If outputArray(4) > 0 Then
                destinationRowIndex = destinationRowIndex + 1
                destinationSheet.Cells(destinationRowIndex, "A").Resize(1, 4).Value = outputArray
            End If

        Next sourceColumnIndex

    Next sourceRowIndex

End Sub

Код делает некоторые предположения (которые верны для вашего скриншота, но могут не соответствовать действительности, если макет ваших данных изменяется).

Недостатки этого кода:

  • Он жесткий и не очень гибкий / динамический
  • Он будет медленным, поскольку он читает / записывает ячейки по одной за раз.
  • Ссылочная целостность отсутствует (индексы / смещения столбцов предполагаются и фактически никогда не проверяются / не утверждаются).Это становится проблемой, если изменяется расположение / положение ваших данных.

Хорошие вещи в этом коде:

  • Надеемся, что это работает (для примера, который вы показали вваш скриншот).

Это мои данные перед кодом (на Sheet1):

Before

Этомои данные после кода (на Sheet2):

After

Кроме того, что-то подобное в равной степени возможно и в Power Query (и, вероятно, в меньшем количестве).строки кода тоже).

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