Если я правильно понимаю, что вы хотите, а именно таблицу из трех столбцов с одним значением в каждом столбце, следующее должно помочь.
Я решил использовать Power Query
(доступно в Excel 2010+)
Алгоритм:
- Развернуть все столбцы:
- Результаты в 2 столбцах, состоящих из заголовка столбца и значения
- Добавьте столбец индекса, а затем добавьте столбец Integer / Divide , в котором мы делим столбец индекса на 3.
- Это возвращает столбец
0,0,0,1,1,1,2,2,2, ...
- Группировать по столбцу
Integer/Divide
- Извлечь значения из результирующей таблицы в список, разделенный разделителями.
- Разделить список в столбцы.
- Удалите ненужные столбцы, и все готово.
- Если вы добавите или удалите столбцы / строки и Refre sh, выходная таблица будет отразите это.
Я предлагаю вам
- Выберите ячейку в таблице данных
- Введите Power Query
- В Excel 2016+,
Data-->Get&Transform-->From Table/Range
- В других версиях вы устанавливаете бесплатную надстройку от MS и следуете этим указаниям
- В пользовательском интерфейсе PQ от go до
Home/Advanced Editor
- Обратите внимание на имя
Table
в строке 2 - Удалите содержимое редактора и вставьте M-код ниже на свое место
- Измените имя таблицы в строке 2, чтобы оно соответствовало вашему настоящему имени таблицы.
- Изучите окно Applied Steps, чтобы лучше видеть, что делается на каждом этапе.
- дважды щелкните шаги с
settings gear icon
, чтобы отобразить параметры
M-код
let
Source = Excel.CurrentWorkbook(){[Name="Table5"]}[Content],
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, {}, "Attribute", "Value"),
#"Added Index1" = Table.AddIndexColumn(#"Unpivoted Other Columns", "Index", 0, 1),
#"Inserted Integer-Division" = Table.AddColumn(#"Added Index1", "Integer-Division", each Number.IntegerDivide([Index], 3), Int64.Type),
#"Removed Columns1" = Table.RemoveColumns(#"Inserted Integer-Division",{"Index", "Attribute"}),
#"Grouped Rows" = Table.Group(#"Removed Columns1", {"Integer-Division"}, {{"Grouped", each _, type table [Value=number, #"Integer-Division"=number]}}),
#"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"Integer-Division"}),
#"Added Custom" = Table.AddColumn(#"Removed Columns", "Column", each Table.Column([Grouped],"Value")),
#"Extracted Values" = Table.TransformColumns(#"Added Custom", {"Column", each Text.Combine(List.Transform(_, Text.From), ";"), type text}),
#"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Values", "Column", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"Column.1", "Column.2", "Column.3"}),
#"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Column.1", Int64.Type}, {"Column.2", Int64.Type}, {"Column.3", Int64.Type}}),
#"Removed Columns2" = Table.RemoveColumns(#"Changed Type",{"Grouped"})
in
#"Removed Columns2"
Исходные данные
Results
введите описание изображения здесь
Если выполнение этого в VBA является абсолютным требованием, вы можете попробовать этот код: но прочтите его, чтобы вы могли соответствующим образом изменить диапазон и ссылки на лист:
Option Explicit
Sub JoinAndCut()
Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range, col As Collection, vSrc, vRes
Const firstRow As Long = 31
Const firstCol As Long = 1
Dim I As Long, J As Long, K As Long, arr(0 To 2), v
'read the data into VBA array
Set wsSrc = ThisWorkbook.Worksheets("sheet9")
With wsSrc
vSrc = .Cells(firstRow, firstCol).CurrentRegion
End With
'collect output array
Set col = New Collection
For I = 2 To UBound(vSrc, 1) 'skip the header row
For J = 1 To UBound(vSrc, 2) Step 3
For K = 0 To 2
arr(K) = vSrc(I, J + K)
Next K
If arr(0) <> "" Then col.Add arr 'skip the blanks
Next J
Next I
'Create results array
ReDim vRes(0 To col.Count, 1 To 3)
'Headers
vRes(0, 1) = "Column.1"
vRes(0, 2) = "Column.2"
vRes(0, 3) = "Column.3"
'Populate
I = 0
For Each v In col
I = I + 1
For J = 1 To 3
vRes(I, J) = v(J - 1)
Next J
Next v
'Set output range
Set wsRes = wsSrc
Set rRes = wsRes.Cells(50, 1)
Set rRes = rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2))
With rRes
.ClearContents
.Value = vRes
'could add formatting commands
End With
End Sub
Либо один из приведенных выше вариантов можно легко изменить для вывода результатов в виде троек, а не в трех отдельных столбцах, если я вас неправильно понял.