从VBA中的单元格内部和后面删除不需要的字符(excel)

时间:2013-10-16 07:57:33

标签: regex excel vba excel-vba vbscript

我对编程非常陌生,虽然我的问题有几个类似的问题,但我似乎无法让它们满足我的需求。

我想要的是能够将原始数据复制到A列,在宏上运行,它应该删除我想要保留的数据之前和之后的任何不需要的字符,从而导致只包含数据的单元格我想要。我还想让它遍历列中的所有单元格,记住一些单元格可能是空的。

我要保留的数据采用以下格式: 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

我已经把我的代码放到目前为止,它所做的只是通过每个单元格,如果它匹配它只是删除我想要保留的文本以及我想删除的东西!

我真的希望所有这一切都有意义! 任何帮助将不胜感激。

克里斯

2 个答案:

答案 0 :(得分:3)

如果“ - ”是输入数据的一部分,您可以使用RegExp替换,如:

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

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

如果需要函数,请将Regexp传递给函数;并记住必须将返回值分配给函数名称(removeData&lt;&gt; ExtractSDI)。

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

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

<强>更新

处理所需输出中嵌入的“ - ”并显示如何在/作为公式使用此方法:

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 = "^([^-]+-)(.+)(-.+)$"

允许(*)/禁止(+)空头或尾巴。使用Docs通过/了解模式。

答案 1 :(得分:1)

您不需要VBA。如果数据在Col 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的长度(我们要从中检索字符串
  2. 8是[3 + 5],这是L1--0000
  3. 的长度
  4. 7是[3 + 4],即L1--000
  5. 的长度

    enter image description here