Excel替换字符串中'x'前后的字符
Excel replace characters in string before and after 'x'
您好,我有一个包含字符串(产品名称)的列。
现在这些格式为 Name LenghtxWidth,例如 Green box 20x30。现在我需要在此示例中将 20 更改为 30,以便我得到 Green box 30x20,有什么想法可以实现吗?
谢谢
好的,所以使用起来确实更容易 VBA,但是如果您只需要一些公式,您可以使用一些列来拆分文本,然后连接单元格。
这是一个小例子:
当然B1-4是可选的。它只是为了让内容更具可读性,但你可以只使用一个公式
=CONCATENATE(LEFT(A1, SEARCH(" ",A1,1)-1)," ",RIGHT(RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)),LEN(RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)))-SEARCH("x",RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)),1)),"x",LEFT(RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)), SEARCH("x",RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)),1)-1))
如果您的名字中有 几个 spaces,您可以使用此公式搜索最后一个 space 文中
=CONCATENATE(LEFT(A1, SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))-1)," ",RIGHT(RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),LEN(RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))))-SEARCH("x",RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),1)),"x",LEFT(RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))), SEARCH("x",RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),1)-1))
这是一个适合您的 VBA 解决方案:
Option Explicit
Function Switch(r As Range) As String
Dim measurement As String
Dim firstPart As String
Dim secondPart As String
measurement = Right(r, Len(r) - InStrRev(r, " "))
secondPart = Right(measurement, Len(measurement) - InStr(1, measurement, "x"))
firstPart = Left(measurement, InStr(1, measurement, "x") - 1)
Switch = Left(r, InStrRev(r, " ") - 1) & " " & secondPart & "x" & firstPart
End Function
您可以将其粘贴到 VBE (Visual Basic Editor)
的常规模块中,并将其用作常规 function/formula。如果您的值在单元格 A1 中,则在单元格 B1 中键入 =Switch(A1)
。希望对您有所帮助!
这里既有公式的解决方案,也有使用正则表达式的VBA解决方案:
公式
=LEFT(A1,FIND(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)),A1)-1)&
MID(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)),SEARCH("x",TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)))+1,99)&
"x"&
LEFT(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)),SEARCH("x",TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)))-1)
UDF
Option Explicit
Function RevWL(S As String)
Dim RE As Object
Const sPat As String = "(\d+.?\d*)x(\d+.?\d*)"
'If L or W might start with a decimal point, and not a digit,
'Then change sPat to: (\d*.?\d+)x(\d*.?\d+)
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.ignorecase = True
.Pattern = sPat
RevWL = .Replace(S, "x")
End With
End Function
以下是我测试的数据类型示例:
公式的工作原理是查看最后一个 space 分隔的子字符串,即 LxW
,然后反转 x
前后的部分,然后将所有内容连接起来。
正则表达式模式捕获两个数字(可以是整数或小数,只要以整数开头——尽管如果需要可以更改),并将它们取反。
下面是对正则表达式(和替换字符串)的更详细解释以及指向教程的链接:
(\d+.?\d*)x(\d+.?\d*)
(\d+.?\d*)x(\d+.?\d*)
选项:不区分大小写; ^$ 不匹配换行符
- Match the regex below and capture its match into backreference number 1
(\d+.?\d*)
- Match the character “x” literally
x
- Match the regex below and capture its match into backreference number 2
(\d+.?\d*)
$2x$1
- Insert the text that was last matched by capturing group number 2
</code></li>
<li><a href="http://www.regular-expressions.info/characters.html" rel="nofollow noreferrer">Insert the character “x” literally</a> <code>x
- Insert the text that was last matched by capturing group number 1
创建于RegexBuddy
您好,我有一个包含字符串(产品名称)的列。 现在这些格式为 Name LenghtxWidth,例如 Green box 20x30。现在我需要在此示例中将 20 更改为 30,以便我得到 Green box 30x20,有什么想法可以实现吗? 谢谢
好的,所以使用起来确实更容易 VBA,但是如果您只需要一些公式,您可以使用一些列来拆分文本,然后连接单元格。
这是一个小例子:
当然B1-4是可选的。它只是为了让内容更具可读性,但你可以只使用一个公式
=CONCATENATE(LEFT(A1, SEARCH(" ",A1,1)-1)," ",RIGHT(RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)),LEN(RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)))-SEARCH("x",RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)),1)),"x",LEFT(RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)), SEARCH("x",RIGHT(A1,LEN(A1)-SEARCH(" ",A1,1)),1)-1))
如果您的名字中有 几个 spaces,您可以使用此公式搜索最后一个 space 文中
=CONCATENATE(LEFT(A1, SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))-1)," ",RIGHT(RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),LEN(RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))))-SEARCH("x",RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),1)),"x",LEFT(RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))), SEARCH("x",RIGHT(A1,LEN(A1)-SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),1)-1))
这是一个适合您的 VBA 解决方案:
Option Explicit
Function Switch(r As Range) As String
Dim measurement As String
Dim firstPart As String
Dim secondPart As String
measurement = Right(r, Len(r) - InStrRev(r, " "))
secondPart = Right(measurement, Len(measurement) - InStr(1, measurement, "x"))
firstPart = Left(measurement, InStr(1, measurement, "x") - 1)
Switch = Left(r, InStrRev(r, " ") - 1) & " " & secondPart & "x" & firstPart
End Function
您可以将其粘贴到 VBE (Visual Basic Editor)
的常规模块中,并将其用作常规 function/formula。如果您的值在单元格 A1 中,则在单元格 B1 中键入 =Switch(A1)
。希望对您有所帮助!
这里既有公式的解决方案,也有使用正则表达式的VBA解决方案:
公式
=LEFT(A1,FIND(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)),A1)-1)&
MID(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)),SEARCH("x",TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)))+1,99)&
"x"&
LEFT(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)),SEARCH("x",TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",99)),99)))-1)
UDF
Option Explicit
Function RevWL(S As String)
Dim RE As Object
Const sPat As String = "(\d+.?\d*)x(\d+.?\d*)"
'If L or W might start with a decimal point, and not a digit,
'Then change sPat to: (\d*.?\d+)x(\d*.?\d+)
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.ignorecase = True
.Pattern = sPat
RevWL = .Replace(S, "x")
End With
End Function
以下是我测试的数据类型示例:
公式的工作原理是查看最后一个 space 分隔的子字符串,即 LxW
,然后反转 x
前后的部分,然后将所有内容连接起来。
正则表达式模式捕获两个数字(可以是整数或小数,只要以整数开头——尽管如果需要可以更改),并将它们取反。
下面是对正则表达式(和替换字符串)的更详细解释以及指向教程的链接:
(\d+.?\d*)x(\d+.?\d*)
(\d+.?\d*)x(\d+.?\d*)
选项:不区分大小写; ^$ 不匹配换行符
- Match the regex below and capture its match into backreference number 1
(\d+.?\d*)
- Match the character “x” literally
x
- Match the regex below and capture its match into backreference number 2
(\d+.?\d*)
$2x$1
- Insert the text that was last matched by capturing group number 2
</code></li> <li><a href="http://www.regular-expressions.info/characters.html" rel="nofollow noreferrer">Insert the character “x” literally</a> <code>x
- Insert the text that was last matched by capturing group number 1
创建于RegexBuddy