首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找字符串中的特定文本

查找字符串中的特定文本
EN

Stack Overflow用户
提问于 2013-09-17 01:44:35
回答 2查看 455关注 0票数 0
代码语言:javascript
复制
=IFERROR(MID(I46,FIND("-",I46,8)-2,5),"")

我有大量的信息从另一个程序复制到一个单元格中。这个字符串中有几个部分对我当前的目的来说绝对没有任何意义。我想提取相关的信息,它总是格式化相同的方式,但不是总是在同一位置的字符串。我正在使用上面的代码,它返回我所寻找的内容,但当"-“被找到时,也会有其他的变化,这通常是。

我想要提取的信息总是字母-NumberNumber,例如: AA-01 AA-02 AB-01等等,总是有5个字符。

我怎么才能把这个提取出来?

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

我现在得到的是;

代码语言:javascript
复制
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

首先,我想要得到;

代码语言:javascript
复制
HA-03
HA-03
HA-03
HA-03
HA-03
HA-03
HA-06
HA-06
HA-07
HA-09
HA-09
HA-09

然后把它转换成;

代码语言:javascript
复制
HA-03
HA-06
HA-07
HA-09

如果有办法跳过中间派的话,我会洗耳恭听的

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-17 02:12:52

您可以使用Range.RemoveDuplicates编写宏来消除列表的复制,然后在剩余单元格上循环Like或正则表达式(请参阅我在解析带有HTML、单词、数字和日期的字符串中发布的代码),以检查单元格是否符合标准,并删除不匹配的单元格。

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

如果您是VBA新手,并且需要一些代码,请添加一个注释,我会发布一些。

编辑:

您需要转到Visual编辑器(Alt-F11),选择菜单项工具/引用.,查找并检查"Microsoft VBScript正则表达式5.5",然后单击OK。然后在项目资源管理器(Ctrl)中,右击工作簿和VBA ProjectInsert > Module

添加以下代码:

代码语言:javascript
复制
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

(如果您认为以后可能会使用,可以从解析带有HTML、单词、数字和日期的字符串添加其他正则表达式代码)

添加以下代码(假设要删除的数据位于A列中):

代码语言:javascript
复制
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并选择所需的列。

票数 2
EN

Stack Overflow用户

发布于 2013-09-17 08:48:48

如果要避免使用VBA,请尝试如下:

代码语言:javascript
复制
Column A
asdfHA-03asdfasdf
HA-03sadfsa
asdfT - S
Y - Rasdfsad
asdfHA-03adf
asdHA-04
asdfsadf

然后在使用这个公式时:

代码语言:javascript
复制
=IF(ISERROR(FIND(" ",IFERROR(MID(A1,FIND("-",A1)-2,5),""))),IFERROR(MID(A1,FIND("-",A1)-2,5),""),"")

这应该排除使用spaces的那些,然后您只需将粘贴复制为值,并复制删除重复项

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18840019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档