Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excel VBA仅保留单元格中文本的特定部分_Vba_Excel - Fatal编程技术网

excel VBA仅保留单元格中文本的特定部分

excel VBA仅保留单元格中文本的特定部分,vba,excel,Vba,Excel,我有一份每天导入excel的报告,信息“Z”的最后一列是以前处理该帐户的代理留下的所有评论。我只对最后一条评论感兴趣,但它可以是任意长度的,所以我不能只抓取x个字符 问题:是否有办法根据评论的标准只提取最后一条评论?(每个评论以用户名、日期和时间戳结尾: 单元格示例: Example of agent1 comment. [USERNAME1-xx/xx/xxxx xx:xx:xx PM] - Example of agent2 comment. [USERNAME2-xx/xx/xxxx xx

我有一份每天导入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”开始。我想我不应该这样做,因为您还没有展示您尝试过的内容,但这段代码应该可以做到

在单元格中输入:
=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
“使用此过程在一系列单元格上运行。
'结果放置在注释右侧的一个单元格:“偏移量(,1)”
公共子列()
将目标设置为范围
变暗rCell As范围
设置rTarget=ThisWorkbook.工作表(“Sheet1”).范围(“A2:A30”)
对于rTarget中的每个rCell
rCell.Offset(,1)=ExtractLastComment(rCell)
下一个rCell
端接头
公共函数ExtractLastComment(目标作为范围)作为变量
Dim sCommentText作为字符串
如果有注释(目标),则
'获取注释文本。
sCommentText=Target.Comment.Text
如果InStrRev(scommmenttext,“[”)0,则
'找到最后一个打开的括号,并将所有内容放在左边。
sCommentText=修剪(左(sCommentText,InStrRev(sCommentText,“[”)-1))
“还有结束括号吗?
如果InStrRev(scommmenttext,“]”0,则
'从最后一个结束括号到文本结尾的所有内容。
sCommentText=Mid(sCommentText,InStrRev(sCommentText,“]”+4)
如果结束
ExtractLastComment=sCommentText
其他的
ExtractLastComment=CVErr(xlErrValue)
如果结束
其他的
'单元格中没有注释,返回!#NULL错误。
ExtractLastComment=CVErr(XlerNull)
如果结束
端函数
公共函数HasComment(目标为范围)为布尔值
关于错误转到错误处理程序
如果Target.Cells.Count=1,则
有目标
HasComment=不是。Comment什么都不是
以
其他的
Err.Raise 513,“HasComment()”,“参数必须引用单个单元格。”
如果结束
错误转到0
退出功能
错误\u处理程序:
选择案例错误编号
其他情况
MsgBox“错误”和错误编号、vbCr和_
过程HasComment中的(&Err.Description&')
呃,明白了
Application.EnableEvents=True
结束选择
端函数

您尝试过什么?将注释取出,然后混合使用
MID()
SEARCH()
,应该可以开始了。问题是大约有300行信息,每行有大约20条不同的注释。是否有办法选择从第二到最后一组括号“[]”然后再提取所有信息?如果是这样的话,我不知道怎么做。对不起,我是新手,我如何将其保存为宏以运行整个“Z”列,而不是函数?您可以在一个单元格中输入公式并向下拖动,或者我在代码顶部添加了一个过程,以显示如何在一系列单元格中运行公式。还更新了主代码,以说明注释中没有括号时的原因(将显示#VALUE!错误)。更改代码行后:设置rTarget=ThisWorkbook.Worksheets(“Sheet1”).Range(“A2:A30”)以设置rTarget=ActiveWorkbook.ActiveSheet.Range(“z2”,ActiveSheet.Range(“z2”).End(xlDown))。因为我的所有注释都在“Z”中"列中,它返回#NULL!,就好像Z列中没有txt一样。这将是单元格中没有注释后的一行,返回一个!#NULL错误。注释。如果单元格中没有注释,您希望它说什么?无需说
ActiveWorkbook.ActiveSheet
-ActiveSheet将始终在a中ActiveWorkbook-您可以使用
ActiveSheet
(如括号中所示)。感谢您提供的活动工作表信息,但我想说的是,它表示z列中的任何单元格中都没有信息。z列中的示例文本:[SR Activities]-传真-出站-发送给代理以获取其他位置-[APULVER-05/15/2017 12:30:32 PM]-[SR Activities]-通过电子邮件发送的业务-无法打开Wf for Motorsports-通过电子邮件AM进行覆盖审批-[APULVER-05/16/2017 01:01:38 PM]我希望它返回:通过电子邮件发送的业务-无法打开Wf for Motorsports-通过电子邮件AM进行覆盖审批-[APULVER-05/16/2017 01:01:38 PM]但它显示为空!