Предполагая, что все ваши строки находятся в одном столбце, вы можете добавить второй столбец с их позицией (номером строки) и создать сводную таблицу поперек строк, отображающую количество.
Чтобы получить позицию(и) интересующей вас строки, вы используете функцию детализации сводной таблицы (двойной щелчок на счетчике рядом со строкой), который создаст новый лист со всеми подробными записями - и позиция будет отображаться
Надеюсь, что это поможет
Хорошая блокировка
РЕДАКТИРОВАТЬ после обмена комментариями:
Я бы выбрал решение, которое сканирует ваши данные только 1 раз, а не рекурсивно, копируязначения для второго листа:
for each string in sourcetable
if found in targettable
increase targettable.counter by 1 (remark: in column_2)
else
put sourcetable.string at end of targettable
put "1" in targettable.counter (remark: occurence = 1 in column_2)
endif
put sourcetable.index into targettable.column(counter+2)
next
пока что метакод .... Вам нужна дополнительная помощь для фактического кодирования этого в VBA?
РЕДАКТИРОВАТЬ 2
ОК.... сделал быстрый и грязный ....
Sub CountString()
Dim S As Range, T As Range, Idx As Long, Jdx As Long
Set S = Worksheets("Sheet1").[A2] ' first row is header
Set T = Worksheets("Sheet2").[A2] ' first row is header
Idx = 1
Do While S(Idx, 1) <> ""
Jdx = FindInRange(T, S(Idx, 1))
If T(Jdx, 1) = "" Then
T(Jdx, 1) = S(Idx, 1)
T(Jdx, 2) = 1
T(Jdx, 3) = Idx
Else
T(Jdx, 2) = T(Jdx, 2) + 1
T(Jdx, T(Jdx, 2) + 2) = Idx
End If
Idx = Idx + 1
Loop
End Sub
Function FindInRange(R As Range, A As String) As Long
Dim Idx As Long
Idx = 1
Do While R(Idx, 1) <> ""
If R(Idx, 1) = A Then
Exit Do
End If
Idx = Idx + 1
Loop
FindInRange = Idx
End Function
протестирован с 500 словами из "Lorem ipsum" - занимает менее 1 секунды, вывод в sheet_2 выглядит как
String Count Position ...
Lorem 1 1
ipsum 6 2 45 65 232 323 462
dolor 5 3 42 214 321 335
sit 6 4 79 148 249 295 415
amet 6 5 80 149 250 296 416
consectetur 8 6 117 288 298 396 457 473 486
adipiscing 3 7 180 402
Надеюсь, что поможет