查找string中的特定文本

=IFERROR(MID(I46,FIND("-",I46,8)-2,5),"") 

我从另一个程序中将大量信息复制到一个单元格中。 这个string有几个部分对于我目前的目的来说绝对没有任何意义。 我想提取相关的信息,它总是以相同的方式格式化,但并不总是在string中的相同位置。 我正在使用上面的代码来返回我正在查找的内容,而且在find“ – ”的时候也可以使用其他变体。

我要提取的信息将始终为LetterLetter-NumberNumber,例如:AA-01 AA-02 AB-01等等,总是5个字符。

我怎样才能提取这个?

然后,在另一行,如果需要,我想删除重复的实例(几乎总是会有重复)。

我现在得到的是;

 HA-03 HA-03 T - S Y - R HA-03 HA-03 HA-03 HA-03 Y - R HA-06 HA-06 R - S HA-07 HA-09 HA-09 HA-09 

首先,我想要得到;

 HA-03 HA-03 HA-03 HA-03 HA-03 HA-03 HA-06 HA-06 HA-07 HA-09 HA-09 HA-09 

然后把它转换成

 HA-03 HA-06 HA-07 HA-09 

如果有办法跳过中间人,我都是耳朵=)

谢谢。

您可以使用Range.RemoveDuplicates来重复删除您的列表,然后使用Like或正则expression式(请参阅parsing与HTML,Words,Numbers和Dates混合的string中的代码)在剩余的单元格中循环查看macros如果单元格符合您的标准并删除那些不匹配的单元格。

去重复然后匹配可能会更有效率,但你可以做到这一点。

如果您是VBA新手,想要一些代码,请添加评论,然后发布一些内容。

编辑:

您需要转到Visual Basic编辑器(Alt-F11),select菜单项Tools / References …,find并选中“Microsoft VBScript Regular Expressions 5.5”,然后单击OK。 然后在项目资源pipe理器(Ctrl-R)中,右键单击工作簿的VBA Project ,然后selectInsert > Module

添加下面的代码:

 Public Function RegEx(strInput As String, strRegEx As String, Optional bIgnoreCase As Boolean = True, Optional bMultiLine As Boolean = False) As Boolean Dim RegExp As VBScript_RegExp_55.RegExp Set RegExp = New VBScript_RegExp_55.RegExp With RegExp .MultiLine = bMultiLine .IgnoreCase = bIgnoreCase .Pattern = strRegEx End With RegEx = RegExp.test(strInput) Set RegExp = Nothing End Function 

(如果您认为稍后可能会使用,则可以从“ 分析string与HTML,单词,数字和date混合”中添加其他正则expression式代码)

添加下面的代码(假设您要删除的数据在列A中):

 Public Sub DedupeAndFilter() Dim RCtr As Long ActiveSheet.Range("A:A").RemoveDuplicates Columns:=1, Header:=xlNo For RCtr = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 If ActiveSheet.Range("A:A").Rows(RCtr).Text = "" Then ActiveSheet.Range("A:A").Rows(RCtr).Delete xlShiftUp ElseIf Not RegEx(ActiveSheet.Range("A1").Rows(RCtr), "[AZ]{2}-\d\d", True) Then ActiveSheet.Range("A:A").Rows(RCtr).Delete xlShiftUp End If Next End Sub 

然后,用光标在DedupeAndFilter代码块中,按F5或单击绿色Run“>”三angular形。 代码将删除A列中的重复项,空白单元格和不符合的单元格。

如果要更改受影响的列,请将ActiveSheet.Range("A:A")更改为任何其他列引用,或replaceActivesheet.Selection并select所需的列。

如果你想避免VBA,那么试试这个:

 Column A asdfHA-03asdfasdf HA-03sadfsa asdfT - S Y - Rasdfsad asdfHA-03adf asdHA-04 asdfsadf 

然后使用这个公式:

 =IF(ISERROR(FIND(" ",IFERROR(MID(A1,FIND("-",A1)-2,5),""))),IFERROR(MID(A1,FIND("-",A1)-2,5),""),"") 

这应该排除spaces ,那么你可以复制粘贴为值,并删除重复