4

我对编程很陌生,尽管有人问了几个与我类似的问题,但我似乎无法让它们满足我的需求。

我想要的是能够将原始数据复制到 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

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

我真的希望所有这些都有意义!任何帮助都感激不尽。

克里斯

4

2 回答 2

3

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

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

如果需要函数,请将正则表达式传递给函数;并记住必须将返回值分配给函数名称(removeData <> 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 = "^([^-]+-)(.+)(-.+)$"

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

于 2013-10-16T08:25:43.323 回答
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. 7 是 [3 + 4] 是和的L1-长度-000

在此处输入图像描述

于 2013-10-16T08:07:19.717 回答