ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 小小处女作:自定义函数(从完整路径中分离文件名/路径/尾缀名)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-11-14 11:32 | 显示全部楼层
opel-wong 发表于 2014-11-14 11:31
也不是很严谨, 测试发现, 路径返回的不正确.

FullPath = "F:\Funshion.Media\红高.粱-MP4\红高粱-第45 ...

已改,重新测试。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-14 11:46 | 显示全部楼层
本帖最后由 opel-wong 于 2014-11-14 11:58 编辑
yjh_27 发表于 2014-11-14 11:32
已改,重新测试。

感谢指点, 不错, 学习了.
第2种方法, 由 坛友 yjh_27 大师进行改进,代码在9楼。

不过, Join 函数, 要改为 VBA.Join 才能使用.
我把代码再放一下吧,如下:
  1. Public Function NameAndPath2(ByVal FullPath As String, myNo As Byte) As String
  2.     Dim aa() As String: aa = Split(FullPath, "")
  3.     Dim bb() As String: bb = Split(aa(UBound(aa)), ".")
  4.     If myNo = 1 Then    ' 第二参数为1
  5.         NameAndPath2 = "." & bb(UBound(bb))   ' 返回: 尾缀名
  6.     ElseIf myNo = 2 Then    ' 第二参数为2
  7.         ReDim Preserve bb((UBound(bb)) - 1)
  8.         NameAndPath2 = VBA.Join(bb, ".")  ' 返回: 文件名
  9.     ElseIf myNo = 3 Then    ' 第二参数为3
  10.         NameAndPath2 = aa(UBound(aa))    ' 返回: 带后缀文件名
  11.     ElseIf myNo = 4 Then    ' 第二参数为4
  12.         If UBound(aa) = 0 Then
  13.             NameAndPath2 = ""
  14.         Else
  15.             ReDim Preserve aa((UBound(aa)) - 1)
  16.             NameAndPath2 = VBA.Join(aa, "")    ' 返回: 路径
  17.         End If
  18.     Else:
  19.         NameAndPath2 = ""
  20.     End If
  21. End Function
复制代码



1楼的第一种,不需要修改,亦适应类似情况。

.




.

TA的精华主题

TA的得分主题

发表于 2014-11-14 13:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
新手练练手是好事。不过这个自定义函数完全没有用处。

因为一般只需要其中的一个结果,那么写一句代码就够了。不需要使用啰唆的函数。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-14 14:20 | 显示全部楼层
香川群子 发表于 2014-11-14 13:21
新手练练手是好事。不过这个自定义函数完全没有用处。

因为一般只需要其中的一个结果,那么写一句代码就 ...

感谢女侠支持,纯属新手练手,呵呵 。

要不女侠给优化一下,我也想学习一下。谢谢。

TA的精华主题

TA的得分主题

发表于 2014-11-14 16:58 | 显示全部楼层
opel-wong 发表于 2014-11-14 14:20
感谢女侠支持,纯属新手练手,呵呵 。

要不女侠给优化一下,我也想学习一下。谢谢。
  1. Function FileInf(FullName, Optional k = 0)
  2.     If k = -1 Then FileInf = Left(FullName, InStrRev(FullName, "") - 1): Exit Function
  3.     FileInf = Mid(FullName, InStrRev(FullName, "") + 1): If k = 0 Then Exit Function
  4.     If k = 1 Then FileInf = Left(FileInf, InStrRev(FileInf, ".") - 1) Else FileInf = Mid(FileInf, InStrRev(FileInf, ".") + 1)
  5. End Function
复制代码
对于输入【参数-1】ThisWorkbook.FullName 例如:【D:\Documents\Test.xls】

k=-1时,返回 【文件夹名】 如:【D:\Documents】
默认 k=0 时,返回带后缀  【文件全名】 如: 【Test.xls】
k=1 时,返回 【文件名】 如:【Test】
k=2 时,返回 【文件后缀名】 如: 【xls】

以上。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-14 17:05 | 显示全部楼层
香川群子 发表于 2014-11-14 16:58
对于输入【参数-1】ThisWorkbook.FullName 例如:【D:\Documents\Test.xls】

k=-1时,返回 【文件夹名 ...

测试了一下,能达到效果.
代码精简,学习了.

.

TA的精华主题

TA的得分主题

发表于 2014-11-14 17:12 | 显示全部楼层
opel-wong 发表于 2014-11-14 17:05
测试了一下,能达到效果.
代码精简,学习了.

现实应用中,只要使用其中的1句代码即可……所以说写这个自定义函数是没有意义的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-14 17:49 | 显示全部楼层
本帖最后由 opel-wong 于 2014-11-15 09:26 编辑
香川群子 发表于 2014-11-14 17:12
现实应用中,只要使用其中的1句代码即可……所以说写这个自定义函数是没有意义的。

明白。谢谢指点。



.

TA的精华主题

TA的得分主题

