Не могу решить по аналогии ни с одним из накопленных мною на этом форуме решений. Прошу помощи с решением данной задачи. Возможно, можно решить и формулами. Файл приложил.
Доброй ночи, уважаемые форумчане!
Как из таблицы вида слева сделать таблицу справа?
Не могу решить по аналогии ни с одним из накопленных мною на этом форуме решений. Прошу помощи с решением данной задачи. Возможно, можно решить и формулами. Файл приложил.ant6729
Sub test() Dim i&, dic As Object, imax&, dic2 As Object Dim arr(), arr1$(), lrow&, ikey, x& Set dic = CreateObject("scripting.dictionary") Set dic2 = CreateObject("scripting.dictionary") On Error Resume Next With Лист1 lrow = .Cells(.Rows.Count, 1).End(xlUp).Row For i = 1 To lrow dic.Item(CStr(.Cells(i, 1))) = dic.Item(CStr(.Cells(i, 1))) + 1 dic2.Item(CStr(.Cells(i, 1))) = dic2.Item(CStr(.Cells(i, 1))) & .Cells(i, 2) & " " Next i imax = Application.Max(dic.items) i = 0 ReDim arr(1 To dic.Count, 1 To imax + 1) For Each ikey In dic2.keys i = i + 1: arr(i, 1) = ikey arr1 = Split(Trim(dic2.Item(ikey)), " ") For x = 2 To UBound(arr, 2) arr(i, x) = arr1(x - 2) Next x Next ikey On Error GoTo 0 .[d1].Resize(UBound(arr), UBound(arr, 2)) = arr End With End Sub
[/vba]
[vba]
Код
Option Explicit
Sub test() Dim i&, dic As Object, imax&, dic2 As Object Dim arr(), arr1$(), lrow&, ikey, x& Set dic = CreateObject("scripting.dictionary") Set dic2 = CreateObject("scripting.dictionary") On Error Resume Next With Лист1 lrow = .Cells(.Rows.Count, 1).End(xlUp).Row For i = 1 To lrow dic.Item(CStr(.Cells(i, 1))) = dic.Item(CStr(.Cells(i, 1))) + 1 dic2.Item(CStr(.Cells(i, 1))) = dic2.Item(CStr(.Cells(i, 1))) & .Cells(i, 2) & " " Next i imax = Application.Max(dic.items) i = 0 ReDim arr(1 To dic.Count, 1 To imax + 1) For Each ikey In dic2.keys i = i + 1: arr(i, 1) = ikey arr1 = Split(Trim(dic2.Item(ikey)), " ") For x = 2 To UBound(arr, 2) arr(i, x) = arr1(x - 2) Next x Next ikey On Error GoTo 0 .[d1].Resize(UBound(arr), UBound(arr, 2)) = arr End With End Sub
x = Range("A1").CurrentRegion.Value ReDim y(1 To UBound(x), 1 To UBound(x) + 1)
For i = 1 To UBound(x) If x(i, 1) <> s Then s = x(i, 1) cl = 2: rw = rw + 1 y(rw, 1) = x(i, 1) y(rw, 2) = x(i, 2) Else cl = cl + 1: If cl > clMx Then clMx = cl y(rw, cl) = x(i, 2) End If Next i
With Range("D1") .CurrentRegion.ClearContents .Resize(rw, clMx).Value = y() End With End Sub
[/vba]
как вариант:
[vba]
Код
Sub ertert() Dim x, y(), i&, s$, rw, cl, clMx&
x = Range("A1").CurrentRegion.Value ReDim y(1 To UBound(x), 1 To UBound(x) + 1)
For i = 1 To UBound(x) If x(i, 1) <> s Then s = x(i, 1) cl = 2: rw = rw + 1 y(rw, 1) = x(i, 1) y(rw, 2) = x(i, 2) Else cl = cl + 1: If cl > clMx Then clMx = cl y(rw, cl) = x(i, 2) End If Next i
With Range("D1") .CurrentRegion.ClearContents .Resize(rw, clMx).Value = y() End With End Sub