как преобразовать три столбца в матрицу с помощью макроса

#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.

Это обобщено для любого размера данных.