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

Вот данные, как они отформатированы сейчас:

pay period   name
3/6/2015     John Smith
3/6/2015     Jane Smith
4/5/2015     John Smith
4/5/2015     Jane Smith
4/5/2015     Joe Smith
4/19/2015    John Smith
4/19/2015    Jane Smith
4/19/2015    Joe Smith
5/3/2015     John Smith
5/3/2015     Jane Smith
5/3/2015     Joe Smith
5/3/2015     Julie Smith

И вот как я хотел бы, чтобы это было отформатировано:

3/6/2015    4/5/2015    4/19/2015   5/3/2015
John Smith  John Smith  John Smith  John Smith
Jane Smith  Joe Smith   Joe Smith   Joe Smith
            Jane Smith  Jane Smith  Jane Smith
                                    Julie Smith

Я пытался использовать Get & Transform/Power Query для транспонирования данных с помощью сводных столбцов, используя имена в столбце периода оплаты для создания новых столбцов, с "именем" в качестве столбца значений и агрегированием отключено. Вместо того, чтобы получить нужный мне формат, я получаю даты периода оплаты в виде заголовков столбцов, а затем одну ошибку чтения ячейки в строке 2. Я проверил типы столбцов, чтобы убедиться, что в качестве "периода оплаты" указана дата в качестве типа, а в "имени" - текст.

Я не уверен, просто ли я делаю запрос, или я должен пойти по-другому. Любая помощь очень ценится.

1 ответ1

0

Я тоже желаю больше вариантов с сводными таблицами. Вот саб VBA, чтобы сделать это перемещение для вас. Это только основы и может быть более надежным. Это не сортирует ваши даты или ваши имена и принимает их как есть. Он добавляет лист и получает данные с текущего активного листа.

Sub Transpose()

Dim dateDict As Object
Dim numRows As Long
Dim rowPos As Long
Dim dateVal As String

Dim currSheet As Worksheet
Set currSheet = ActiveSheet

Set dateDict = CreateObject("Scripting.Dictionary")
numRows = currSheet.Range("A1").CurrentRegion.Rows.Count
rowPos = 2
Do While rowPos <= numRows
  dateVal = currSheet.Cells(rowPos, 1).Value2
  If dateDict.exists(dateVal) Then
  Else
    dateDict.Add dateVal, 0
  End If
  rowPos = rowPos + 1
Loop

Dim mySheet As Worksheet
Set mySheet = ThisWorkbook.Worksheets.Add

Dim i As Long
Dim newPos As Long
Dim Column As Long
Column = 0
For Each myKey In dateDict
  newPos = 2
  rowPos = 2
  Column = Column + 1
  mySheet.Cells(1, Column).Value2 = myKey
  Do While rowPos <= numRows
    If currSheet.Cells(rowPos, 1).Value2 = myKey Then
      mySheet.Cells(newPos, Column).Value2 = currSheet.Cells(rowPos, 2).Value2
      newPos = newPos + 1
    End If
    rowPos = rowPos + 1
  Loop
Next

End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .