2015-06-19 3 views
2

Я хотел знать, есть ли способ извлечь строку из строки, указав начало нескольких символов и символ конца.Извлечь подстроку в строке, указав первую и последнюю подстроку

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

«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 
+1

Если вы делаете много этого, вы можете найти, глядя на регулярные выражения в VBA использования. Он позволяет использовать все виды нарезки и нарезки строки на основе критериев. Это [отличный пост] (http://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops) на тема. –

+0

Строка, которую вы показываете мне: «Str: 1/2/1End: 1/2/2Name: cl-mc-23223322Name: c1-mc-dddssdaInfo: alot of detailName: c1-asa-dddssdatask: asdfName: c1 -mc-xd132eds «В строке нет« вводится ». Возможно, вы имеете в виду «Str: 1/2/1» и vbLF & «End: 1/2/2» & vbLF & «Имя: cl-mc-23223322» & vbLF ... –

+0

@Byron благодарит за ссылку. –

ответ

0

EDIT после повторного чтения вашего вопроса Я думаю, что я не ответил на него правильно. Пожалуйста, дайте более подробную информацию о том, что на самом деле содержится в каждой ячейке, и о количестве ячеек, о которых мы говорим (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) 

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

EDIT 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 
+0

Строка, которую я отправил в моем вопросе, - это значение ячейки столбца, в котором описывается событие. Там может быть около 4000-5000 строк с тем же полем. В моем вопросе вы можете увидеть, что есть 4 экземпляра имени I.E "c1-mc-23223322" и так далее. Я хочу, чтобы все имена были извлечены из массива. Код, который вы опубликовали выше, как я могу использовать его для запуска более одного раза на значение ячейки? – Tan12

+0

@Byron спасибо, я буду смотреть в регулярные выражения, а также – Tan12

+0

Помогло ли мое редактирование? Теперь он должен взять все имена в ячейке (я до сих пор не тестировал его, поэтому есть шанс, что, например, добавляется +1 к позициям символов. Используйте debug.print, чтобы выяснить, что добавлено и что вырезано.) –

Смежные вопросы