在VBA中删除前后单元格中不需要的字符(excel)

我对编程非常陌生,虽然有几个类似的问题要问我,但我似乎无法让他们为我的需求工作。

我想要的是能够将原始数据复制到列A中,命中macros运行,它应该删除我想保留的数据前后的任何不需要的字符导致在一个单元格中包含我想要的数据。 我也希望它通过列中的所有单元格,但要记住一些单元格可能是空的。

我想保留的数据是这种格式:L1-somedata-0000

-somedata-文本将会改变,但是 – ether侧将会一直存在,L1有时候是L2,而0000(可能是任何4个数字)有时候会是3个数字。 也可能有一些行中没有有用的数据,这些应该被删除。 最后,一些单元格不会包含任何不需要的数据,这些应该保持不变。

Sub Test() Dim c As Range For Each c In Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row) c = removeData(c.text) Next End Sub Function removeData(ByVal txt As String) As String Dim result As String Dim allMatches As Object Dim RE As Object Set RE = CreateObject("vbscript.regexp") RE.Pattern = "(L1-somedata-\d{4}|\d{3})" RE.Global = True RE.IgnoreCase = True Set allMatches = RE.Execute(text) If allMatches.Count <> 0 Then result = allMatches.Item(0).submatches.Item(0) End If ExtractSDI = result End Function 

我已经把自己的代码放到了目前为止,它所做的只是遍历每个单元格,如果它匹配,就会删除我想要保留的文本以及我想删除的内容!

我真的希望所有这一切都让人心动! 任何帮助都感激不尽。

克里斯

如果“ – ”是input数据的一部分,则可以使用RegExpreplace为:

 >> Set r1 = New RegExp >> r1.Pattern = "^[^-]+(-[^-]+-).*" >> WScript.Echo r1.Replace("L2-A-1234", "$1") >> -A- 

要么:

 >> Set r1 = New RegExp >> r1.Pattern = "^[^-]+-([^-]+).*" >> WScript.Echo r1.Replace("L2-B-123", "$1") >> B 

替代.Replace,你也可以使用Submatches:

 >> WScript.Echo r1.Execute("Don't care-wanted-")(0).SubMatches(0) >> wanted 

如果你需要一个函数,把Regexp传递给函数; 并记住返回值必须分配给函数名称(removeData <> ExtractSDI)。

第二个规范的另一种可能性(“ – ”不是所需输出的一部分):

 >> WScript.Echo Split("Whatever-Wanted-Ignore", "-")(1) >> Wanted 

更新:

处理embedded到所需输出中的“ – ”,并说明如何将这种方法用作公式:

 Option Explicit ' needs Ref to RegExp Dim rX As RegExp Function cleanSDI(s) If rX Is Nothing Then Set rX = New RegExp rX.Pattern = "^([^-]*-)(.+)(-.*)$" End If cleanSDI = rX.Replace(s, "$2") End Function 

根据您的数据,您可能必须将.Pattern更改为

 rX.Pattern = "^([^-]+-)(.+)(-.+)$" 

允许(*)/禁止(+)空头或尾巴。 使用文档工作/理解模式。

你不需要这个VBA。 如果数据是在A栏中,那么把这个公式放在单元格B1中,并将其复制下来。

=IF(AND(MID(A1,3,1)="-",MID(RIGHT(A1,5),1,1)="-"),MID(A1,4,LEN(A1)-8),IF(AND(MID(A1,3,1)="-",MID(RIGHT(A1,4),1,1)="-"),MID(A1,4,LEN(A1)-7),""))

说明:

  1. 4L1- + 1的长度(从我们想要检索string的位置开始)
  2. 8是[3 + 5],它是L1--0000的长度
  3. 7是[3 + 4],它是L1--000的长度

在这里输入图像说明