#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-й жадный шаблон будет потреблять все символы до последнего дефиса, поскольку после этого не будет других символов, ведущих к следующему дефису.
Обратите внимание, что оба варианта будут работать, даже если дефиса нет.