excel VBA只保留单元格中文本的某一部分

时间:2017-05-18 14:28:56

标签: excel vba excel-vba

我有一个每天导入到Excel的报告,最后一列信息“Z”是以前代理在该帐户上留下的所有评论。我只对最后的评论感兴趣,但它可以是任何长度,所以我不能抓住x个字符。

问题:有没有办法只根据评论标准提取最后一条评论? (每个评论都以用户名,日期和时间戳结束:

细胞的例子:

Example of agent1 comment. [USERNAME1-xx/xx/xxxx xx:xx:xx PM] - Example of agent2 comment. [USERNAME2-xx/xx/xxxx xx:xx:xx PM])

在这种情况下,我想要在单元格中的唯一文本是:“agent2注释的示例。”。

对于记录,所有导入的报告都从“A2”开始。

1 个答案:

答案 0 :(得分:0)

猜猜我不应该这样做,因为你还没有表现出你已经尝试过的东西,但这段代码应该可以解决问题。

输入一个单元格:=ExtractLastComment(H3),其中H3包含注释。

'Use this procedure to run on a range of cells.
'The result is placed one cell to the right of the comment: "Offset(, 1)"
Public Sub CommentsInColumn()

    Dim rTarget As Range
    Dim rCell As Range
    Set rTarget = ThisWorkbook.Worksheets("Sheet1").Range("A2:A30")

    For Each rCell In rTarget
        rCell.Offset(, 1) = ExtractLastComment(rCell)
    Next rCell

End Sub

Public Function ExtractLastComment(Target As Range) As Variant

    Dim sCommentText As String

    If HasComment(Target) Then
        'Get the comment text.
        sCommentText = Target.Comment.Text

        If InStrRev(sCommentText, "[") <> 0 Then
            'Find the last open bracket and take everything to the left of it.
            sCommentText = Trim(Left(sCommentText, InStrRev(sCommentText, "[") - 1))

            'Any closing brackets left?
            If InStrRev(sCommentText, "]") <> 0 Then
                'Take everything from last closing bracket to end of text.
                sCommentText = Mid(sCommentText, InStrRev(sCommentText, "]") + 4)
            End If
            ExtractLastComment = sCommentText
        Else
             ExtractLastComment = CVErr(xlErrValue)
        End If

    Else
        'There isn't a comment in the cell, return a !#NULL error.
        ExtractLastComment = CVErr(xlErrNull)
    End If

End Function


Public Function HasComment(Target As Range) As Boolean

    On Error GoTo ERROR_HANDLER

    If Target.Cells.Count = 1 Then
        With Target
            HasComment = Not .Comment Is Nothing
        End With
    Else
        Err.Raise 513, "HasComment()", "Argument must reference single cell."
    End If

    On Error GoTo 0
    Exit Function

ERROR_HANDLER:
    Select Case Err.Number

        Case Else
            MsgBox "Error " & Err.Number & vbCr & _
                " (" & Err.Description & ") in procedure HasComment."
            Err.Clear
            Application.EnableEvents = True
    End Select

End Function

enter image description here