我对编程非常陌生,虽然我的问题有几个类似的问题,但我似乎无法让它们满足我的需求。
我想要的是能够将原始数据复制到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
我已经把我的代码放到目前为止,它所做的只是通过每个单元格,如果它匹配它只是删除我想要保留的文本以及我想删除的东西!
我真的希望所有这一切都有意义! 任何帮助将不胜感激。
克里斯
答案 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),""))
<强>解释强>
4
是L1-
+ 1的长度(我们要从中检索字符串L1-
和-0000
L1-
和-000