Удалить определенный текст в ячейке на основе условия - PullRequest
0 голосов
/ 19 апреля 2020

enter image description here

Мне нужна ваша поддержка, чтобы получить результат в столбце B, в основном я вижу, есть ли 5 ​​цифр между запятой и знаком da sh ( , & -) в ячейках A и удалите текст из, в -, остальная часть текста должна быть такой же, без изменений, как показано на рисунке. Я ищу нормальное уравнение Excel, а не код VBA. Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

На основании вашего снимка экрана , а не того, что вы написали, вы, похоже, хотите сохранить подстроки в формате aaaa-nnnn, где nnnnn представляет четыре или более цифр. Если у вас есть функции FILTERXML и TEXTJOIN, вы можете использовать эту формулу:

=SUBSTITUTE(TEXTJOIN(",",TRUE,FILTERXML("<t><s>" & SUBSTITUTE(SUBSTITUTE(A1,"-",",-"),",","</s><s>") & "</s></t>","//s[number(.)<-999] /preceding::*[1] | //s[number(.)<-999]")),",-","-")
  • Создайте разделение XML на запятые, а также дефис (но оставьте дефис)
  • Создайте xPath, который выбирает как узел, предшествующий узлу цифры c со значением меньше -999, так и сам этот узел нумерации c.
    • отрицательное число получается из-за сохранения дефиса
  • Соедините значения вместе, используя TEXTJOIN с разделителем запятых
    • Удалите запятую, которая теперь стоит перед дефисом.

enter image description here

Если в вашей версии Excel их нет функции, VBA или, возможно, Power Query будет лучшим решением.

Если вы предпочитаете решение VBA, я предлагаю поискать подстроки, которые соответствуют вашим очевидным критериям дефисной подстроки, где правая половина - число> 999 При необходимости можно легко добавить проверку на наличие заглавных букв на левой стороне.

Option Explicit
Function getStr(S As String) As String
    Dim V, W
    Dim sTemp As String

V = Split(S, ",")
For Each W In V
    If Val(Split(W, "-")(1)) > 999 Then _
        sTemp = sTemp & "," & W
Next W

getStr = Mid(sTemp, 2)

End Function
1 голос
/ 19 апреля 2020

К сожалению, замена не допускает использования диких символов

При использовании SEARCH и REPLACE единственное, что я мог придумать, это следующая формула:

=IF(ISNUMBER(SEARCH("????-, ",A1)),REPLACE(A1,SEARCH("????-, ",A1),7,""),IF(ISNUMBER(SEARCH(", ????-",RIGHT(A1,7))),REPLACE(A1,LEN(A1)-6,7,""),A1))

, которая удаляет только первое вхождение строк, которые вы хотите удалить.

В качестве утешения я предлагаю простое решение VBA, которое по по умолчанию удаляет все подстроки 5-character в ", "-delimited строка.

В VBA (CTRL-F11) вставьте новый модуль в рабочую книгу, где он вам нужен. В кодовом листе модуля (возможно, Module1) скопируйте / вставьте следующий код:

Option Explicit

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Purpose:    From a delimited string, removes all sub strings containing
'             a specified number of characters and returns the remainder
'             of the string.
' Returns:    A string, if there are any substrings with a different number
'             of characters than the specified number of characters,
'             or "", if not.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function FilterC(SourceValue As Variant, _
  Optional NumberOfCharacters As Long = 5, _
  Optional Delimiter As String = ", ") As String

    Dim vntS As Variant   ' Source Array
    Dim vntT As Variant   ' Target Array
    Dim i As Long         ' Source Array Elements Counter
    Dim iTA As Long       ' Target Array Elements Counter
    Dim strC As String    ' Current String

    ' Check if SourceValue is text.
    If VarType(SourceValue) <> vbString Then Exit Function
    ' Check if SourceValue is "". For a cell in Excel this refers to an empty
    ' cell or a cell with a formula evaluating to "".
    If SourceValue = "" Then Exit Function

    ' Initialize Target Array Elements Counter.
    iTA = -1
    ' Write SourceValue to elements of Source Array (using 'Split').
    vntS = Split(SourceValue, Delimiter)

    ' Loop through elements of Source Array.
    For i = 0 To UBound(vntS)
        ' Write current element in Source Array to Current String.
        strC = vntS(i)
        ' Check if the length of Current String is NOT equal
        ' to NumberOfCharacters.
        If Len(strC) <> 5 Then GoSub TargetArray
    Next

    ' If only 'NumberOfCharacters' character strings are found.
    If iTA = -1 Then Exit Function

    ' Write elements of Target Array to FilterC (using "Join").
    FilterC = Join(vntT, Delimiter)

Exit Function

' Write String to Target Array.
TargetArray:
    ' Increase Target Array Elements Counter.
    iTA = iTA + 1
    ' Check if Target Array Elements Counter is greater than 0 i.e. if
    ' there already are any elements in Target Array.
    If iTA > 0 Then
        ' All, except the first element.
        ReDim Preserve vntT(iTA)
    Else
        ' Only the first element.
        ReDim vntT(0)
    End If
    ' Write Current String to Target Array.
    vntT(iTA) = strC
    ' Note: Target Array Elements Counter (iTA) was initalized with -1, so when
    ' the first time the code redirects to TargetArray (Subroutine),
    ' iTA will be 0 and only this time run through the Else clause
    ' and finally write Current String to Target Array.
Return

End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

В Excel для результата из A1 используйте следующую формулу:

=FilterC(A1)

что является коротким поведением по умолчанию полностью определенной формулы:

=FilterC(A1,5,", ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...