簡體   English   中英

查找字符串中的子字符串,但從右向左看excel

[英]find substring in a string, but look from the right to the left excel

我最初問過以下問題,發現一個好的公式excel公式在文件路徑文本字符串中找到零件號

因此,在使用=MID(A1,SEARCH("????-??????-??",A1),14)公式查找零件代號名稱之后,一切似乎都很好,直到我遇到了看起來像這樣的數據像下面的示例集。

c:\users\stuff\folder_name\folder_name_9876-vv-123-Ag\1234-000001-01_ baskets_1.pdf
c:\users\stuff\folder_name_9876-vv-123-Ag\random file_1234-000001-02_ baskets_2.pdf
c:\users\stuff\folder_name_XXXX-XXXXXX-XX\1234-000001-03_ baskets_3.pdf
c:\users\stuff\folder_name\1234-000030-01_ tree_30.pdf
c:\users\stuff\folder_name\random text_1234-000030-02_ tree_30.pdf
c:\users\stuff\folder_name\more random stuff_1234-000030-02_ tree_30.pdf

我正在瀏覽數十萬個文件名,並且我知道由於誤報觸發而丟失了一些重要文件。 9876-vv-123-Ag它在技術上適合????-??????-?? 格式,但不是我要從字符串中提取的格式。 現在到問題所在,有沒有一種方法可以應用=MID(A1,SEARCH("????-??????-??",A1),14)從字符串的右側看並向左移動以確保它抓住了完整字符串中符合????-??????-??的最后一個子字符串 格式?

或者有一種方法可以將通配符搜索設置為僅數字形式,而不是其中的任何形式????-??????-?? 格式?

如果沒有其他歧義,則可以僅搜索文件路徑的文件名部分,然后返回匹配的字符串:

=MID(TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",99)),99)),SEARCH("????-??????-??",TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",99)),99))),14)

在此處輸入圖片說明

如果還有其他歧義,您將需要更加具體

公式的這一部分: TRIM(RIGHT(SUBSTITUTE(A1,"\\",REPT(" ",99)),99))返回最后一個子字符串,該字符串在“ \\”字符上進行了拆分。 如果它可能是文件名可能有超過99個字符的情況下,再增加99恰當,或使用類似LEN(A1)來代替。

如果要使用VBA例程,則以下例程在不到4秒的時間內處理了500,000行。 它確實取決於僅由數字組成的部件號,但是如果需要包括其他模式,則更改將是微不足道的。

Option Explicit
Sub partNum()
Dim RE As Object
Dim R As Range, WS As Worksheet
Dim vSrc As Variant, vRes As Variant
Dim I As Long

Set WS = Worksheets("sheet1")
With WS
    vSrc = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
    Set R = .Range(.Cells(1, 2), .Cells(UBound(vSrc, 1), 2))
End With

ReDim vRes(1 To UBound(vSrc, 1), 1 To 1)

Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "\d{4}-\d{6}-\d{2}"

    For I = 1 To UBound(vSrc)
        If .test(vSrc(I, 1)) = True Then vRes(I, 1) = .Execute(vSrc(I, 1))(0)
    Next I
End With

R.EntireColumn.Clear
R = vRes

End Sub

VBA功能 (獨立)

Option Explicit
Function getPartNum(S As String) As String
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "\d{4}-\d{6}-\d{2}(?!.*\\)"
    If .test(S) = True Then getPartNum = .Execute(S)(0)
End With
End Function

明顯的解決方案

Excel替代版本(6s,表示50000行)

僅適用於2個可能出現的選擇最后一個字符串的字符串。

=IF(ISERROR(SEARCH("????-??????-??";A2));"";IF(ISERROR(SEARCH("????-??????-??";A2;SEARCH("????-??????-??";A2)+1));MID($A2;SEARCH("????-??????-??";A2);LEN("????-??????-??"));MID($A2;SEARCH("????-??????-??";A2;SEARCH("????-??????-??";A2)+1);LEN("????-??????-??"))))

子版本(96s,50000行)

Sub SearchQ2()

  Const cStrSource As String = "A2"
  Const cStrTarget As String = "B2"
  Const cStrSearch As String = "????-??????-??"

  Dim vntRange As Variant
  Dim lngSearch As Long
  Dim intStart As Integer
  Dim lng1 As Long
  Dim strTemp As String

  vntRange = Range(cStrSource).Resize(Cells(Rows.Count, Range("A1").Column) _
      .End(xlUp).Row - Range(cStrSource).Row + 1)

  For lng1 = 1 To UBound(vntRange)
    intStart = 1
    Do
      On Error Resume Next
      lngSearch = WorksheetFunction.Search(cStrSearch, _
          vntRange(lng1, 1), intStart)
      If Err Then
        Exit Do
       Else
        strTemp = Mid(vntRange(lng1, 1), lngSearch, Len(cStrSearch))
        intStart = lngSearch + Len(cStrSearch) + 1
      End If
    Loop
    vntRange(lng1, 1) = strTemp
  Next

  Range(cStrTarget).Resize(Cells(Rows.Count, Range("A1").Column) _
      .End(xlUp).Row - Range(cStrSource).Row + 1) = vntRange

End Sub

有史以來最差的功能

對於一百個,甚至幾百個細胞,它都可以正常工作。 這可能是某人編寫高效函數的靈感。

它遍歷字符串以查找最后一次出現的SearchString。

Function SearchQ(SearchString As String, Cell As Range) As String
  Application.Volatile
  Dim lngSearch As Long
  Dim intStart As Integer
  intStart = 1
  Do
    On Error Resume Next
    lngSearch = WorksheetFunction.Search(SearchString, _
        Cell.Cells(1, 1).Text, intStart)
    If Err Then
      Exit Do
     Else
      SearchQ = Mid(Cell.Cells(1, 1).Text, lngSearch, Len(SearchString))
      intStart = lngSearch + Len(SearchString) + 1
    End If
  Loop
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM