Excel 如何从单元格中提取特定字符?

Excel 如何从单元格中提取特定字符?,excel,vba,Excel,Vba,尝试提取相同类型的字符,然后将其从一个单元格移动到另一个单独的单元格 走廊11.2-27.6室外 或 中间走廊612-476后室外 致: 单元(1):走廊-室外 单元(1):中间走廊-后室外 单元格(2):11.2 单元格(3):27.6 尝试了一些正则表达式和变量,但没有成功。无法理解逻辑 预期结果是: 走廊-室外11.2 27.6 或 中间走廊-背部室外612476试试这个简短的宏: Sub parseit() Dim cell As Range For Each c

尝试提取相同类型的字符,然后将其从一个单元格移动到另一个单独的单元格

走廊11.2-27.6室外

中间走廊612-476后室外

致:

  • 单元(1):走廊-室外
  • 单元(1):中间走廊-后室外
  • 单元格(2):11.2
  • 单元格(3):27.6
尝试了一些正则表达式和变量,但没有成功。无法理解逻辑

预期结果是:

走廊-室外11.2 27.6

中间走廊-背部室外612476试试这个简短的宏:

Sub parseit()
    Dim cell As Range

    For Each cell In Selection
        arr = Split(cell.Text, " ")
        cell.Offset(0, 1).Value = arr(0) & " - " & arr(2)
        brr = Split(arr(1), "-")
        cell.Offset(0, 2).Value = brr(0)
        cell.Offset(0, 3).Value = brr(1)
    Next cell
End Sub

编辑#1:

Sub Test()
    ExtractValues Range("A1").Value, Range("E1"), Range("F1"), Range("G1")
End Sub
此版本可以处理测量前后的多个字:

Sub ParseIt2_The_Sequel()
    Dim cell As Range, special As String

    For Each cell In Selection
        special = ""
        arr = Split(cell.Text, " ")
        For i = LBound(arr) To UBound(arr)
            If InStr(arr(i), "-") > 0 Then
                special = arr(i)
                arr(i) = "-"
            End If
        Next i
        cell.Offset(0, 1).Value = Join(arr, " ")
        brr = Split(special, "-")
        cell.Offset(0, 2).Value = brr(0)
        cell.Offset(0, 3).Value = brr(1)
    Next cell

End Sub

如果您将
走廊11.2-27.6户外
放在单元格A2中,您可以使用以下公式得到:

=FILTERXML("<t><s>"&SUBSTITUTE(TRIM(SUBSTITUTE($A2,"-"," "))," ","</s><s>")& "</s></t>","//s[number()>0][1]")
单元格B2
=替换(替换(A2,C2,“”),D2,“”)

单元格C2
=替换(左(替换(中间(A2,查找(“,A2,1)+1,20),“-”,报告(“!”,30)),20),“!”,”)

单元格D2
=替换(左(替换(中间(A2,查找(“-”,A2,1)+1,99),”,报告(“!”,30)),20),“!”,”)

这是什么做的是找到周围的破折号区域,然后插入一堆!标记,然后移除。如果你每迈出一步,你就可以跟着走

下面是c和d公式的两个其他选项

=MID(A3,FIND(“,A3,1)+1,FIND(“-”,A3,1)-FIND(“,A3,1)-1)+0

=TRIM(LEFT(替换(MID(A3,FIND(“-”,A3,1)+1,99),”,REPT(“,99)),40))+0

如果您想提取数字并连接剩余的数字,可以使用正则表达式执行以下操作:

Sub ExtractValues(ByVal inputString As String, _
                  ByRef targetCell1 As Range, _
                  ByRef targetCell2 As Range, _
                  ByRef targetCell3 As Range)
    Dim regEx As New RegExp
    With regEx
        .Global = True
        .Pattern = "^(.+\s)(\d+(?:\.\d+))?-(\d+(?:\.\d+))(\s.+)$"
    End With

    Dim matches As MatchCollection
    Set matches = regEx.Execute(inputString)
    If matches.Count = 1 Then
        Dim m As Match: Set m = matches(0)
        targetCell1.Value = m.SubMatches(0) + "-" + m.SubMatches(3)
        targetCell2.Value = m.SubMatches(1)
        targetCell3.Value = m.SubMatches(2)
    End If
End Sub
用法:

Sub Test()
    ExtractValues Range("A1").Value, Range("E1"), Range("F1"), Range("G1")
End Sub
结果:

Sub Test()
    ExtractValues Range("A1").Value, Range("E1"), Range("F1"), Range("G1")
End Sub

试试这段代码

Sub Test()
Dim a, x, i&

a = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row).Resize(, 3).Value
For i = LBound(a) To UBound(a)
    x = Split(a(i, 1))

    a(i, 1) = x(0) & " - " & x(UBound(x))
    a(i, 2) = Split(x(1), "-")(0)
    a(i, 3) = Split(x(1), "-")(1)
Next i
Range("F2").Resize(UBound(a, 1), UBound(a, 2)).Value = a
End Sub

如果Excel 2016+具有
TEXTJOIN
功能,则可以使用此数组公式计算位置:

=TEXTJOIN(" ",TRUE,FILTERXML("<t><s>" &SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(REPLACE($A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A2&"0123456789")),0,CHAR(160)&CHAR(32)),"-"," "))," ","</s><s>"),CHAR(160),"-")&"</s></t>","//s[not(number())]"))

每一个可能的词。请注意
[1]
。对于每个非数字的字,该值将递增

