Как манипулировать набором данных, перемещая столбцы в ряд - PullRequest
0 голосов
/ 21 июня 2019

Я надеялся использовать Excel (либо VBA, либо Power Query), чтобы изменить мой набор данных и сместить столбцы, чтобы они вместо этого отображались в виде строк.

(Извинения за форматирование, я новичок итаблицы вышли не так хорошо, как я надеялся)


Я использую данные о продажах, и в настоящее время они имеют следующий вид:

(конечная цель будетиспользование его в базе данных Access и привязка его к сводной таблице)

Категория |Сегмент |Бренд |SKU # |Источник данных |201901 |201902 |201903 | ...

Лицо |Моющее средство |Топор |12345 |$ Volume |5 долларов США |10 долларов США |$ 16 | ...

Лицо |Лосьон |Голубь |54321 |$ Volume |$ 14 |25 долларов |$ 13 | ...


Формат, в котором я хотел бы переместить его:

Категория |Сегмент |Бренд |SKU # |Источник данных |Год |Значение

Лицо |Моющее средство |Топор |12345 |$ Volume |201901 |$ 5

Лицо |Моющее средство |Топор |12345 |$ Volume |201902 |$ 10

Лицо |Моющее средство |Топор |12345 |$ Volume |201903 |$ 16

Лицо |Лосьон |Голубь |54321 |$ Volume |201901 |$ 14

Лицо |Лосьон |Голубь |54321 |$ Volume |201902 |$ 25

Лицо |Лосьон |Голубь |54321 |$ Volume |201903 |$ 13


Существует 4 разных источника данных, но они будут в одном и том же формате.Я также могу разбить Категорию, Сегмент и Бренд на таблицу поиска, если вы думаете, что это облегчит задачу.

Я планировал написать некоторый код на VBA и начал с того, что изложил все, что коднужно будет выполнить.Затем я написал пару строк, которые быстро сломались, и начал искать альтернативные решения (а именно силовой запрос).Я думал, что лучшим способом будет транспонировать данные, но описания каждого продукта не соответствуют остальным данным.Будем весьма благодарны за любые ресурсы или указания, как это сделать.


Вот что я пытался сделать до сих пор: В VBA, по сути, я сохранил счетчик в переменных как:

Set ws = ThisWorkbook.Worksheets("Source")
totalRows = ws.Range("A1").CurrentRegion.Rows.Count
RelColumns = ws.Range("A1").CurrentRegion.Columns.Count - 7 'There are 7 columns outside the data which are constant (The Cat/Segment/Brand/Sku/datasource)

^ После этого я планировал вложить циклы, чтобы ссылаться на значение, а затем скопировать все на новый лист.Моя идея была что-то вроде:

For i = 2 to TotalRows 'Gets each SKU and data source within that SKU
    For j = 1 to RelColumns 'Does each value (year) that needs to be brought across
        ...
    Next
Next

Я не был уверен, куда идти дальше, так как я не мог найти способ скопировать только эти ячейки и получить правильное значение из каждой (Там не было 'любой код, который я сделал для этого, просто мозговой штурм).Вместо того, чтобы продолжать врезаться в стену, я попытался решить проблему в другом направлении:

Я импортировал данные в Excel и отформатировал их в таблицу.Перенеся его в редактор мощных запросов, я поэкспериментировал с вкладкой преобразования, используя функцию транспонирования.Однако годы (поскольку они были заголовками столбцов) удаляются, и описание каждого продукта перемещается в верхнюю часть листа (что и ожидалось, учитывая, как работает транспонирование).Я легко могу вернуть годы назад вручную, но затрудняюсь, как правильно восстановить описания.Каждую из них нужно будет продублировать на столько строк, сколько имеется в настоящее время столбцов, и способ сделать это ускользает от меня.Я могу написать VBA или Python, но теряюсь в том, куда идти с этим.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

На случай, если кто-нибудь наткнется на это, я решил проблему немного раньше и решил поделиться с ним своим методом:

Сначала я взял все данные и загрузил их в базу данных Access.затем, используя ADODB в VBA, я прошел по всем годам и запросил как первую часть данных, так и один из лет, а также выбрал столбец, в котором значение было задано как только этот год.

Записывая все это на лист, каждый год ниже предыдущего, результат был именно тем, что было нужно.

Надеюсь, это поможет всем, у кого возникла такая же проблема

0 голосов
/ 21 июня 2019

Я использую это, чтобы переписать столбец в строку, написал несколько комментариев, чтобы помочь вам следовать.

Private Sub ColumnToRow()

    'This program will work by initially selecting the first cell in the column you wish to replicate
    Dim targetRange As Range
    Set targetRange = Cells(305, 3) 'Replace 3, 305 to whatever cell you want to begin writing to. the 3 is column C just convert the letter to corresponding number
    Do While Selection.Value <> ""
        targetRange.Value = Selection.Value
        Set targetRange = targetRange.Offset(0, 1) 'move over one column
        Selection.Offset(1, 0).Select 'move selection to next row
    Loop
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...