【问题标题】:VBA Faulty function InstrRev = InstrVBA 错误函数 InstrRev = Instr
【发布时间】:2017-04-30 18:43:47
【问题描述】:

我一直在尝试从文件结构中查找扩展名,为此我很难使用 InstrRev(filename, ".") 但不是返回 4,而是返回 30,与 Instr 的方式相同。 .

任何人都知道一个奇怪的错误会导致 excel 向 2 个相反的函数给出相同的结果?

亲切的问候, 丹尼尔

【问题讨论】:

  • 这就是它的工作方式。它从字符串的末尾回溯并返回相对于原始字符串的位置。它不会反转字符串或给出反转位置,它只是从末尾向后搜索。有关更多信息,请参阅文档
  • @Dumitru Daniel 在下面看到我的回答,如果它回答了您的问题,请告诉我,还请查看如何找到扩展名
  • 您应该使用Scripting.FileSystemObject for this 而不是手动尝试解析它。
  • 接受的答案当然效果很好..但在我的情况下仅供参考,我在使用带有“Right”功能的 InStrRev 时特别愚蠢!当然将其更改为“Mid”功能并且它..工作了:)

标签: excel vba function


【解决方案1】:

InStrRev 函数从字符串 1 的末尾找到 sting2 为真,但它的返回是因为找到的位置是从开头而不是从结尾。

【讨论】:

    【解决方案2】:

    InstrInstrRev 的区别在于它寻找某个子字符串的方向。 Instr 是从头到尾,而InstrRev 是从字符串的末尾到开头。 result 字符位置始终从字符串的开头开始计算(从左到右)。

    我猜在您的示例中,您的路径中只有一个 ".",这就是结果相同的原因。

    假设您正在寻找“干净”文件名的情况,因此您正在寻找最后一个\,那么您会发现InStrRev 函数非常有用(例如,请参见下面的代码)。

    你的情况:如果你想找到扩展名,假设结果是 31,然后使用Mid 函数:

    ExtensionStr = Mid(FullName, dotRes + 1, Len(FullName) - dotRes) ' < --- returns "xlsm"  
    

    (dotRes = 31, ExtensionStr 是一个代表干净扩展名的字符串)


    代码示例

    Sub Instr_InstrRev()
    
    Dim instrRes As Variant
    Dim instrRevRes As Variant
    Dim dotRes As Variant
    Dim ExtensionStr As String
    Dim FullName    As String
    
    FullName = "C:\Users\Radoshits\Desktop\SO2.xlsm"
    instrRes = InStr(FullName, "\") ' <-- returns 3
    instrRevRes = InStrRev(FullName, "\") ' <-- returns 27
    
    ' to answer your post how to find the "clean" extension name
    dotRes = InStr(FullName, ".") ' <-- returns 31
    ExtensionStr = Mid(FullName, dotRes + 1, Len(FullName) - dotRes) ' < --- returns "xlsm"
    
    End Sub
    

    【讨论】:

    • 很好的答案,但是您应该强调一件事:结果字符位置始终从字符串的开头开始计算。这可能会让新手感到困惑。因此,即使 instrrev 从字符串末尾向开头查找匹配项,当它找到匹配项时,它也会返回从开头算起的正确字符位置,而 not 是结尾。
    • 感谢您的解释。你比 MSDN 的文档解释得更好。
    • 另一个鼓励使用FileSystemObjectGetExtensionName 方法。您必须将 reference 添加到Microsoft Scripting Runtime,但这更容易和更安全。考虑这种不太可能但可能的路径:C:\Users\Rados.hits\Desktop\SO2file 使用 GetExtensionName,您可以在 2 行中获得正确的扩展名(1 行用于任何后续调用)。
    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 2019-04-02
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多