0
=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

如果有办法跳过中间人,我会全神贯注=)

谢谢你。

4

2 回答 2

2

您可以编写一个宏来Range.RemoveDuplicates重复您的列表,然后Like或正则表达式(请参阅我在Parsing String Mixed with HTML, Words, Numbers, and Dates中发布的代码)在剩余单元格的循环中检查单元格是否符合您的要求标准并删除那些不匹配的。

去重然后匹配可能会更有效,但你可以做任何一种方式。

如果您是 VBA 新手并且想要一些代码,请添加评论,我会发布一些。

编辑:

您需要进入 Visual Basic 编辑器 (Alt-F11),选择菜单项 Tools/References...,找到并选中“Microsoft VBScript Regular Expressions 5.5”,然后单击 OK。然后在项目资源管理器 (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或单击绿色的 Run ">" 三角形。然后,代码将从 A 列中删除重复项、空白单元格和不合格的单元格。

如果要更改受影响的列,请将“A:A”更改ActiveSheet.Range("A:A")为任何其他列引用,或替换Activesheet.Selection并选择所需的列。

于 2013-09-17T02:12:52.227 回答
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,然后您可以将粘贴复制为值,然后删除重复项

于 2013-09-17T08:48:48.210 回答