【问题标题】:Excel get multiple sub-strings from a stringExcel从一个字符串中获取多个子字符串
【发布时间】:2019-02-28 17:28:36
【问题描述】:

我在名为Resources(可作为Resources[@Comments] 访问)的工作表中有一个名为Comments 的列的Excel 文件,数据看起来类似于,

+=============================================+
| Comments                                    |
+=============================================+
| [7/2] Level changed from 10 to 9            |
| [14/2] Alignment changed from ABC to XYZ    |
| [21/2] Location changed from US to UK       |
| [28/2] Chapter changed from [blank] to ABCD |
+---------------------------------------------+
| [14/2] Level changed from 5 to 4            |
| [21/2] Location changed from US to UK       |
| [21/2] Chapter changed from JKLM to ABCD    |
+---------------------------------------------+
| [28/2] Chapter changed from EFGH to MNOP    |
+---------------------------------------------+
| [21/2] Location changed from IN to JP       |
+---------------------------------------------+

我正在寻找的输出应该类似于(基本上是在Chapter changed from <SOURCE> to <DESTINATION> 之间提取文本),

+=============================================+==============+==============+
| Comments                                    | Old Chapter  | New Chapter  |
+=============================================+==============+==============+
| [7/2] Level changed from 10 to 9            | [blank]      | ABCD         |
| [14/2] Alignment changed from ABC to XYZ    |              |              |
| [21/2] Location changed from US to UK       |              |              |
| [28/2] Chapter changed from [blank] to ABCD |              |              |
+---------------------------------------------+--------------+--------------+
| [14/2] Level changed from 5 to 4            |              |              |
| [21/2] Location changed from US to UK       |              |              |
| [21/2] Chapter changed from JKLM to ABCD    |              |              |
+---------------------------------------------+--------------+--------------+
| [28/2] Chapter changed from EFGH to MNOP    | EFGH         | MNOP         |
+---------------------------------------------+--------------+--------------+
| [21/2] Location changed from IN to JP       |              |              |
+---------------------------------------------+--------------+--------------+

注意事项:

  • 单元格可能没有任何“章节更改”文本,在这种情况下不需要处理。

  • “章节已更改”文本始终是最后一行。

  • 只想跟踪今天的更改(例如 [28/2] =TEXT(today(), "dd/m"

  • 我认为 Excel 将文本包含在 ""(双引号)内。

我对 Excel 公式或 VBA 脚本都很满意。已经尝试过 KuTools 之类的东西,=MID(Resources[@Comments],SEARCH("Chapter changed from",Resources[@Comments])+20,SEARCH("to", Resources[@Comments]) - SEARCH("Chapter changed from",Resources[@Comments])-21)

要检查我使用的日期部分,=IF(ISNUMBER(SEARCH("["&TEXT(TODAY(), "dd/m")&"] Chapter changed", Resources[@Comments])), "Yes", "")

谢谢。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    其实很简单……

    1. 使用vbnewlineChr(10) 拆分单元格内容
    2. 在“[”上分割
    3. 在“]”上分割
    4. 查看日期
    5. 在“来自”上拆分
    6. 在“到”上拆分

    代码:这是您正在尝试的吗?

    Sub Sample()
        Dim cellValue As String
        Dim tmpAr As Variant
        Dim Dt As String, lastLine As String
        Dim OLDc  As String, NEWc As String
        Dim rng As Range
    
        '~~> Set the range
        Set rng = Sheet1.Range("A2")
    
        '~~> Split on Linefeed. It could be Chr(13) as well
        tmpAr = Split(rng.Value, Chr(10))
    
        '~~> Get the last line
        lastLine = tmpAr(UBound(tmpAr))
    
        '~~> Get the date part
        Dt = Split(lastLine, "[")(1)
        Dt = Split(Dt, "]")(0)
    
        '~~> Check if it is same as today
        If Format(Date, "D/M") = Dt Then
            lastLine = Split(lastLine, "from")(1)
            OLDc = Trim(Split(lastLine, "to")(0))
            NEWc = Trim(Split(lastLine, "to")(1))
    
            rng.Offset(, 1).Value = OLDc
            rng.Offset(, 2).Value = NEWc
        End If
    End Sub
    

    【讨论】:

      【解决方案2】:

      您可以使用Range 对象的Replace() 方法:

      Sub DoThat()
          Dim cell As Range
          With Range("A1", Cells(Rows.Count, 1).End(xlUp))
              .Offset(, 1).Resize(, 2).Value = .Value
              For Each cell In .Offset(, 1).Cells
                  If InStr(cell.Value2, Format(Date, "D/M")) > 0 Then
                      cell.Replace "*from ", ""
                      cell.Replace " to *", ""                
                      cell.Offset(, 1).Replace "*to ", ""
                  Else
                      cell.Resize(, 2).ClearContents
                  End If
              Next
          End With
      End Sub
      

      【讨论】:

      • 考虑到给定单元格中可以有多个实例"from " 和“to”,cell.Replace() 方法是否有效?例如等级从 10 变为 9。
      猜你喜欢
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多