ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4819|回复: 13

[推荐] 开发一个提取文件名称的函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-14 08:30 | 显示全部楼层 |阅读模式
本帖最后由 andysky 于 2018-12-21 08:33 编辑

文件名称.gif

还可以
Filename=CreateObject("Scripting.FileSystemObject").GetBaseName(mystr)

还可以
Filename = Mid(Mystr, InStrRev(Mystr, "\") + 1, InStrRev(Mystr, ".") - InStrRev(Mystr, "\") - 1)

如果是VSTO则用
Filename =System.IO.Path.GetFileNameWithoutExtension(mystr)

TA的精华主题

TA的得分主题

发表于 2018-12-14 08:33 | 显示全部楼层
好强!!!!!!

TA的精华主题

TA的得分主题

发表于 2018-12-14 08:34 | 显示全部楼层
为什么不用先Split到数组然后再得到文件名?而是用两个Split?虽然时间速度没感知,但效率不是相对低了?

TA的精华主题

TA的得分主题

发表于 2018-12-14 09:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
'学习了。试了一下修改成一行也可以,估计效率很差
getfilename = Split(Split(mystr, "\")(UBound(Split(mystr, "\"))), ".")(0)


'或改成这样效率可能会高点
getfilename = Split(Mid(mystr, InStrRev(mystr, "\") + 1), ".")(0)

TA的精华主题

TA的得分主题

发表于 2018-12-14 10:05 | 显示全部楼层
一把小刀闯天下 发表于 2018-12-14 09:59
'学习了。试了一下修改成一行也可以,估计效率很差
getfilename = Split(Split(mystr, "\")(UBound(Split( ...

去后缀不能用Split,因为文件名可能带“.”

TA的精华主题

TA的得分主题

发表于 2018-12-14 10:07 | 显示全部楼层
前几天有个这样的帖子
http://club.excelhome.net/forum. ... 660&pid=9752463
我用两个InStrRev的

Sub test()
Dim rng, name, a, b
rng = "D:\PPT素材库\图标\场景\场景-职业和工作.pptx"
a = InStrRev(rng, "\") + 1
b = InStrRev(rng, ".") - a
name = Mid(rng, a, b)
MsgBox name
End Sub

TA的精华主题

TA的得分主题

发表于 2018-12-14 10:16 | 显示全部楼层
如果某个命令 能取得 绝对路径的话,也应该能 直接读出文件名吧。

TA的精华主题

TA的得分主题

发表于 2018-12-14 10:22 | 显示全部楼层
本帖最后由 一把小刀闯天下 于 2018-12-14 11:33 编辑
MOY838840554 发表于 2018-12-14 10:05
去后缀不能用Split,因为文件名可能带“.”

不带"."取(0)不会有问题,如果是获取扩展名取(1)就会出问题,可以试一下,,,

==============
哈哈,看错了。如果文件名中本来就有"."另还要考虑可能无扩展名,也就是没有".",那改成一行是没有什么意思,还是按二行来写。

一行很啰嗦效率肯定很差:
getfilename = Left(Mid(mystr, InStrRev(mystr, "\") + 1), IIf(InStrRev(Mid(mystr, InStrRev(mystr, "\") + 1), ".") = 0, Len(Mid(mystr, InStrRev(mystr, "\") + 1)), InStrRev(Mid(mystr, InStrRev(mystr, "\") + 1), ".") - 1))

TA的精华主题

TA的得分主题

发表于 2018-12-14 11:17 | 显示全部楼层
个人认为用两个instrRev是效率最高的,另外需要考虑文件名没有“."和有一个以上"."的情况,因此在6楼基础上修改如下:
Sub test()
Dim rng, name, a, b
rng = "D:\PPT素材库\图标\场景\场景-职业和工作.pptx"
name = Mid(rng, InStrRev(rng, "\") + 1)
b = InStrRev(name, ".")
If b > 0 Then
    name = Left(name, b - 1)
End If
MsgBox name
End Sub

TA的精华主题

TA的得分主题

发表于 2018-12-14 12:36 | 显示全部楼层
小fisher 发表于 2018-12-14 11:17
个人认为用两个instrRev是效率最高的,另外需要考虑文件名没有“."和有一个以上"."的情况,因此在6楼基础上 ...

要通用就得考虑全面及特殊性,学习了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 06:41 , Processed in 0.045085 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表