excel VBA仅保留单元格中文本的特定部分
我有一份每天导入excel的报告,信息“Z”的最后一列是以前处理该帐户的代理留下的所有评论。我只对最后一条评论感兴趣,但它可以是任意长度的,所以我不能只抓取x个字符 问题:是否有办法根据评论的标准只提取最后一条评论?(每个评论以用户名、日期和时间戳结尾: 单元格示例: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
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]但它显示为空!