【问题标题】:Excel replace characters in string before and after 'x'Excel在'x'之前和之后替换字符串中的字符
【发布时间】:2016-08-09 11:28:02
【问题描述】:

您好,我有一列包含字符串(产品名称)。 现在这些被格式化为 Name LenghtxWidth,例如绿色框 20x30。现在我需要在这个例子中将 20 更改为 30,这样我就得到了 30x20 的绿框,有什么想法可以实现这一点吗? 谢谢

【问题讨论】:

  • 您想在不使用 VBA 的情况下这样做吗?
  • 可以,还是excel公式,只要得到我要找的结果
  • @Jesse 的长度和宽度总是 2 位数字吗?所以没有“100x50”或“5x10”?如果是这样,那么这可以通过公式轻松完成

标签: string excel substitution string-substitution


【解决方案1】:

这里既是公式解决方案,也是使用正则表达式的 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, "$2x$1")
End With

End Function

以下是我测试过的数据类型示例:

公式的工作原理是查看最后一个以空格分隔的子字符串 LxW,然后反转 x 之前和之前的部分,然后将所有内容重新连接在一起。

正则表达式模式捕获两个数字(可以是整数或小数,只要以整数开头 - 尽管如果需要可以更改),并将它们反转。

这里是正则表达式(和替换字符串)的更详细说明,并附有教程链接:

(\d+.?\d*)x(\d+.?\d*)

(\d+.?\d*)x(\d+.?\d*)

选项:不区分大小写; ^$ 在换行符处不匹配

$2x$1

使用RegexBuddy创建

【讨论】:

  • 我不理解你的 UDF,但这真的很酷,也是一个很好的解决方案。我需要学习。
  • @Brian 我将添加正则表达式的技术解释
  • 非常详细的答案
  • @RonRosenfeld 谢谢你的解释,罗恩!我偶然发现了这个site。你见过这个吗?
【解决方案2】:

这是一个适合您的 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) 的常规模块中,并将其用作常规函数/公式。如果您的值在单元格 A1 中,则在单元格 B1 中键入 =Switch(A1)。希望对您有所帮助!

【讨论】:

  • 请注意,在 switch = ... x 必须在 " " 之间。
  • @Jesse 好眼光!感谢您引起我的注意!你知道发生了什么,我最初有一个 x 变量来在 switch 语句中的 20x30' and realized I didn't need it. When I deleted the variable I failed to make x` 中找到 x 字符串文字。再次感谢! :-)
  • 是的,我是这么认为的,感谢您的回答,这就是我最终解决问题的原因!
  • 不确定您是否将硬编码的 Range("A1") 部分切换为 r 变量 - 仅供参考。
【解决方案3】:

好的,所以使用 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))

如果您的名字中有几个空格,您可以使用这个公式来搜索文本中的最后一个空格

=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 脚本的示例?由于上述公式在名称中有多个空格时不起作用,例如 Yellow Small Case 30x15 => Small Case 30x15
  • 你可以使用这个公式得到一个有几个空格的名字=LEFT(A1, SEARCH("^^",SUBSTITUTE(A1," ","^^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))-1)
猜你喜欢
  • 1970-01-01
  • 2021-09-24
  • 2012-06-25
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多