ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于文件全路径名的拆分,我用API方法写了个函数供借鉴

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-15 07:18 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Attribute VB_Name = "API_SplitPath_Unicode"
Option Private Module '如果希望在表格内显式调用,关闭该语句
Option Explicit

'将本文件导入你的VBA工程即可使用,如果您使用MS9.0运行时库,将"MSVCR100.DLL" 更改为"MSVCR90.DLL"
Declare PtrSafe Function Splitpath Lib "MSVCR100.DLL" Alias "_wsplitpath_s" (ByVal FullPath As LongPtr, _
                                                                        ByVal Drive As LongPtr, ByVal DriveSize As Long, _
                                                                        ByVal Dir As LongPtr, ByVal DirSize As Long, _
                                                                        ByVal Filename As LongPtr, ByVal FilenameSize As Long, _
                                                                        ByVal Ext As LongPtr, ByVal ExtSize As Long) As Long
'返回字符串中第一个vbNullChar字符以前的字符串,不包括vbNullChar本身
Public Function DelStrNull(ByVal retStr As String) As String
    Dim N As Integer
    N = InStr(1, retStr, vbNullChar)
    If (N >= 1) Then
        retStr = Left(retStr, N - 1)
    End If
    DelStrNull = retStr
End Function                                                                       
                                                                        
'Bz=0----返回 Ext
'Bz=1----返回 Fname
'Bz=2----返回 Dir
'Bz=3----返回 Drive
'Bz=4----返回 Fname+Ext
'Bz=5----返回 Drive+Dir
Function GetFilePart(ByVal FullPath As String, Optional Bz As Integer = 4) As String
    Dim sStr As String
    Dim sStr2 As String
    Dim Rt As Integer
    sStr = String(260, vbNullChar)
    If (Bz = 0) Then
        Rt = Splitpath(StrPtr(FullPath & vbNullChar), StrPtr(vbNullString), 0, StrPtr(vbNullString), 0, StrPtr(vbNullString), 0, StrPtr(sStr), 260)
    ElseIf (Bz = 1) Then
        Rt = Splitpath(StrPtr(FullPath & vbNullChar), StrPtr(vbNullString), 0, StrPtr(vbNullString), 0, StrPtr(sStr), 260, StrPtr(vbNullString), 0)
    ElseIf (Bz = 2) Then
        Rt = Splitpath(StrPtr(FullPath & vbNullChar), StrPtr(vbNullString), 0, StrPtr(sStr), 260, StrPtr(vbNullString), 0, StrPtr(vbNullString), 0)
    ElseIf (Bz = 3) Then
        Rt = Splitpath(StrPtr(FullPath & vbNullChar), StrPtr(sStr), 260, StrPtr(vbNullString), 0, StrPtr(vbNullString), 0, StrPtr(vbNullString), 0)
    ElseIf (Bz = 5) Then
        sStr2 = String(260, vbNullChar)
        Rt = Splitpath(StrPtr(FullPath & vbNullChar), StrPtr(sStr), 260, StrPtr(sStr2), 260, StrPtr(vbNullString), 0, StrPtr(vbNullString), 0)
    Else
        sStr2 = String(260, vbNullChar)
        Rt = Splitpath(StrPtr(FullPath & vbNullChar), StrPtr(vbNullString), 0, StrPtr(vbNullString), 0, StrPtr(sStr), 260, StrPtr(sStr2), 260)
    End If
    If (Bz > 3) Then
        GetFilePart = DelStrNull(sStr) + DelStrNull(sStr2)
    Else
        GetFilePart = DelStrNull(sStr)
    End If
End Function
-----------------------------
以上是导出的bas文件,将这个文件直接导入VBA工程就可以使用
我只在win64--VBA7.0下实验了。VBS7.0---Win32应该也可以

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 07:21 | 显示全部楼层
模块测试如下
B12.png
-----------------
导出的Bas文件
API_SplitPath_Unicode.rar (872 Bytes, 下载次数: 47)

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 07:27 | 显示全部楼层
直接采用内存传递Excel的Unicode字符串的内存指针,
系统调用W版本的函数,直接填写这个内存,
躲过VBA参数转换、申请临时内存、两次U-A、A-U转换
唯一需要折腾的是VBA的BSTR字符存储机制

TA的精华主题

TA的得分主题

发表于 2014-12-15 07:36 | 显示全部楼层
API不太了解。。。。
学习下

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 07:41 | 显示全部楼层
liulang0808 发表于 2014-12-15 07:36
API不太了解。。。。
学习下

单独要某个Part的话,我我这函数改写一下就可以了
比如你单独要扩展名,甚至你的VBA过程一下要处理四个Part,
你一次返回四个就可以了,
相应的位置象我这么传进去四个字符串地址,
------------
不过这样界面不能直接调用;
------------
建议大家在写所有复杂函数之前,一定先查查系统API
看看人家里面有没有对应的功能函数
再厉害咱自己写的代码都没系统内核的好

TA的精华主题

TA的得分主题

发表于 2018-6-1 16:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lsdlyhz 发表于 2014-12-15 07:41
单独要某个Part的话,我我这函数改写一下就可以了
比如你单独要扩展名,甚至你的VBA过程一下要处理四个P ...

大侠你好!我在excel里怎么用?我期待的效果是在单元格内输入自定义函数→回车后提示输入路径或者选取包含路径的引用单元格→然后文件名就出现在公式输入的单元格里了,当然输入其他参数可以提取包含某特定字符的文件名或者某类后缀名的文件……感谢大侠指导!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-18 22:27 , Processed in 0.033308 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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