因此,对于您的数据,假设最多有5个单词+要连接的连字符,您将使用以下公式:

=TRIM(CONCATENATE(
IFERROR(FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(REPLACE($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&"0123456789")),0,CHAR(160)&CHAR(32)),"-"," "))," ","</s><s>"),CHAR(160),"-")&"</s></t>","//s[not(number())][1]")&" ",""),
IFERROR(FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(REPLACE($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&"0123456789")),0,CHAR(160)&CHAR(32)),"-"," "))," ","</s><s>"),CHAR(160),"-")&"</s></t>","//s[not(number())][2]")&" ",""),
IFERROR(FILTERXML("<t><s>" &SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(REPLACE($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&"0123456789")),0,CHAR(160)&CHAR(32)),"-"," "))," ","</s><s>"),CHAR(160),"-")&"</s></t>","//s[not(number())][3]")&" ",""),
IFERROR(FILTERXML("<t><s>" &SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(REPLACE($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&"0123456789")),0,CHAR(160)&CHAR(32)),"-"," "))," ","</s><s>"),CHAR(160),"-")&"</s></t>","//s[not(number())][4]")&" ",""),
IFERROR(FILTERXML("<t><s>" &SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(REPLACE($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&"0123456789")),0,CHAR(160)&CHAR(32)),"-"," "))," ","</s><s>"),CHAR(160),"-")&"</s></t>","//s[not(number())][5]")&" ",""),
IFERROR(FILTERXML("<t><s>" &SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(REPLACE($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&"0123456789")),0,CHAR(160)&CHAR(32)),"-"," "))," ","</s><s>"),CHAR(160),"-")&"</s></t>","//s[not(number())][6]")&" ","")))
=修剪(连接)(
IFERROR(FILTERXML(“”&SUBSTITUTE(替换($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&“0123456789”)))、0、CHAR(160)和CHAR(32))、“-”、“,”、CHAR(160)、“-”、“-”、“//s[not(number())][1]、”、“)、”,
IFERROR(FILTERXML(“)&SUBSTITUTE(替换($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&“0123456789”)))、0、CHAR(160)和CHAR(32))、“-”、“”、“”、“”)、CHAR(160)、“-”、“-”、“//s[not(number())][2]、“”、“”、,
IFERROR(FILTERXML(“”&SUBSTITUTE(替换($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&“0123456789”)))、0、CHAR(160)和CHAR(32))、“-”、“”、“”、CHAR(160)、“-”、“//s[not(number())][3]、“”、“”、“”、“”、,
IFERROR(FILTERXML(“”&SUBSTITUTE(替换($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&“0123456789”)),0,CHAR(160)和CHAR(32)),“-”,“,”,”,CHAR(160),“-”,“//s[not(number())][4],”,“,”,”,“),
IFERROR(FILTERXML(“”&SUBSTITUTE(替换($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&“0123456789”)),0,CHAR(160)和CHAR(32)),“-”,“,”,”,CHAR(160),“-”,“//s[not(number())][5],”,“),”,”,“,”,
IFERROR(FILTERXML(“”&SUBSTITUTE(替换($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},$A1&“0123456789”)),0,CHAR(160)和CHAR(32)),“-”,“,”,”,CHAR(160),“-”,“//s[not(number())][6],”),“)
使用2013年公式得出的结果


您好,谢谢您的回复。当地点名称有超过一个词,如普通沙龙或中间走廊,鳕鱼行为怪异。我怎样才能解决它。谢谢<代码>普通轿车430-22中间走廊至普通-走廊轿车430-22中间@CanKaracan该代码的设计考虑了您的示例。如果您使用可能的输入表单的完整列表更新原始问题,我将尝试更新我发布的代码。在使用宏进行试用后,会更新“是”示例。@CanKaracan查看我的编辑#1。感谢更新代码。无法解决此问题。单元(A)公共厅430-22中间走廊
ParseIt2\u后续
结果此单元为:单元(B)**公共厅**单元(C)公共厅430单元(D)22中间走廊,无法使用提取值调用宏
Sub-ExtractValues(ByVal-inputString作为字符串,
@CanKaracan如果要为按钮或类似对象分配宏,则应添加行
ExtractValues范围(“A1”)。值、范围(“E1”)、范围(“F1”)、范围(“G1”)
在另一个子模块中,然后将另一个子模块用作按钮的宏。请检查edit.created 2模块、sub ExtractValue和sub Test().为调用测试宏创建了按钮。单击按钮时,会出现错误:用户定义的类型未定义,并选择
正则表达式作为新的正则表达式
@CanKaracan您需要添加对
Microsoft VBScript正则表达式5.5
的引用。我想既然您要求使用正则表达式解决方案,您就会知道这一点。无论如何,您不能这样做通过进入“工具”菜单,然后进入“参考”,然后找到并选择所述参考。hi,获取
a(i,1)=x(0)&“-”和x(UBound(x))中的错误
关于中间11.2-27.6室外手机。嗨,罗恩,谢谢你的关心。我们可以用2013年来做吗?@CanKaracan不幸的是,2013年没有
TEXTJOIN
功能。通过谷歌表单工作有什么运气吗?@CanKaracan我没有用表单尝试过。但是试一下,让我们知道。我发布了一个很长的公式,它是这是一个如何在2013年起作用的改编。它应该是可用的,除非你的字符串中有大量的文本字要连接。它基本上一次连接一个。