Это будет работать для вашего набора данных.Это довольно простая реализация, поэтому вам нужно будет настроить то, что вам нужно.
Вам нужно будет создать новый рабочий лист с именем Output , чтобы он работал.
Вам также нужно добавить ссылку в вашем проекте VBA на Microsoft Scripting Runtime , чтобы заставить его работать (здесь мы надеемся, что вы не на Mac).
Просто выберите диапазон данных и смотрите.
Public Sub DoTranspose()
Dim objValues As Scripting.Dictionary, objSrcCells As Range, objCell As Range
Dim strKey As String, strValue As String, arrValues() As String, varKey As Variant
Dim lngWriteRow As Long, lngWriteCol As Long, i As Long, objDestSheet As Worksheet
Set objValues = New Scripting.Dictionary
' Use a new sheet called "Output" for the results.
Set objDestSheet = Sheets("Output")
' Simply use the selected set of cells as the data for the transposition.
Set objSrcCells = Selection
For Each objCell In objSrcCells
strValue = objCell.Value
strKey = UCase(Left(strValue, Len(strValue) - 3))
If Not objValues.Exists(strKey) Then
' The key doesn't exist, therefore, add it and add the first value.
ReDim arrValues(0)
arrValues(0) = strValue
objValues.Add strKey, arrValues
Else
' The key exists, append to the values array.
arrValues = objValues.Item(strKey)
ReDim Preserve arrValues(UBound(arrValues) + 1)
arrValues(UBound(arrValues)) = strValue
objValues.Item(strKey) = arrValues
End If
Next
lngWriteCol = 0
objDestSheet.Cells.Clear
' Write the results of the dictionary out to the destination sheet.
For Each varKey In objValues.Keys
lngWriteRow = 0
lngWriteCol = lngWriteCol + 1
arrValues = objValues.Item(varKey)
For i = 0 To UBound(arrValues)
lngWriteRow = lngWriteRow + 1
objDestSheet.Cells(lngWriteRow, lngWriteCol) = arrValues(i)
Next
Next
objDestSheet.Columns.AutoFit
End Sub
Надеюсь, это поможет вам.