Получить значение в скобках - PullRequest
8 голосов
/ 09 ноября 2011

У меня есть столбец с некоторыми вещами, который выглядит как следующая строка: V2397(+60)

Как мне получить значение в скобках?В этом случае +60.

Число (и символ) перед скобками не является чем-то стандартизированным и не является числом между скобками (это может быть 100, 10 -10 или даже 0 ...),

Ответы [ 4 ]

12 голосов
/ 09 ноября 2011

VBA-код:

cellValue = "V2397(+60)"
openingParen = instr(cellValue, "(")
closingParen = instr(cellValue, ")")
enclosedValue = mid(cellValue, openingParen+1, closingParen-openingParen-1)

Очевидно, cellValue должно быть прочитано из ячейки.

В качестве альтернативы, если ячейка A1 имеет одно из этих значений, тогда можно использовать следующую формулувывести вложенное значение в другую ячейку:

=Mid(A1, Find("(", A1)+1, Find(")",A1)-Find("(",A1)-1)
4 голосов
/ 09 ноября 2011

Я бы использовал для этого регулярное выражение, поскольку оно легко обрабатывает

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

Подпрограмма Test запускает три примера тестовых строк

В приведенном ниже коде используется UDF, который вы также можете вызывать непосредственно в Excel, то есть = GetParen(A10)

Function GetParen(strIn As String) As String
    Dim objRegex As Object
    Dim objRegMC As Object
    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
        .Pattern = "\((.+?)\)"
        If .Test(strIn) Then
            Set objRegMC = .Execute(strIn)
            GetParen = objRegMC(0).submatches(0)
        Else
            GetParen = "No match"
        End If
    End With
    Set objRegex = Nothing
End Function

Sub Test()
MsgBox GetParen("V2397(+60)")
MsgBox GetParen("Not me")
MsgBox GetParen(ActiveSheet.Range("A1"))
End Sub
1 голос
/ 19 июня 2017

Спасибо Эндрю Куперу за ответ.

Для тех, кто заинтересован, я переработал в функцию ...

 Private Function GetEnclosedValue(query As String, openingParen As String, closingParen As String) As String
    Dim pos1 As Long
    Dim pos2 As Long

    pos1 = InStr(query, openingParen)
    pos2 = InStr(query, closingParen)

    GetEnclosedValue = Mid(query, (pos1 + 1), (pos2 - pos1) - 1)
End Function

Для использования

value = GetEnclosedValue("V2397(+60)", "(", ")" )
1 голос
/ 09 ноября 2011

Используйте InStr, чтобы получить индекс символа открытой скобки и символа закрывающей скобки;затем используйте Mid для извлечения нужной подстроки.

Использование InStr$ и Mid$ будет работать лучше, если параметры не являются вариантами.

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