=IFERROR(MID(I46,FIND("-",I46,8)-2,5),"")
我将大量信息从另一个程序复制到一个单元格中。这个字符串的几个部分对我目前的目的来说绝对没有任何意义。我想提取相关信息,它总是以相同的方式格式化,但并不总是在字符串中的相同位置。我正在使用上面的代码返回我正在寻找的内容,还有其他变体,当找到“ - ”时,这可能是经常的。
我要提取的信息将始终为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
如果有办法跳过中间人,我全都耳朵=)
谢谢。
答案 0 :(得分:2)
您可以使用Range.RemoveDuplicates
编写宏来删除列表,然后Like
或正则表达式(请参阅我在Parsing String Mixed with HTML, Words, Numbers, and Dates中发布的代码)在剩余单元格的循环中检查细胞是否符合您的标准并删除那些不匹配的细胞。
去重复然后匹配可能会更有效率,但你可以这样做。
如果您是VBA新手,想要一些代码,请添加评论,我会发布一些评论。
修改强>
您需要转到Visual Basic编辑器(Alt-F11),选择菜单项工具/参考...,找到并选中“Microsoft VBScript Regular Expressions 5.5”,然后单击“确定”。然后在项目资源管理器(Ctrl-R)中,右键单击工作簿的VBA Project
和Insert
> 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
(如果您认为以后可以使用它,可以从Parsing String Mixed with HTML, Words, Numbers, and Dates添加其他正则表达式代码)
添加以下代码(假设您要删除的数据位于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), "[A-Z]{2}-\d\d", True) Then
ActiveSheet.Range("A:A").Rows(RCtr).Delete xlShiftUp
End If
Next
End Sub
然后,将光标放在DedupeAndFilter
代码块中,按F5
或点击绿色运行“>”三角形。然后,代码将删除A列中的重复项,空白单元格和不符合要求的单元格。
如果您想更改受影响的列,请将ActiveSheet.Range("A:A")
中的“A:A”更改为任何其他列引用,或者替换Activesheet.Selection
并选择所需的列。
答案 1 :(得分:0)
如果你想避免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
的那些,然后您可以将粘贴复制为值,Remove Duplicates