Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA函数,根据字符串中特定字符的位置返回字符串的左侧_Excel_Vba - Fatal编程技术网

Excel VBA函数,根据字符串中特定字符的位置返回字符串的左侧

Excel VBA函数,根据字符串中特定字符的位置返回字符串的左侧,excel,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, &qu

我试图创建一个用户定义的函数,它返回字符串中最后一个连字符左边的所有内容。所有字符串的格式如下:

  • 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

提前谢谢

您想改用
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

我只是让它返回空白,如果它看到的单元格是空白的或没有连字符。当然,你可以把它改成你想说的任何话。

你想用
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

我只是让它返回空白,如果它看到的单元格是空白的或没有连字符。当然,你可以把它改成你想说的任何内容。

有点复杂,但很有趣,试试看

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

有点复杂但很有趣,试试看

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

您可以使用
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+(贪婪)字符,而不是换行符
正则表达式开始从左到右匹配这一事实确保了我们的第一个贪婪模式将消耗最后一个连字符之前的所有字符,因为后面没有其他字符会导致下一个连字符



注意即使没有连字符,这两个选项也可以使用。

您可以使用
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+(贪婪)字符,而不是换行符
正则表达式开始从左到右匹配这一事实确保了我们的第一个贪婪模式将消耗最后一个连字符之前的所有字符,因为后面没有其他字符会导致下一个连字符



注意即使没有连字符,这两个选项也可以使用。

不错,可能值得向经验不足的用户解释棘手的逻辑:-)不错,可能值得向经验不足的用户解释棘手的逻辑:-)