2010-11-15 73 views
1

我有一大串文本字符串。我知道一些字符串在这个列表中不止一次出现。字符串出现的频率在下一列中。如何列出变量列表中的所有位置?

现在让我们假设文本字符串“hello”发生17次。我将如何获得此文本中的所有位置?

任何帮助表示赞赏。

+0

您正在使用什么样的名单呢?既然你说“列”,我现在怀疑它可能是一个列表框,是这样吗? – 2010-11-15 09:49:35

+0

嗨,托尼,它基本上只是一个文本字符串的列。该列中的每个单元格都包含1个字符串。 – Pieter 2010-11-15 09:52:27

回答

1

Asuming你所有的字符串是在一列,你可以与他们的位置(行号)添加第二个栏和整个显示计数的字符串做一个透视表。

为了获得您感兴趣的字符串的位置,您可以使用数据透视表的下钻功能(双击字符串旁边的计数),这将创建一个包含所有详细信息的新工作表记录 - 并且位置将显示

希望帮助

好锁

编辑后的意见交换:

我会去的,它可以扫描你的数据只有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 

从 “Lorem存有” 与500个字测试 - 采用在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           

希望帮助

+0

嗨迈克,感谢您的建议,但我的名单有成千上万的条目..我真的想要一种方法来自动而不是手动地做到这一点。 – Pieter 2010-11-16 03:41:45

+0

好的......所以如果创建一次然后刷新(通过一次按键)的数据透视不能完成这项工作,那么您希望如何完成这项工作?你在输入框中输入一个字符串,并希望得到一个“found ### times”形式的结果,或者你想要一个列表字符串/ count ......你能详细说明一下吗? – MikeD 2010-11-16 09:01:51

+0

我们只是说列A由几千个字符串组成,这些字符串对于该列可能是唯一的,也可能不是唯一的。他们在专栏中的位置将被保留,但是,排序不是一种选择。 B栏示出的次该行中的特定的字符串在列A中发生的量 我的理想的解决办法,给定A和B参数时,拿出在列C到N A列表,每个元件在哪里该列表等于A中所有字符串的行号相等。 希望这是明确的..抱歉格式化,评论不允许段落.. – Pieter 2010-11-16 09:54:00

1

彼得,

退房this post of Stack Overflow

我也试图调整他们的示例代码来匹配你的情况,我很抱歉,虽然这可能无法编译,我现在无法测试它,而我的VBA有点生疏,但你明白了。

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 

这个函数应该返回一个你可以处理的所有事件的数组,但是你喜欢。你只需要传入你正在寻找的字符串和要在其中搜索的列号。

我希望这有助于!

托尼

+0

感谢您的广泛答复。目前它还没有工作(我收到#value!错误),但我会继续修补并明天报告。 – Pieter 2010-11-15 11:01:50

+0

嗨托尼,尝试做这项工作,但无济于事。在我的工作表中,我输入= CheckValues1(7,G1);这些字符串在列G. 我的VBA技能绝不是足够的,所以我希望你对此有所了解:就我所见,程序会遍历列中的所有单元格,并检查它们的值是否等于当前单元格。但如果这是真的会发生什么?假?程序指示函数在哪里打印位置阵列? “发生(索引)”是做什么的? 谢谢。 ps:我在代码中的'<>'后面删除了'='。 – Pieter 2010-11-16 02:44:48

+1

嗨,彼得,我很抱歉,但我努力提供足够的信息。我的VBA技能不仅仅限于访问,我从来没有在VBA中使用过Excel。发生(索引)基本上将行号添加到发生数组。我已将代码添加到消息框以显示您的方式。 – 2010-11-16 09:51:46