创建自定义函数以从字符串中删除括号中的上下文

时间:2018-04-12 09:35:11

标签: excel vba excel-vba

我想创建一个自定义函数,允许我从字符串中删除括号中的内容。假设我有一个字符串:“508(7S9 5DU)609(609)”,我希望有一个函数接收此字符串并转入“508 609”。

我一直在玩VBA编辑器,但我的VBA编程技巧非常有限,更不用说不存在了。

我提出了以下简洁的代码,但不幸的是它没有完成这项工作:

Function DelPar(Source As Range)

Source.Replace What:="(*) ", Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

End Function

当我输入“= DelPar(源参考)”时,我获得“0”作为值...

提前感谢您的帮助,

祝你好运。

3 个答案:

答案 0 :(得分:3)

您无法在UDF中使用Range.Replace。您可以像这样使用正则表达式:

Function DelPar(Source As String)
    With CreateObject("vbscript.regexp")
      .Global = True
      .Pattern = "\([\w ]+\)"
      DelPar = Application.Trim(.Replace(Source, ""))
   End With
End Function

答案 1 :(得分:2)

此宏将首先计算有"("")"有多少对 - 但是,它目前不区分"(*)"")*(" < strong> {EDIT} 添加了一个检查,如果不存在"(*)",则提前退出While循环,仅")*(",并通过替换{{使循环计数与应用程序无关1}}

然后为每对循环一次,并构建一个以WorksheetFunction.Max开头的字符串,并运行到下一个"(",并用")"替换该字符串(即删除)它)。 如果在达到""之前达到第二个"(",则会从")"重新启动字符串。

"("

答案 2 :(得分:0)

此UDF会查找每对括号,并会删除它们之间的内容。

Public Function DELETE_BETWEEN_BRACKETS(ByRef ThisCell As Range) As String
If ThisCell.Count <> 1 Then
    DELETE_BETWEEN_BRACKETS = "ERROR: Only 1 cell allowed"
    Exit Function
End If

Dim ThisValue As String
Dim MyStart As Integer
Dim MyEnd As Integer

ThisValue = ThisCell.Value

MyStart = InStr(1, ThisValue, "(")
MyEnd = InStr(1, ThisValue, ")")

Do While MyStart > 0 And MyEnd > 0 And MyEnd > MyStart
    ThisValue = Left(ThisValue, MyStart - 1) & Right(ThisValue, Len(ThisValue) - MyEnd)
    MyStart = InStr(1, ThisValue, "(")
    MyEnd = InStr(1, ThisValue, ")")
Loop


DELETE_BETWEEN_BRACKETS = Application.WorksheetFunction.Trim(ThisValue) 'we delete double spaces

End Function

注意我在删除每对括号后在末尾添加了Trim以清除那些双空格,并且在字符串末尾删除空格。

用值508 (7S9 5DU) 609 (609)(23个字符长)测试后,我得到508 609(7个字符长)。

根据您的需要进行调整。