String 提取子字符串';通过指定子字符串的第一个和最后一个,在字符串中添加

String 提取子字符串';通过指定子字符串的第一个和最后一个,在字符串中添加,string,vba,excel,String,Vba,Excel,我想知道是否有一种方法可以通过指定开头的几个字符和结尾字符将子字符串从字符串中提取出来 例如,我在工作簿中的一个单元格中的问题底部有一个字符串,每个单元格都有一个类似的大字符串。我想将所有名称提取到一个数组中 “c1 mc-”将始终是名称的前缀。我希望我可以使用一个函数,在这个函数中,我可以指定每个以“c1 mc”开始,以vbLf(enter)结束的子字符串,提取它们。 我认为Instr()和Split()可能会有所帮助,但不确定如何继续 "Str: 1/2/1 End : 1/2/2 Nam

我想知道是否有一种方法可以通过指定开头的几个字符和结尾字符将子字符串从字符串中提取出来

例如,我在工作簿中的一个单元格中的问题底部有一个字符串,每个单元格都有一个类似的大字符串。我想将所有名称提取到一个数组中

“c1 mc-”将始终是名称的前缀。我希望我可以使用一个函数,在这个函数中,我可以指定每个以“c1 mc”开始,以vbLf(enter)结束的子字符串,提取它们。 我认为Instr()和Split()可能会有所帮助,但不确定如何继续

"Str: 1/2/1
End  : 1/2/2
Name: cl-mc-23223322
Name: c1-mc-dddssda
Info: alot of detail
Name: c1-asa-dddssda
task: asdf
Name: c1-mc-xd132eds"



<the code which works>    
For Each rng1 In table1.DataBodyRange.Columns(8).Cells

MyString = rng1.Value
Do Until InStr(MyString, "c1-mc") = 0      
namestart = InStr(MyString, "c1-mc")
name = Mid(MyString, namestart)
nameend = InStr(name, vbLf) - 1
name = Left(name, nameend) 'this gives you a name
namestart = InStr(name, "c1-mc")
name = Mid(name, namestart)
nameend = InStr(name, " ") - 1
If (nameend = -1) Then
nameend = Len(name)
End If
name = Left(name, nameend) ' gives you name incase there are no next lines
MyString = Replace(MyString, name, "") 'this cuts the original string so it now starts where the name ended.
MsgBox name
i = i + 1
Loop
Next
Str:1/2/1 完二〇〇五年一月二日 名称:cl-mc-23223322 名称:c1 mc dddssda 信息:很多细节 名称:c1 asa dddssda 任务:asdf 名称:c1-mc-xd132eds“ 对于表1.DataBodyRange.Columns(8.Cells)中的每个rng1 MyString=rng1.Value 直到InStr(MyString,“c1 mc”)=0为止 namestart=InStr(MyString,“c1-mc”) name=Mid(MyString,namestart) nameend=InStr(名称,vbLf)-1 name=Left(name,nameend)'这将为您提供一个名称 名称开始=仪表(名称,“c1 mc”) name=Mid(name,namestart) nameend=InStr(名称“”)-1 如果(nameend=-1),则 nameend=Len(名称) 如果结束 name=Left(name,nameend)'为您提供名称,以防没有下一行 MyString=Replace(MyString,name,“”)这会剪切原始字符串,因此它现在从名称结束的地方开始。 MsgBox名称 i=i+1 环 下一个
重新阅读您的问题后编辑我认为我没有正确回答。请详细说明每个单元格中实际包含的内容,以及我们讨论的单元格数量(1?)

字符串是字符的串联。将字符串写在几行上并不意味着它实际上会改变。正如您所说,当您输入chr(10)或vbLF时,会发生换行。我不确定您发布的字符串的哪一部分要提取。假设您想要获取单元格的名称,并且字符串保存在字符串变量[mystring]中:

Dim name as string
Dim namestart as integer
Dim nameend as integer

namestart = Instr(Mystring,  "c1-mc-" )
name  = Mid(Mystring, namestart + 1)
nameend = Instr(Mystring, vbLF)
name = Left(name, nameend)
现在name将包含字符串的名称。测试它(我没有,你可能需要调整一些小事情),当你有了它,使用for循环来循环你的单元格,并将名称添加到你想要的数组中

编辑2: 由于您希望提取单元格中该名称的所有实例,因此我将其更改为:

Dim name as string
Dim namestart as integer
Dim nameend as integer
Dim namearray() as string
Dim i as integer

Do Until Instr(Mystring,  "c1-mc-" ) = 0 'will continue filling the array until Mystrign no longer has any names)
    namestart = Instr(Mystring,  "c1-mc-" )
    name  = Mid(Mystring, namestart + 1)
    nameend = Instr(Mystring, vbLF)
    name = Left(name, nameend) 'this gives you a name
    Mystring = Mid(Mystring, Instr(Mystring, name) ) 'this cuts the original string so it now starts where the name ended.
    namearray(i) = name
    i = i + 1
Loop

如果您正在做很多这方面的工作,您可能会发现在VBA中查找正则表达式非常有用。它允许根据标准对字符串进行各种切片和切割。这就是主题。您向我展示的字符串是:“Str:1/2/1结束:1/2/2名称:cl-mc-23223322名称:c1 mc dddsdainfo:alot of detailName:c1 asa dddssdsdsdask:asdfName:c1-mc-xd132eds”字符串中没有“enters”。也许你的意思是“Str:1/2/1”&vbLF&“End:1/2/2”&vbLF&“Name:cl-mc-23223322”&vbLF…@Byron感谢您的参考。我在问题中发布的字符串是描述事件的列的单元格值。同一字段可以有大约4000-5000行。在我的问题中,您可以看到name有4个实例,即“c1-mc-23223322”等等。我想把所有的名字提取成一个数组。您上面发布的代码,我如何使用它在单元格值上运行多次?@Byron谢谢,我也会研究正则表达式我的编辑对您有帮助吗?现在它应该包含单元格中的所有名称(我还没有测试它,因此有可能会将+1添加到字符位置,例如。使用debug.print找出添加的内容和剪切的内容。)我正在使用您提供的代码。有点问题,但我能够提取工作名称。问题是它没有调整字符串的大小,我最终陷入了一个永无止境的循环。我会很快发布代码,以便您可以查看。我已经发布了代码。如前所述,由于删除第一个实例后字符串没有被调整大小,因此我进入了一个永无止境的循环。我现在正在处理的字符串有一个名称重复了4次。这可能是原因吗?