You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA从路径字符串提取文件名隔次生效问题求助

问题根因

代码中提取文件名的逻辑写错了InStrRev的搜索对象参数:需要从当前循环拿到的全路径fName中查找反斜杠\的位置,但错误传入了还未完成赋值的filename变量,导致每次计算位置时依赖的是上一次循环留下的filename值,才会出现每隔一次生效的异常。

修复方案
  • 直接修改原有Mid逻辑的参数即可,把InStrRev(filename, "\")改为InStrRev(fName, "\"):
' 修复后的Mid写法
filename = Mid(fName, InStrRev(fName, "\") + 1)
' 如果你想用Right函数的话修复后写法如下:
' filename = Right(fName, Len(fName) - InStrRev(fName, "\"))
  • 更简洁的替代方案:可以直接调用文件操作工具类方法,无需手动计算字符位置:
' 无需手动处理字符串切割,适配各种合法路径格式
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
filename = fso.GetFileName(fName)
完整修复后代码
Private Sub ButtonAdd_Click()
    Dim fd As FileDialog
    Dim fName As String ' 存储全路径
    Dim nextRow As Long
    Dim filename As String ' 存储提取的纯文件名
    Dim i As Integer ' 补充循环变量声明,避免开启Option Explicit时报错
    Dim fchosen As Integer ' 补充选择状态变量声明

    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    fd.Title = "Please select file to add"
    fd.InitialFileName = ThisWorkbook.FullName
    fd.AllowMultiSelect = True
    fchosen = fd.Show

    If fchosen = -1 Then
        For i = 1 To fd.SelectedItems.Count
            fName = fd.SelectedItems(i)
            ' 修复参数错误
            filename = Mid(fName, InStrRev(fName, "\") + 1)
            
            MsgBox (filename)
            nextRow = Range("a" & Rows.Count).End(xlUp).Row + 1
            Range("a" & nextRow) = filename
        Next i
    End If
    ' 释放对象内存
    Set fd = Nothing
End Sub

内容的提问来源于stack exchange,提问作者rob l

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 13:36:11