Вот VBA макрос, который будет
- Создать уникальный список фраз, из всех данных
- Создания «строки заголовка», содержащая фразы для выхода
- Пройтись оригиналом данные снова и генерировать подсчеты для каждой фразы
Как написано, макрос не зависит от регистра. Чтобы сделать его чувствительным к регистру, можно было бы изменить способ генерации уникального списка - с помощью объекта Dictionary вместо коллекции.
Чтобы ввести этот макрос (Sub), alt-F11
открывает редактор Visual Basic. Убедитесь, что ваш проект выделен в окне Project Explorer. Затем в верхнем меню выберите «Вставить/Модуль» и вставьте код ниже в открывшееся окно. Должно быть очевидно, где внести изменения, чтобы обрабатывать варианты, в которых находятся исходные данные, и где вы хотите получить результаты.
Чтобы использовать этот макрос (Sub), alt-F8
открывает диалоговое окно макроса. Выберите макрос по имени и RUN
.
Он будет генерировать результаты, за ваш идеальный выход выше
Option Explicit
Option Compare Text
Sub CountPhrases()
Dim colP As Collection
Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range
Dim vSrc As Variant, vRes() As Variant
Dim I As Long, J As Long, K As Long
Dim V As Variant, S As String
'Set Source and Results worksheets and ranges
Set wsSrc = Worksheets("sheet1")
Set wsRes = Worksheets("sheet2")
Set rRes = wsRes.Cells(1, 1) 'Results will start in A1 on results sheet
'Get source data and read into array
With wsSrc
vSrc = .Range("K2", .Cells(.Rows.Count, "K").End(xlUp))
End With
'Collect unique list of phrases
Set colP = New Collection
On Error Resume Next 'duplicates will return an error
For I = 1 To UBound(vSrc, 1)
V = Split(vSrc(I, 1), "-")
For J = 0 To UBound(V)
S = Trim(V(J))
If S <> "" Then colP.Add S, CStr(S)
Next J
Next I
On Error GoTo 0
'Dimension results array
'Row 0 will be for the column headers
ReDim vRes(0 To UBound(vSrc, 1), 1 To colP.Count)
'Populate first row of results array
For J = 1 To colP.Count
vRes(0, J) = colP(J)
Next J
'Count the phrases
For I = 1 To UBound(vSrc, 1)
V = Split(vSrc(I, 1), "-")
For J = 0 To UBound(V)
S = Trim(V(J))
If S <> "" Then
For K = 1 To UBound(vRes, 2)
If S = vRes(0, K) Then _
vRes(I, K) = vRes(I, K) + 1
Next K
End If
Next J
Next I
'write results
Set rRes = rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2))
With rRes
.EntireColumn.Clear
.Value = vRes
.EntireColumn.AutoFit
End With
End Sub
Вы можете иметь несколько вхождений в строку? Например, если столбец 'K' имел две« Приложения »? '3 Назначенный CA - Приложения - Приложения - Помощник - Назначен NA - Эффективность EOD' – SteveTurczyn
Возможно, вы можете использовать преобразование текста в столбцы, используя« - »в качестве разделителя. Затем вы можете преобразовать весь диапазон в один столбец и подсчитать экземпляры уникальных значений. – davidmneedham
@SteveTurczyn. да может быть несколько вхождений в строку – Shery