发表于 2014-12-14 22:38 | 显示全部楼层
其实Windows已经提供了相关的函数,下面的代码是通过API来实现的,仅供参考。因为在某些语言的系统中(如日文系统)路径分隔符并不是"\",所以没有使用字符来判断分割或是提取。

  1. #If VBA7 Then
  2.     Private Declare PtrSafe Function PathRemoveFileSpec Lib "shlwapi.dll" Alias "PathRemoveFileSpecW" (ByVal pszPath As LongPtr) As Long
  3.     Private Declare PtrSafe Function PathRemoveBackslashW Lib "shlwapi.dll" (ByVal pszPath As LongPtr) As Long
  4.     Private Declare PtrSafe Function PathAddBackslashW Lib "shlwapi.dll" (ByVal pszPath As LongPtr) As Long
  5.     Private Declare PtrSafe Function PathStripPath Lib "shlwapi.dll" Alias "PathStripPathW" (ByVal pszPath As LongPtr) As Long
  6.     Private Declare PtrSafe Function PathRemoveExtension Lib "shlwapi.dll" Alias "PathRemoveExtensionW" (ByVal pszPath As LongPtr) As Long
  7.     Private Declare PtrSafe Function PathFindExtension Lib "shlwapi.dll" Alias "PathFindExtensionW" (ByVal pszPath As LongPtr) As Long
  8.     Private Declare PtrSafe Sub CopyMemoryString Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As Long)
  9.     Private Declare PtrSafe Function lStrLen Lib "kernel32.dll" Alias "lstrlenW" (ByVal lpString As LongPtr) As Long
  10. #Else
  11.     Private Declare Function PathRemoveFileSpec Lib "shlwapi.dll" Alias "PathRemoveFileSpecW" (ByVal pszPath As Long) As Long
  12.     Private Declare Function PathRemoveBackslashW Lib "shlwapi.dll" (ByVal pszPath As Long) As Long
  13.     Private Declare Function PathAddBackslashW Lib "shlwapi.dll" (ByVal pszPath As Long) As Long
  14.     Private Declare Function PathStripPath Lib "shlwapi.dll" Alias "PathStripPathW" (ByVal pszPath As Long) As Long
  15.     Private Declare Function PathRemoveExtension Lib "shlwapi.dll" Alias "PathRemoveExtensionW" (ByVal pszPath As Long) As Long
  16.     Private Declare Function PathFindExtension Lib "shlwapi.dll" Alias "PathFindExtensionW" (ByVal pszPath As Long) As Long
  17.     Private Declare Sub CopyMemoryString Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
  18.     Private Declare Function lStrLen Lib "kernel32.dll" Alias "lstrlenW" (ByVal lpString As Long) As Long
  19. #End If

  20. '从路径中提取目录
  21. Public Function ExtractPathDirctory(ByVal sPath As String) As String
  22.   Dim I As Long
  23.   
  24.   sPath = sPath & String(5, vbNullChar)
  25.   PathRemoveBackslashW StrPtr(sPath)
  26.   PathRemoveFileSpec StrPtr(sPath)
  27.   PathAddBackslashW StrPtr(sPath)
  28.   I = InStr(sPath, vbNullChar)
  29.   If I > 0 Then sPath = Left$(sPath, I - 1)
  30.   ExtractPathDirctory = sPath
  31. End Function

  32. '从路径中提取文件名,去掉了路径中的目录。
  33. Public Function ExtractFileName(ByVal sPath As String, Optional ByVal ExtensionReturn As Boolean = True) As String
  34.   Dim I       As Long, J As Long
  35.   Dim strPath As String
  36.   
  37.   sPath = sPath & String(5, vbNullChar)
  38.   PathRemoveBackslashW StrPtr(sPath)
  39.   PathStripPath StrPtr(sPath)
  40.   If Not ExtensionReturn Then PathRemoveExtension StrPtr(sPath)
  41.   I = InStr(sPath, vbNullChar)
  42.   If I > 0 Then sPath = Left$(sPath, I - 1)
  43.   ExtractFileName = sPath
  44. End Function

  45. '从路径提取文件后缀名
  46. Public Function ExtractFileExtension(ByVal sPath As String) As String
  47.   Dim ptrExt As Long
  48.   Dim ExtLen As Long
  49.   
  50.   sPath = sPath & vbNullChar
  51.   ptrExt = PathFindExtension(StrPtr(sPath))
  52.   If ptrExt Then
  53.     ExtLen = lStrLen(ptrExt)
  54.     If ExtLen > 0 Then
  55.       ExtractFileExtension = String(ExtLen, vbNullChar)
  56.       CopyMemoryString StrPtr(ExtractFileExtension), ptrExt, LenB(ExtractFileExtension)
  57.     End If
  58.   End If
  59. End Function

  60. Sub Test()
  61.     Const FileName As String = "C:\Windows.Old\1.TXT\ABC.123.后缀名有点怪"
  62.     Debug.Print "文件全路径名:""" & FileName & """"
  63.     Debug.Print "文件所在路径:""" & ExtractPathDirctory(FileName) & """"
  64.     Debug.Print "带后缀文件名:""" & ExtractFileName(FileName) & """ 不带后缀文件名:""" & ExtractFileName(FileName, False) & """"
  65.     Debug.Print "文件后缀名为:""" & ExtractFileExtension(FileName) & """"
  66. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-12-14 23:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
正是抛砖引用玉,学习一下……
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-5 11:17 , Processed in 0.047687 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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