#excel #vba
#excel #vba
Вопрос:
Мне нужна помощь в преобразовании трех столбцов в матрицу с помощью макроса Excel. Вот пример:
Из этого:
A A 0 A B 23 A C 3 B A 7 B B 56 B C 33 C A 31 C B 6 C C 5
к этому:
A B C A 0 23 3 B 7 56 33 C 31 6 5
Надеюсь, вы сможете мне помочь.
Спасибо
Комментарии:
1. Используя конкретно vba? Сводная таблица Excel не подходит?
Ответ №1:
Не совсем уверен, что именно вы подразумеваете под матрицей. Для приведенного ниже кода я предположил, что вы искали способ считывать данные в первых двух столбцах как данные строки и столбца выходной таблицы. Предположим, что входные данные находятся в столбцах 1-3 «Листа 1»
Sub ConvertTableOfData()
Dim testArray(1 to 3)
Dim chkROW as Integer
Dim chkCOL as Integer
Dim chkVAL as Integer
'// index the Row and Column headers
testArray(1) = "A"
testArray(2) = "B"
testArray(3) = "C"
'// Iterate through every row in the initial dataset
For i = 1 to Worksheets("Sheet1").Cells(1, 1).End(xlDown).Row
With Worksheets("Sheet1")
'// Assign the Output Row and Column values
'// based on the array indices
For j = 1 to UBound(testArray, 1)
If .Cells(i, 1) = testArray(j) Then
chkROW = j
End If
If .Cells(i, 2) = testArray(j) Then
chkCOL = j
End If
Next j
'// store the actual value
chkVAL = .Cells(i, 3)
End With
'// output table (in Sheet2)
With Worksheets("Sheet2")
.Cells(chkROW, chkCOL) = chkVAL
End With
Next i
'// Add headers to Output table
For i = 1 to 3
With Worksheets("Sheet2")
.Cells(i 1, 1) = testArray(i)
.Cells(i, i 1) = testArray(i)
End With
Next i
End Sub
Ответ №2:
Вы также можете выполнить это без VBA.
Предположим, что ваша таблица данных находится в диапазоне A1: C9. Предположим, что первым числом (0) в таблице данных 3 на 3 является ячейка F3 с A, B, C в строке выше и A, B, C в столбце слева.
Введите формулу в ячейку F3 как
=INDEX($C$1:$C$9,SUMPRODUCT(--($A$1:$A$9=$E3),--($B$1:$B$9=F$2),ROW($A$1:$A$9)))
Скопируйте эту формулу во все 9 ячеек в таблице 3 на 3.
Это обобщено для любого размера данных.