【问题标题】:Remove text appearing between two characters - multiple instances - Excel删除出现在两个字符之间的文本 - 多个实例 - Excel
【发布时间】:2017-04-16 20:02:46
【问题描述】:

在 Microsoft Excel 文件中,我在行中有一个如下所示的文本:

1. Rc8 {[%emt 0:00:05]} Rxc8 {[%emt 0:00:01]} 2. Rxc8 {[%emt 0:00:01]} Qxc8 {} 3. Qe7#  1-0

我需要删除出现在花括号 {} 中的所有文本,包括括号本身。

在上面的例子中,有三个这样的花括号实例。但有些行可能不止这些。

我试过=MID(LEFT(A2,FIND("}",A2)-1),FIND("{",A2)+1,LEN(A2))

这将输出到:{[%emt 0:00:05]}。如您所见,这是花括号之间的第一个文本实例。

如果我们像这样在 SUBSTITUTE 中使用它:=SUBSTITUTE(A2,MID(LEFT(A2,FIND("}",A2)),FIND("{",A2),LEN(A2)),"")

我得到这样的输出:

1. Rc8 Rxc8 {[%emt 0:00:01]} 2. Rxc8 {[%emt 0:00:01]} Qxc8 {} 3. Qe7# 1-0

如果您已经注意到,只会删除一个实例。如何使其适用于所有实例?谢谢。

【问题讨论】:

  • 您是否愿意使用 vba 编写自定义函数来执行此操作?或者,您能否在工作表中根据需要多次重复您的功能以删除所有字符串?
  • 有几千行。我认为自定义功能可能会更好。我已经使用了@dirk-reichel 的功能,并且效果很好。

标签: excel excel-formula vba


【解决方案1】:

突出显示所有内容 去更换 在文本中输入 {*} 进行替换 留空替换

这应该替换所有花括号和它们之间的任何东西

【讨论】:

    【解决方案2】:

    没有VBA没那么容​​易,但还是有办法的。

    要么(如 yu_ominae 所建议的那样)只需使用这样的公式并自动填充它:

    =IFERROR(SUBSTITUTE(A2,MID(LEFT(A2,FIND("}",A2)),FIND("{",A2),LEN(A2)),""),A2)
    

    另一种方法是迭代计算(转到选项 -> 公式 -> 选中“启用迭代计算”按钮)
    现在要在一个单元格中执行此操作,您需要 1 个辅助单元格(在我的示例中,我们将使用 C1)并在 B2 中使用这样的公式并自动填写:

    =IF($C$1,A2,IFERROR(SUBSTITUTE(B2,MID(LEFT(B2,FIND("}",B2)),FIND("{",B2),LEN(B2)),""),B2))
    

    在 C1 中输入“1”,B:B 中的所有公式都会显示 A:A 的值。现在转到 C1 并按几次 del 键(您会看到“{}”部分消失),直到一切看起来都像您想要的那样。

    编辑:要通过 VBA 但没有正则表达式,您可以简单地将其放入模块中:

    Public Function DELBRC(ByVal str As String) As String
      While InStr(str, "{") > 0 And InStr(str, "}") > InStr(str, "{")
        str = Left(str, InStr(str, "{") - 1) & Mid(str, InStr(str, "}") + 1)
      Wend
      DELBRC = Trim(str)
    End Function
    

    然后在工作表中直接使用:

    =DELBRC(A2)
    

    如果你还有任何问题,尽管问;)

    【讨论】:

      【解决方案3】:

      尝试用户定义的函数。在 VBA 中创建对“Microsoft VBScript 正则表达式 5.5”的引用。然后将此代码添加到模块中。

      Function RemoveTags(ByVal Value As String) As String
          Dim rx As New RegExp
          rx.Global = True
          rx.Pattern = " ?{.*?}"
          RemoveTags = Trim(rx.Replace(Value, ""))
      End Function
      

      在单元格的工作表中输入:=RemoveTags(A1) 或您要删除文本的任何地址。

      如果你想在 VBA 中测试它:

      Sub test()
          Dim a As String
          a = "Rc8 {[%emt 0:00:05]} Rxc8 {[%emt 0:00:01]}"
          Debug.Print RemoveTags(a)
      End Sub
      

      输出“Rc8 Rxc8”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-24
        • 1970-01-01
        • 2014-04-26
        • 2022-11-25
        • 1970-01-01
        • 2020-06-22
        • 2015-11-10
        • 2017-12-04
        相关资源
        最近更新 更多