我有一大串文本字符串。我知道一些字符串在这个列表中不止一次出现。字符串出现的频率在下一列中。如何列出变量列表中的所有位置?
现在让我们假设文本字符串“hello”发生17次。我将如何获得此文本中的所有位置?
任何帮助表示赞赏。
我有一大串文本字符串。我知道一些字符串在这个列表中不止一次出现。字符串出现的频率在下一列中。如何列出变量列表中的所有位置?
现在让我们假设文本字符串“hello”发生17次。我将如何获得此文本中的所有位置?
任何帮助表示赞赏。
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
希望帮助
嗨迈克,感谢您的建议,但我的名单有成千上万的条目..我真的想要一种方法来自动而不是手动地做到这一点。 – Pieter 2010-11-16 03:41:45
好的......所以如果创建一次然后刷新(通过一次按键)的数据透视不能完成这项工作,那么您希望如何完成这项工作?你在输入框中输入一个字符串,并希望得到一个“found ### times”形式的结果,或者你想要一个列表字符串/ count ......你能详细说明一下吗? – MikeD 2010-11-16 09:01:51
我们只是说列A由几千个字符串组成,这些字符串对于该列可能是唯一的,也可能不是唯一的。他们在专栏中的位置将被保留,但是,排序不是一种选择。 B栏示出的次该行中的特定的字符串在列A中发生的量 我的理想的解决办法,给定A和B参数时,拿出在列C到N A列表,每个元件在哪里该列表等于A中所有字符串的行号相等。 希望这是明确的..抱歉格式化,评论不允许段落.. – Pieter 2010-11-16 09:54:00
彼得,
退房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
这个函数应该返回一个你可以处理的所有事件的数组,但是你喜欢。你只需要传入你正在寻找的字符串和要在其中搜索的列号。
我希望这有助于!
托尼
感谢您的广泛答复。目前它还没有工作(我收到#value!错误),但我会继续修补并明天报告。 – Pieter 2010-11-15 11:01:50
嗨托尼,尝试做这项工作,但无济于事。在我的工作表中,我输入= CheckValues1(7,G1);这些字符串在列G. 我的VBA技能绝不是足够的,所以我希望你对此有所了解:就我所见,程序会遍历列中的所有单元格,并检查它们的值是否等于当前单元格。但如果这是真的会发生什么?假?程序指示函数在哪里打印位置阵列? “发生(索引)”是做什么的? 谢谢。 ps:我在代码中的'<>'后面删除了'='。 – Pieter 2010-11-16 02:44:48
嗨,彼得,我很抱歉,但我努力提供足够的信息。我的VBA技能不仅仅限于访问,我从来没有在VBA中使用过Excel。发生(索引)基本上将行号添加到发生数组。我已将代码添加到消息框以显示您的方式。 – 2010-11-16 09:51:46
您正在使用什么样的名单呢?既然你说“列”,我现在怀疑它可能是一个列表框,是这样吗? – 2010-11-15 09:49:35
嗨,托尼,它基本上只是一个文本字符串的列。该列中的每个单元格都包含1个字符串。 – Pieter 2010-11-15 09:52:27