Как перечислить все позиции переменной в списке? - PullRequest
1 голос
/ 15 ноября 2010

У меня большой список текстовых строк. Я знаю, что некоторые строки встречаются в этом списке более одного раза. Частота появления строк приведена в следующем столбце.

Теперь, скажем, текстовая строка "привет" встречается 17 раз. Как бы я получить все позиции этого текста в списке?

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Предполагая, что все ваши строки находятся в одном столбце, вы можете добавить второй столбец с их позицией (номером строки) и создать сводную таблицу поперек строк, отображающую количество.

Чтобы получить позицию(и) интересующей вас строки, вы используете функцию детализации сводной таблицы (двойной щелчок на счетчике рядом со строкой), который создаст новый лист со всеми подробными записями - и позиция будет отображаться

Надеюсь, что это поможет

Хорошая блокировка

РЕДАКТИРОВАТЬ после обмена комментариями:

Я бы выбрал решение, которое сканирует ваши данные только 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                                        

Надеюсь, что поможет

1 голос
/ 15 ноября 2010

Pieter

Проверьте это сообщение переполнения стека .

Я также попытался настроить их пример кода, чтобы он соответствовал вашему случаю, извините, что он может не скомпилироваться, я не могу проверить его в данный момент, и мой VBA немного ржавый, но вы поняли. 1007 *

Function CheckValues1(byval columnToCheck as Integer, byval stringToFind as String) as Integer()
    dim rwIndex As Integer
    dim index as Integer
    dim occurrences() As Integer
    index = 0

    For rwIndex = 0 to Cells(Rows.Count, columnToCheck).End(xlUp).Row

       ReDim Preserve occurrences(0 to index)

       If Cells(rwIndex, columnToCheck).Value = stringToFind Then
           occurrences(index) = rwIndex
           index = index + 1
       End If

    Next rwIndex

    dim output as String
    output = output & (Len(occurrences)-1) & " occurrences found." & vbcrlf & vbcrlf
    For index = 0 to LBound(occurrences)

        output = output & "Line: " & index & vbcrlf

    Next index
    MsgBox output

End Sub

Эта функция должна возвращать массив всех вхождений, с которыми вы можете справиться, как вам нравится. Вам просто нужно указать строку, которую вы ищете, и номер столбца для поиска.

Надеюсь, это поможет!

Tony

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...