Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在VBA(excel)中删除单元格前后不需要的字符_Regex_Vba_Excel_Vbscript - Fatal编程技术网

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

Regex 在VBA(excel)中删除单元格前后不需要的字符,regex,vba,excel,vbscript,Regex,Vba,Excel,Vbscript,我对编程非常陌生,虽然有人问过我几个类似的问题,但我似乎无法让它们满足我的需要 我想要的是能够将原始数据复制到A列,在宏上点击run,它应该删除我想要保留的数据前后的任何不需要的字符,从而生成一个只包含我想要的数据的单元格。我还想让它遍历列中的所有单元格,记住有些单元格可能是空的 我要保留的数据采用以下格式: L1-somedata-0000 -somedata-text将改变,但-ether端将始终存在,L1有时是L2,0000(可以是任意4个数字)有时是任意3个数字。此外,列中可能有一些行没

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

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

我要保留的数据采用以下格式: L1-somedata-0000

-somedata-text将改变,但-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
子测试()
调光范围
对于范围内的每个c(“A2:A”和范围(“A”和Rows.Count).End(xlUp.Row)
c=删除的数据(c.text)
下一个
端接头
函数removeData(ByVal txt作为字符串)作为字符串
将结果变暗为字符串
将所有匹配项设置为对象
作为对象的模糊RE
Set RE=CreateObject(“vbscript.regexp”)
RE.Pattern=“(L1 somedata-\d{4}|\d{3})”
RE.Global=True
RE.IgnoreCase=True
Set allMatches=RE.Execute(文本)
如果所有匹配。则计数0
结果=所有匹配项。项(0)。子匹配项。项(0)
如果结束
提取SDI=结果
端函数
我已经把我的代码,我已经到目前为止,它所做的是通过每个单元格,如果它匹配它只是删除我想保留的文本以及我想删除的东西

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


Chris

您不需要VBA来完成此操作。如果数据在A列中,则将该公式放在B1单元格中,并将其复制下来

=IF(和(中间(A1,3,1)=-”,中间(右(A1,5),1,1)=-”,中间(A1,4,LEN(A1)-8),IF(和(中间(A1,3,1)=-”,中间(右(A1,4),1,1)=-”,中间(A1,4,LEN(A1)-7),”)

说明:

  • 4
    L1-
    +1的长度(我们要从中检索字符串)
  • 8是[3+5],它是
    L1-
    -0000
  • 7是[3+4],它是
    L1-
    -000
  • 如果“-”是输入数据的一部分,可以使用RegExp替换,如:

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

    代替.Replace,您也可以使用子匹配:

    >> WScript.Echo r1.Execute("Don't care-wanted-")(0).SubMatches(0)
    >>
    wanted
    
    如果需要函数,请将Regexp传递到函数中;记住返回值必须分配给函数名(removeData ExtractSDI)

    第二个规范的另一种可能性(“非预期输出的一部分”):

    更新:

    要处理嵌入在所需输出中的“-”,并说明如何将此方法用作公式:

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

    允许(*)/禁止(+)空的头或尾。使用来完成/理解模式。

    或一个简单的Excel公式…@ChrisRelf是要保留的数据的“-”文字部分?同样在
    L1-somedata-0000
    中,“somedata”将有“-”例如
    L1-some-data-1234
    对于“非常不熟悉编程”的人来说是个好问题,我想看看你如何使用正则表达式,而不是从字符串操作开始的人们通常使用的
    mid
    s、
    instr
    s或
    len
    s。继续努力。这是一个非常快速的响应!谢谢大家!@SiddharthRout是的,有时数据的格式是:L1-some-data-1234。抱歉,我不知道我想你已经澄清了。+1:)我知道你已经涵盖了这两种情况:)我很想不用代码解决这个问题。仍在等待OP确认..谢谢@荷马,我会尽快尝试这个解决方案,然后再联系你+1用于RegExp。如果代码应用了变量数组而不是范围循环,那么它的速度会显著提高(答案中不需要这样做)。@Ekkehard.Horner:谢谢。我已经更新了我的帖子谢谢@悉达多我会尽快尝试这个解决方案,然后再给你回复!
    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
    
    rX.Pattern = "^([^-]+-)(.+)(-.+)$"