Excel: преобразование между макетами данных

1

У меня есть ситуация, как показано ниже. Есть группы строк. Над каждой группой находится небольшой «заголовок», описывающий поле данных, которое объединяет все строки в группе. Я хочу создать сводную таблицу всего и включить это поле (GroupID), поэтому я хочу вторую версию таблицы. Есть ли способ сделать это за исключением записи макроса? Или, может быть, есть способ создания сводной таблицы напрямую?

Я имею:

GroupID
4

Имя Электронная почта Нравится Не нравится
герпина-то торт Excel
дерпина-то торт Excel

GroupID
5

Имя Электронная почта Нравится Не нравится
Roflmao что-то торт Хм
roflomg что-то тесто
testtttt что-то спать 22

GroupID
1

Имя Электронная почта Нравится Не нравится
OAG что-то OAB N / A
OAB что-то N / AN / A

Желаемая:

Имя Электронная почта Нравится Не нравится GroupID
герпина-то торт Excel 4
что-то дерпина Cake Excel 4
Roflmao что-то торт Хм 5
roflomg что-то тест на выпечку 5
testtttt что-то спать 22 5
OAG что-то OAB N / A 1
OAB что-то N / AN / A 1

Этот пример ввода также находится по адресу https://dl.dropbox.com/u/736090/Book1.xlsx.

Кристиан Невердаль
источник

Ответы:

2

Вот макрос как можно короче

  • откройте Excel и нажмите ALT+F11
  • вставьте код ниже в лист1 или где ваши данные
  • закройте редактор VBA, нажмите ALT+ F8и выполните макрос

    Sub deletelines()    
      Range("A4:D4").Copy
      Range("A1").Insert Shift:=xlToRight
      For i = 2 To Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        c = Cells(i - counter, 1)
        if IsNumeric(c) And c <> "" Then groupID = c
        If c = "" Or c = "Name" Or c = "GroupID" Or IsNumeric(c) Then
          Rows(i - counter).Delete
          counter = counter + 1
        Else
          Cells(i - counter, 5) = groupID
        End If
      Next i   
    End Sub
    

Поскольку это сайт вопросов и ответов, я опишу код. Таким образом, это может быть полезно для других, кто может легко адаптировать и настроить код.

  • Строка 1 + 14: запускает и заканчивает макрос (подпрограмма)
  • Строка 2 + 3: скопируйте диапазон [A4: D4] и вставьте его перед [A1]. Это формирует вашу строку заголовка
  • Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Rowопределяет последнюю использованную ячейку В вашем примере его 22
  • Строка 4: это цикл, который начинается в 2 и заканчивается в 22. iИспользуется как индекс строки
  • Строка 5: сохраняет первую ячейку текущей строки. Общий синтаксис cells(rownumber,columnnumber)
    Внимание: так как мы удаляем строки, мы должны вычесть, сколько строк мы уже удалили.
  • Строка 6: посмотрите, cявляется ли это число, и сохраните его как наш точный идентификатор группы, пока мы не найдем другое число.
  • Строка 7: это условие, которое проверяет, является ли текущее значение ячейки "Имя", "GroupID", пустым или Число.
  • Строка 8: если условие истинно, удаляется вся строка
  • Строка 9: если условие истинно, это подсчитывает счетчик howmanydeletedlines
  • Строка 10-12: если условие ложно, это должна быть хорошая строка данных, которую мы хотим сохранить
  • Строка 13: цикл до следующей, iкоторая обозначает нашу текущую строку
nixda
источник
Это начало, но не совсем там. Пожалуйста, ознакомьтесь с примером ввода на dl.dropbox.com/u/736090/Book1.xlsx - и дайте мне знать, если он вам нужен в другом формате.
Кристиан Невердал
Я отредактировал свой ответ. Я проверил это с вашим book1.xlsx, и он работал для меня.
Никда