Как получить часть строки после специального символа? - PullRequest
3 голосов
/ 02 марта 2020

У меня есть столбец, в котором я собираю увеличивающиеся значения нумерации, и их формат - xx_yy, поэтому первый - 1_0, второй - 1_1 и т. Д., Нет, мы находимся на 23_31

Я хочу получить правую сторону от строка, и я уже правильно получаю левую сторону. используя

newActionId = Left(lastActionID, (Application.WorksheetFunction.Find("_", lastActionID, 1) - 1))

i wi sh, чтобы сделать следующее, человеческое письмо ниже

nextSubid = entire stringvalue AFTER special character "_"

Я попытался просто переключиться влево, не так go так хорошо, у вас есть предложение?

Ответы [ 4 ]

4 голосов
/ 02 марта 2020

Вы можете использовать Функция разделения , чтобы получить соответствующий текст.

Синтаксис: Разделить (выражение, [разделитель, [предел, [сравнить]]]) *

Option Explicit

Sub Sample()
    Dim id As String
    Dim beforeSplChr As String
    Dim afterSplChr As String

    id = "23_31"

    beforeSplChr = Split(id, "_")(0)
    afterSplChr = Split(id, "_")(1)

    Debug.Print beforeSplChr
    Debug.Print afterSplChr
End Sub

Другой способ

Debug.Print Left(id, (InStrRev(id, "_", -1) - 1)) '<~~ Left Part
Debug.Print Right(id, (InStrRev(id, "_", -1) - 1)) '<~~ Right Part
2 голосов
/ 02 марта 2020

Несмотря на то, что Сиддхарт Роут дал то, что, вероятно, можно считать лучшим ответом здесь , я чувствовал, что это стоит добавить:

Чтобы получить вторую часть строки, используя ваш оригинал метод, вы хотели бы использовать Mid функция вместо Left, а не пытаться использовать Right.

Mid (строка, начало, [длина] )
Возвращает длина символов из строка , начиная с начало позиция
Если длина не указана, то символы будут возвращаться из позиции start до конца строки

newActionId = Mid(lastActionID, Application.WorksheetFunction.Find("_", lastActionID, 1) + 1)
1 голос
/ 02 марта 2020

Просто для удовольствия (Split - это способ go здесь), альтернативный способ с использованием регулярных выражений:

Sub Test()

Dim str As String: str = "23_31"

With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "\d+"
    Debug.Print .Execute(str)(0) 'Left Part
    Debug.Print .Execute(str)(1) 'Right Part
End With

End Sub

Кстати, согласно моему комментарию, ваше первое значение также может быть достигнуто через:

Debug.Print Val(str)
0 голосов
/ 02 марта 2020

Функция разделения строки очень полезна для этого типа запроса. Нравится:

String s = "23_34";
String left = s.split("_")[0];
String right = s.split("_")[1];

Or you can also use combination of indexOf and substring method together.
String left = s.substring(0,s.indexOf('_')+1)
String right = s.substring(s.indexOf('_'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...