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))