Функция VBA для возврата левой части строки на основе положения определенного символа в строке

#excel #vba

Вопрос:

Я пытаюсь создать определяемую пользователем функцию, которая возвращает все слева от последнего дефиса в строке. Все строки будут отформатированы следующим образом:

  • CT2986-400427-15
  • J84705-202001-12
  • TF230068-003
  • DS2112-000038-11

Это мой текущий код, но он продолжает отображать ЗНАЧЕНИЕ#! ошибка в ячейке. Есть какие-нибудь идеи?

 Function PartNOSUFFIX(PartNo As String) As String

PartNOSUFFIX = Left(PartNo, InStr(8, PartNo, "-") - 1)

End Function
 

Заранее спасибо!

Ответ №1:

Вы хотите использовать Instrrev вместо этого то, что есть Instr , но в обратном порядке. Таким образом, он всегда найдет последний дефис и вернет его позицию.

Так что попробуй:

 Function PartNOSUFFIX(PartNo As String) As String

PartNOSUFFIX = Left(PartNo, InStrRev(PartNo, "-") - 1)

End Function
 

Вы получите #ЗНАЧЕНИЕ! ошибка, если ячейка пуста или в ней нет дефиса. Если вы хотите объяснить это, вы можете использовать что-то подобное вместо этого:

 Function PartNOSUFFIX(PartNo As String) As String

If PartNo = "" Or InStr(PartNo, "-") = 0 Then
    PartNOSUFFIX = ""
Else
    PartNOSUFFIX = Left(PartNo, InStrRev(PartNo, "-") - 1)
End If

End Function
 

Я просто заставил его вернуться пустым, если ячейка, на которую он смотрит, пуста или в ней нет дефиса. Конечно, вы можете изменить это на то, что вы хотите, чтобы оно говорило.

Ответ №2:

Немного сложно, но весело попробовать

 Function PartNOSUFFIX(PartNo As String) As String
      PartNOSUFFIX = Replace(PartNo, "-" amp; Split(PartNo, "-")(UBound(Split(PartNo, "-"))), "")
End Function
 

Комментарии:

1. Приятно, может быть, стоит объяснить хитрую логику менее опытным пользователям 🙂

Ответ №3:

Вы можете использовать StrReverse() и Split() выполнить это довольно легко:

 Function PartNOSUFFIX(PartNo As String) As String

    PartNOSUFFIX = StrReverse(Split(StrReverse(PartNo), "-", 1)(0))

End Function
 

В качестве альтернативы вы можете использовать регулярное выражение:

 Function PartNOSUFFIX(PartNo As String) As String

With CreateObject("vbscript.regexp")
    .Pattern = "(.*)-.*"
    PartNOSUFFIX = .Replace(PartNo, "$1")
End With

End Function
 
  • (.*) — Захват 0 (жадных) символов, отличных от новой строки, в группе захвата до;
  • - — Буквальный дефис.
  • .* — Снова 0 (жадных) символов, отличных от новой строки.

Тот факт, что регулярные выражения начинают совпадать слева направо, гарантирует, что наш 1-й жадный шаблон будет потреблять все символы до последнего дефиса, поскольку после этого не будет других символов, ведущих к следующему дефису.


Обратите внимание, что оба варианта будут работать, даже если дефиса нет.