Копировать значения между двумя символами VBA - PullRequest
0 голосов
/ 28 января 2020

У меня проблема со значением копии между одними и теми же символами. Пример ниже.

Допустим, у нас есть такой текст:

"asd|qweeee|1123444|45555512345|swdq|" or 
"asdddd|qwwweeee|1123444|45555512345990|swdq|"

Можно ли получить значение "1123444" из этой строки?

Я хочу скопировать значения после 4 встречающихся символов, таких как «|».

другими словами:

Скопировать значение между вторыми «|» и третий "|".

Длина строки не одинакова.

Буду очень благодарен за любые советы и помощь.

Ответы [ 4 ]

2 голосов
/ 28 января 2020
Debug.Print Split(<your_string>, "|")(2)

В вашем примере это вернет "1123444". Обратите внимание, что Split вернет массив с начальным индексом 0.

  • 1-й элемент = Split(<your string>, "|")(0)
  • 2-й элемент = Split(<your string>, "|")(1)
  • Et c ..

Если вы получили пустые элементы в возвращенном массиве, либо l oop их, либо убедитесь, что вы их предварительно "отфильтровали", например:

Debug.Print Split(Application.Trim(Replace(<your_string>, "|", " ")), " ")(2)
1 голос
/ 28 января 2020
Dim s As String, items
s = "asd|qweeee|1123444|45555512345|swdq|"

items = Split(s, "|")
MsgBox items(2)
0 голосов
/ 28 января 2020

Похоже, что вы не хотите включать пустые сегменты при определении того, что возвращать.

В этом случае вы также можете использовать регулярное выражение:

Option Explicit
Function extrSegment(S As String, Optional Segment As Long = 3) As String
    Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "([^|]+)"
    .Global = True
    If .Test(S) = True Then
        extrSegment = .Execute(S)(Segment - 1).submatches(0)
    End If
End With
End Function

Обратите внимание, что в функции есть необязательный аргумент для возвращаемого сегмента, где 1 - первый сегмент.

Вы также можете сделать это с формулой рабочего листа, особенно если у вас Excel 2013+ с FILTERXML function:

=FILTERXML("<t><s>" & SUBSTITUTE(A1,"|","</s><s>")& "</s></t>","//s[text()!=''][3]")

Эта формула также исключит пустые сегменты, из определения которых # 3. Однако если сегмент имеет начальные нули, они будут удалены функцией FILTERXML.

Оба метода приводят к:

enter image description here

Редактировать:

Если вы хотите включить в счетчик пустые узлы / сегменты, вы можете удалить текстовый тест из xPath в формуле.

Если вы сделаете это, FILTERXML вернет ошибку для пустого узла, поэтому нам нужно проверить это:

=IFERROR(FILTERXML("<t><s>" & SUBSTITUTE(E1,"|","</s><s>")& "</s></t>","//s[3]"),"")

и UDF можно упростить до:

Function extrSegment(S As String, Optional Segment As Long = 4, Optional Delimiter As String = "|") As String
    extrSegment = Split(S, Delimiter)(Segment-1) 'array will be 0-based
End Function
0 голосов
/ 28 января 2020

Для вашего последнего запроса используйте следующий код:

Sub testStringArr()
  Dim x As String
   x = "asd|||qweeee||1123444|45555512345|swdq|"
   Debug.Print Split(Replace(Replace(Trim(x), "|||", "|"), "||", "|"), "|")(2)
End Sub

Но если ваша строка содержит «| | |» происходит от функции, которая не может найти некоторые элементы и вводит пробелы "", разделенные "|", лучше знать, откуда эта строка извлечена, и использовать ее как есть, без формулы колбасы. Просто разделите его на "|" и верните соответствующее количество элементов массива в соответствии с вашим исследованием происхождения строки.

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