2013-10-16 28 views
4

我对编程非常陌生,虽然有几个类似的问题要问我,但我似乎无法让他们为我工作需要。从VBA内部和之后的单元格中删除不需要的字符(excel)

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

,我想保持数据的格式如下: L1-somedata-0000

的-somedata-文本将改变,但 - 醚方将永远存在,在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 

我已经把我的代码,我已经这么远,它是所有经过的每个细胞,如果它匹配它只是删除,我想保留,以及我想要的东西,文字删除!

我真的希望所有这些都能让你感觉到! 任何帮助将不胜感激。

Chris

+0

或一个简单的Excel公式... –

+0

@ChrisRelf是“ - ”字面部分的数据保留吗? –

+0

同样在'L1-somedata-0000'将“somedata”有“ - ”,例如'L1-some-data-1234' –

回答

3

如果 “ - ” 是输入数据的一部分,你可以使用正则表达式替换,如:

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

代替。更换,也可以使用Submatches:

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

如果您需要某个功能,请将正则表达式传递给该函数;并记住必须将返回值分配给函数名称(removeData <> ExtractSDI)。

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

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

UPDATE:

为了处理 “ - ” 嵌入在所期望的输出,并显示出这种方法如何可以在/作为一个公式:

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来了解/理解模式。

+0

+ 1 :)我看到你已经涵盖了两种情况:)我很想解决这个问题,而不使用代码。仍在等待OP确认.. –

+0

谢谢! @ Ekkehard.Homer我会尽快尝试这个解决方案,并回复你! – Chris

+0

+1的RegExp。如果代码应用了变量数组而不是范围循环,则代码将显着提高速度(不作为答案的一部分)。 – brettdj

1

您不需要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(从这里我们要检索的字符串
  2. 8的长度为[3 + 5],这是长度L1--0000
  3. 7是[3 + 4],其长度为L1--000

enter image description here

+0

不能正确处理三位数的尾部。 –

+0

@ Ekkehard.Horner:谢谢。我已更新我的帖子 –

+0

谢谢! @SiddharthRout我会尽快尝试这个解决方案,并回复你! – Chris

相关问题