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
相关产品推荐
相关产品推荐

