【问题标题】:macro for Multiline text in cell to truncate用于截断单元格中的多行文本的宏
【发布时间】:2017-04-11 15:39:38
【问题描述】:

我在特定列的单元格中有一个多行文本,其中有数字后跟制表符分隔符,我希望处理下面的文件,请参阅 SHEET 的名称

LINK TO FILE

实际数据超过1000行,要在新插入的列中生成结果输出1和2。

任何人都可以帮助我使用宏在特定列“ABC”上运行,并且只保留制表符之前的文本和连接两个下一个字符文本的另一列。此外,此 ABC 列可以更改 Excel 表中的位置,如果有人可以帮助我,我将非常感激。

我很震惊的代码是

Sub RahulSplit()
Dim colNum As Integer
    colNum = ActiveSheet.rows(1).Find(what:="ABC", lookat:=xlWhole).Column
        ActiveSheet.Columns(colNum + 1).Insert
        ActiveSheet.Cells(1, colNum + 1).Value = "Results 2 Anticipated"

    With CreateObject("VBScript.RegExp")
        .Global = True
        .MultiLine = True
        .Pattern = "\w*\t\w*\s"
        Dim x
        For Each x In .Execute(s)
            InBrackets = InBrackets & Mid(x, 2, Len(x) - 2) & vbLf
        Next
    End With

EndSub

【问题讨论】:

  • 请发布您目前遇到问题的代码。 (并删除指向异地文件的链接 - 问题应该是独立的,而不是依赖于将来可能会中断的链接。)
  • 我同意,但很难指定多行文本,这只是为了让专家在精确的 excel 表上工作。
  • @YowE3K 我希望编辑可以接受

标签: excel vba


【解决方案1】:

您可以使用此 UDF 提取由[...] 括号括起来的字符串:

Function InBrackets(s As String) As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .MultiLine = True
        .Pattern = "\[\w*\]"
        Dim x
        For Each x In .Execute(s)
            InBrackets = InBrackets & Mid(x, 2, Len(x) - 2) & vbLf
        Next
    End With
End Function

用法:

B2:=InBrackets(A2)

编辑

好的,所以在你更好地指定了你的目标之后,与括号无关,试试下面的:

Sub InsertAnticipatedResults(sh As Worksheet)
    Dim colABC As Long, abc As Range
    With sh
        colABC = .Rows(1).Find(what:="ABC", lookat:=xlWhole).Column
        .Columns(colABC + 1).Insert
        .Cells(1, colABC + 1).value = "Results 1 Anticipated"

        .Columns(colABC + 2).Insert
        .Cells(1, colABC + 2).value = "Results 2 Anticipated"

        Set abc = .Range(.Cells(2, colABC), .Cells(.Rows.Count, colABC).End(xlUp))
    End With

    Dim res1 As String, res2 As String, result1 As String, result2 As String, x
    With CreateObject("VBScript.RegExp")
        .Global = True
        .MultiLine = True
        .Pattern = "^\S*\s*\S*\s"
        For Each abc In abc.Cells
            result1 = "": result2 = ""
            For Each x In .Execute(abc.Text)
                res2 = Trim(x)
                res1 = Trim(Left(res2, Len(res2) - 2))
                res2 = Replace(res2, " ", "")
                res2 = Replace(res2, vbTab, "")

                If Len(result1) > 0 Then result1 = result1 & vbLf: result2 = result2 & vbLf
                result1 = result1 & res1
                result2 = result2 & res2
            Next
            abc.Offset(, 1).value = result1
            abc.Offset(, 2).value = result2
        Next
    End With
End Sub

Sub Testing()
    InsertAnticipatedResults ActiveSheet
End Sub

【讨论】:

  • 感谢 ASH,但我的要求略有不同,我只需要作为每个多行的起始字的数据,例如在 EP1189062 A1 2002-03-20 [EP1189062] 中,我想在制表符之前声明第一组单词,即第二列中的 EP1189062 我想将两串字母 EP1189062 A1 连接在一起而没有空格
  • 请注意,我的工作表有列名,所以我不能使用 A2 B2 类引用,卡住请帮助
  • 您的代码完美适用于括号中的字母,但如果括号中的“-”出现,它将无法正常工作,如果您能告诉我如何仅提取每条多行的前两个单词,那将非常合适通过宏,我的同事对函数的工作想法更少。
  • @RahulSharma 正如我所怀疑的那样,您的初始要求并不明显。添加的部分应该可以达到您想要的结果。
  • 你能帮我解决新问题吗stackoverflow.com/questions/43422134/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2013-09-06
  • 2020-07-16
  • 1970-01-01
相关资源
最近更新 更多