【问题标题】:InSTR or find function in VBAInSTR 或 VBA 中的查找函数
【发布时间】:2017-03-25 23:04:56
【问题描述】:

我遇到了一个问题。我做了研究,发现我可以使用 InSTR 函数来搜索字符串中的特定字符。

我要做的是从文件路径中提取文件名。

目前我有

  InStr(StrFrom(pName), "\")

这里的问题是,它返回第一次出现的斜杠,而我想得到最后一次出现的斜杠(这样我就可以使用围绕上述代码的“正确”函数来捕获文件名)

感谢任何有关如何获取字符串中最后一个斜杠的帮助!

谢谢!

【问题讨论】:

标签: vba excel


【解决方案1】:

Instr 从文本字符串的开头查找,InstrRev 从另一端开始查找。

Public Function FileNameOnly(ByVal FileNameAndPath As String) As String

    FileNameOnly = Mid(FileNameAndPath, InStrRev(FileNameAndPath, "\") + 1, Len(FileNameAndPath))

End Function

【讨论】:

  • 谢谢大家 - 我使用了关于 instrRev + 上述逻辑的组合来获得名称:)
  • 将添加MsgBox CreateObject("Scripting.FileSystemObject").GetFileName(CreateObject("Scripting.FileSystemObject").GetAbsolutePathName("<Full Path To File>")) 作为一个衬里 - 虽然不是特别有用(调用 FileSystemObject 两次)。 :)
  • 我要添加的两个很好的解决方案 1) 使用 Application.PathSeparator 而不是 "\" 并赋予它更多通用性 2) 避免双重 FileSystemObject 对象 With CreateObject "Scripting.FileSystemObject")| FileNameOnly = .GetFileName(.GetAbsolutePathName(FileNameAndPath))| End With -
  • Application.PathSeparator - 这是我试图记住的命令。想不出拯救我生命的措辞。 :)
【解决方案2】:

考虑:

Sub marine()
    Dim s As String, ary
    s = "C:\whatever\sub1\sub2\reallydeep\x.xlsm"
    ary = Split(s, "\")
    MsgBox ary(UBound(ary))
End Sub

【讨论】:

    【解决方案3】:

    使用 InStrRev() 从字符串的右侧查找第一个出现的斜线。

    https://msdn.microsoft.com/en-us/library/t2ekk41a(v=vs.90).aspx

    【讨论】:

      【解决方案4】:

      假设 StrFrom 是一些用户定义的函数,下面会做你想做的事:

      Dim filename as String
      Dim path as String
      
      path = StrFrom(pName)
      filename = Mid$(path, InstrRev(path, "\") + 1)
      

      请注意,Mid$ 比 Right$ 更易于使用,因为 InstrRev 从字符串左侧返回字符位置。省略 Mid$ 的最后一个参数,从该位置返回字符串的其余部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-22
        • 2017-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-18
        • 1970-01-01
        相关资源
        最近更新 更多