【问题标题】:How can I extract a specific Letter(s) and numbers from a text string via VBA Or excel Formula如何通过 VBA 或 excel 公式从文本字符串中提取特定的字母和数字
【发布时间】:2015-05-19 10:38:55
【问题描述】:

我想从位于 excel 列中的较大字符串中提取文本和数字的组合。

我必须使用的常量是每个文本字符串都会

  • 以 A、C 或 S 开头,并且
  • 永远是 7 个字符
  • 我要提取的字符串的位置不同。

例如;

COB0012 WP0402 电子支付 - 中小企业咨询
DCPY708 A850035 WP161 配置管理器核心通用(Aman Ranjan) A614019 WP0302 SQL 2005 升级项目 – WFCopiesChq – 下一阶段 SUTP016 EPM 培训 T2

输出

COB0012
A850035
SUTP016

我了解标准的左/右/中/搜索功能,但是我的数据集变化很大,所以我想创建一些可以自动化这个过程的东西。 (1000 行)

我认为 UDF 函数可以解决问题,但我对 UDF 的了解非常基础。

任何帮助将不胜感激。

【问题讨论】:

  • 区分 DCPY708 和 A850035 的规则是什么?
  • @JeremyThompson DCPY708 不以 A / C or S 开头。
  • @OlleSjögren 标准不是很清楚。可以很容易地识别出不同之处在于DCPY708 以 4 个字母而不是 A850035 的 1 个字母开头,并且对该条件的检查将涵盖更多数量的 SKU。我知道 SUTP016 违反了上述规则,但通常最好不要对字母进行硬编码 - 特别是如果您是未来的校对软件。

标签: vba excel user-defined-functions data-extraction


【解决方案1】:

@Gary's Student 变体但有一些区别

Public Function Xtractor(r As Range) As String
    Dim a, ary
    ary = Split(r.Text, " ")
    For Each a In ary
        If Len(a) = 7 And a Like "[SAC]*" Then
            Xtractor = a
            Exit Function
        End If
    Next a
End Function

输出

【讨论】:

  • 谢谢瓦西里,这似乎工作得很好。我了解大部分宏。 :) (这是个好消息)根据我的理解,您能否解释一下 [ ary = Split(r.Text, " ") ] 的目的是什么?
  • 谢谢@Gary'sStudent,但逻辑是你的)
  • @SeanBailey ary 是数组,单元格值已通过 split() 函数拆分为单独的单词到此数组中,然后该数组中的每个单词已通过两个条件(第一个 char 和 length这个词)
  • 非常感谢你们两位的帮助!我今天学到了新东西! :)
  • 大家好,我最近发布了一个关于此代码的问题作为一个新问题,因为我需要稍微调整它,因为我学到了更多规则 - 如果你有机会请你看看在它 - 我认为你会最了解如何调整代码stackoverflow.com/questions/30758254/…
【解决方案2】:

考虑:

Public Function Xtractor(r As Range) As String
   Dim CH As String, L As Long
   ary = Split(r.Text, " ")
   For Each a In ary
      L = Len(a)
      CH = Left(a, 1)
      If L = 7 Then
         If CH = "S" Or CH = "A" Or CH = "C" Then
            Xtractor = a
            Exit Function
         End If
      End If
   Next a
   Xtractor = ""
End Function

【讨论】:

  • 对不起,我倾向于不同意,检查单词的长度为 7 个字符,并且以 3 个字母中的 1 个开头不是未来证明方法。 ps不需要设置Xtractor = ""
  • 谢谢,这似乎工作得很好。非常感谢您的帮助:)
【解决方案3】:

正则表达式将非常有效 - 特别是如果您将它与变体数组而不是范围相结合。

Sub UseaRegex()
MsgBox StrChange("COB0012 WP0402 Electronic Payments - SME Consultancy [I would require COB0012]")
MsgBox StrChange("DCPY708 A850035 WP161 Configuration Manager Core General (Aman Ranjan)")
End Sub

功能

Function StrChange(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
    .Pattern = "[ACS]\w{6}"
     If .test(strIn) Then
        StrChange = .Execute(strIn)(0)
     Else
        StrChange = "No match"
     End If
End With
End Function

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多