Excel在'x'之前和之后replacestring中的字符
你好,我有一个string(产品名称)在其中的列。 现在这些被格式化为Name LenghtxWidth ,例如Green box 20×30。 现在我需要改变20在这个例子中的30,所以我得到绿框30×20,任何想法,我怎么能做到这一点? 谢谢
这是一个适合你的VBA解决scheme:
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)
中的常规模块中,并将其用作常规函数/公式。 如果您的值在单元格A1中,则在单元格B1中键入=Switch(A1)
。 希望能帮助到你!
这是一个公式解决scheme,以及使用正则expression式的VBA解决scheme:
式
=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, "$2x$1") End With End Function
这里是我testing的数据种类的一个例子:
该公式的工作原理是查看最后一个空格分隔的子string,它将是LxW
,然后颠倒x
之前和之后的部分,然后将所有内容连接在一起。
正则expression式模式捕获这两个数字(可以是整数或小数,只要以整数开始 – 尽pipe如果需要可以更改),并将其逆转。
下面是正则expression式(和replacestring)的更详细的解释,指向一个教程的链接:
(\ d +。?\ d *)×(\ d +。?\ d *)
(\d+.?\d*)x(\d+.?\d*)
选项:不区分大小写; ^ $在换行符不匹配
- 匹配下面的正则expression式并将其匹配到反向引用编号1
(\d+.?\d*)
- 匹配一个“数字”
\d+
的单个字符- 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪)
+
- 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪)
- 匹配任何不是换行符的单个字符
.?
- 在零次和一次之间,尽可能多次,根据需要回馈(贪婪)
?
- 在零次和一次之间,尽可能多次,根据需要回馈(贪婪)
- 匹配一个“数字”的单个字符
\d*
- 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)
*
- 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)
- 匹配一个“数字”
- x字面上匹配字符“x”
- 匹配下面的正则expression式并将其匹配到反向引用编号2
(\d+.?\d*)
- 匹配一个“数字”
\d+
的单个字符- 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪)
+
- 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪)
- 匹配任何不是换行符的单个字符
.?
- 在零次和一次之间,尽可能多次,根据需要回馈(贪婪)
?
- 在零次和一次之间,尽可能多次,根据需要回馈(贪婪)
- 匹配一个“数字”的单个字符
\d*
- 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)
*
- 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)
- 匹配一个“数字”
$ 2X $ 1
- 通过捕获组号2
$2
插入上次匹配的文本 - 插入字符“x”字面
x
- 通过捕获组号1
$1
插入上次匹配的文本
用RegexBuddy创build
好的,所以使用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))
如果名称中有多个空格 ,则可以使用此公式来search文本中的最后一个空格
=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))