2015-11-24 2 views
0

У меня есть следующие колонки K в Excel:Строка расколоть и сосчитать в Excel

K   
2 Apps -                
3 Appointed CA - Apps - Assist - Appointed NA - EOD Efficiency 
4 Appointed CA - 
5 Appointed CA - 

Я хочу разделить на - и подсчитать количество вхождений определенных слов в строке.

Я попробовал следующую формулу, которая расщепляет мою строку и возвращает все LEFT к -

=LEFT(K2, FIND("-", K2) - 2) 

Но идеальный выход должен быть:

Apps  Appointed CA  Assist Appointed NA  EOD Efficiency 
1 
1   1     1   1     1 
      1 
      1 

На основании приведенных выше данных.

Привет,

+0

Вы можете иметь несколько вхождений в строку? Например, если столбец 'K' имел две« Приложения »? '3 Назначенный CA - Приложения - Приложения - Помощник - Назначен NA - Эффективность EOD' – SteveTurczyn

+0

Возможно, вы можете использовать преобразование текста в столбцы, используя« - »в качестве разделителя. Затем вы можете преобразовать весь диапазон в один столбец и подсчитать экземпляры уникальных значений. – davidmneedham

+0

@SteveTurczyn. да может быть несколько вхождений в строку – Shery

ответ

3

Вот 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 

1

Если предположить, что начинается диапазон результатов в столбце L:

L2: =IF(FIND("Apps", K2, 1) <> 0, 1, "")
M2: =IF(FIND("Appointed CA", K2, 1) <> 0, 1, "")

т.д.

автозаполнения вниз.

EDIT:

Предполагая, что все возможные комбинации строк мы ищем, как известно, раньше времени, должно работать. Если возможные комбинации строк неизвестны, я бы рекомендовал создать UDF, чтобы отсортировать все.

Во всяком случае, предполагая, что строки известны, следуя тому же принципу, как указано выше:

L2: =IF(FIND("Apps", K2, 1) <> 0, (LEN(K2) - LEN(SUBSTITUTE(K2, "Apps", ""))/LEN(K2)), "")
M2: =IF(FIND("Appointed CA", K2, 1) <> 0, (LEN(K2) - LEN(SUBSTITUTE(K2, "Appointed CA", ""))/LEN(K2)), "")

Увеличение столько строк, как вам нравится, автозаполнение вниз.

+0

@Shery: глядя на ответы, которые вы даете в комментариях к своему вопросу, мое решение не заполняет все эти требования , Например, он не будет учитывать вхождения выбранной строки, он просто найдет, есть ли какие-либо вхождения или нет. – Vegard

+0

См. Отредактированный ответ для улучшения. – Vegard

Смежные вопросы