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

Я пытаюсь нормализовать БД Pokemon до 1NF, однако я не уверен, как это сделать в Excel.

Я хочу взять несколько записей данных в «Способностях», разделить их и продублировать строку.

Исходные данные

+----------------+-----------+---------------+-----------------------------+
| pokedex_number |   name    | classfication |          abilities          |
+----------------+-----------+---------------+-----------------------------+
|              1 | Bulbasaur | Seed Pokemon  | ['Overgrow', 'Chlorophyll'] |
|              2 | Ivysaur   | Seed Pokemon  | ['Overgrow', 'Chlorophyll'] |
|              3 | Venusaur  | Seed Pokemon  | ['Overgrow', 'Chlorophyll'] |
+----------------+-----------+---------------+-----------------------------+

Желаемые данные

+----------------+-----------+---------------+-------------+
| pokedex_number |   name    | classfication |  abilities  |
+----------------+-----------+---------------+-------------+
|              1 | Bulbasaur | Seed Pokemon  | Overgrow    |
|              1 | Bulbasaur | Seed Pokemon  | Chlorophyll |
|              2 | Ivysaur   | Seed Pokemon  | Overgrow    |
|              2 | Ivysaur   | Seed Pokemon  | Chlorophyll |
|              3 | Venusaur  | Seed Pokemon  | Overgrow    |
|              3 | Venusaur  | Seed Pokemon  | Chlorophyll |
+----------------+-----------+---------------+-------------+

Ответы [ 2 ]

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

Используйте Power Query (он же Get&Transform), чтобы разбить столбец Способности на строки Затем удалите посторонние символы []'

Это все может бытьсделано из графического интерфейса PQ.

М-код

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Replaced Value" = Table.ReplaceValue(Source,"[","",Replacer.ReplaceText,{"abilities"}),
    #"Replaced Value1" = Table.ReplaceValue(#"Replaced Value","'","",Replacer.ReplaceText,{"abilities"}),
    #"Replaced Value2" = Table.ReplaceValue(#"Replaced Value1","]","",Replacer.ReplaceText,{"abilities"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Replaced Value2", {{"abilities", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "abilities"),
    #"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"abilities", type text}})
in
    #"Changed Type"

Результаты

enter image description here

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

Вы можете попробовать:

Option Explicit
Dim strResults As String

Sub test()

    Dim varSplit As Variant
    Dim LastRow As Long, i As Long, Counter As Long, y As Long, CounterArr As Long
    Dim pokedex_number As String, name As String, classfication As String

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        For i = LastRow To 2 Step -1

            Counter = Len(.Range("D" & i).Value) - Len(Replace(.Range("D" & i).Value, ",", ""))

            If Counter > 0 Then

                Call Module1.Clean(.Range("D" & i).Value)

                varSplit = Split(strResults, ",")

                pokedex_number = .Range("A" & i).Value
                name = .Range("B" & i).Value
                classfication = .Range("C" & i).Value

                .Rows(i + 1 & ":" & i + Counter).Insert

                CounterArr = 0

                For y = i To Counter + i

                    .Range("A" & y).Value = pokedex_number
                    .Range("B" & y).Value = name
                    .Range("C" & y).Value = classfication
                    .Range("D" & y).Value = varSplit(CounterArr)

                    CounterArr = CounterArr + 1

                Next y

            End If

        Next i

    End With

End Sub

Sub Clean(ByVal str As String)

    strResults = Replace(Replace(Replace(Replace(str, "]", ""), "[", ""), " ", ""), "'", "")

End Sub
...