ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

用vba选择文件夹

[复制链接]

TA的精华主题

TA的得分主题

发表于 2004-3-16 15:27 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:文件操作和FSO
Excel’s VBA 模块允许你用GetOpenFilename 和 GetSaveAsFilename 方法显示标准的文件打开和文件保存对话框。但是,现在并不是要大家做一个文件夹选择对话框。本篇介绍两种显示文件选择对话框的方法给大家。
第一种方法是使用Windows API 调用显示对话框。第二种方法用“Microsoft shell 控件和自动化 ”对象库。第一种方法可以在Windows的任意版本使用(win95或更晚),而第二种方法需要用户安装了Internet Explorer 5或更高版本。 使用 Windows API 函数 复制下列代码到标准代码模块: Private Const BIF_RETURNONLYFSDIRS As Long = &H1
Private Const BIF_DONTGOBELOWDOMAIN As Long = &H2
Private Const BIF_RETURNFSANCESTORS As Long = &H8
Private Const BIF_BROWSEFORCOMPUTER As Long = &H1000
Private Const BIF_BROWSEFORPRINTER As Long = &H2000
Private Const BIF_BROWSEINCLUDEFILES As Long = &H4000
Private Const MAX_PATH As Long = 260

Type BrowseInfo
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszINSTRUCTIONS As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type

Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Boolean
hNameMappings As Long
lpszProgressTitle As String
End Type

Declare Function SHGetPathFromIDListA Lib "shell32.dll" ( _
ByVal pidl As Long, _
ByVal pszBuffer As String) As Long

Declare Function SHBrowseForFolderA Lib "shell32.dll" ( _
lpBrowseInfo As BrowseInfo) As Long


Function BrowseFolder(Optional Caption As String = "") As String

Dim BrowseInfo As BrowseInfo
Dim FolderName As String
Dim ID As Long
Dim Res As Long

With BrowseInfo
.hOwner = 0
.pidlRoot = 0
.pszDisplayName = String$(MAX_PATH, vbNullChar)
.lpszINSTRUCTIONS = Caption
.ulFlags = BIF_RETURNONLYFSDIRS
.lpfn = 0
End With

FolderName = String$(MAX_PATH, vbNullChar)

ID = SHBrowseForFolderA(BrowseInfo)

If ID Then
Res = SHGetPathFromIDListA(ID, FolderName)
If Res Then
BrowseFolder = Left$(FolderName, InStr(FolderName, _
vbNullChar) - 1)
End If
End If

End Function



你可以在下列代码中调用BrowseFolder函数

Dim FName As String
FName = BrowseFolder("Select A Folder")
If FName = "" Then
MsgBox "You didn’t select a folder"
Else
MsgBox "You selected: " & FName
End If


注意:API不允许你指定开始文件夹。 使用Shell控件库 首先你需要调用"Microsoft Shell Controls And Automation"对象库。在VBA编辑器中,选中“工具”项,点击选择“引用”,然后拖动滚动条选中并进行下一步。 然后复制下列代码到标准代码模块:

Private Const BIF_RETURNONLYFSDIRS As Long = &H1
Private Const BIF_DONTGOBELOWDOMAIN As Long = &H2
Private Const BIF_RETURNFSANCESTORS As Long = &H8
Private Const BIF_BROWSEFORCOMPUTER As Long = &H1000
Private Const BIF_BROWSEFORPRINTER As Long = &H2000
Private Const BIF_BROWSEINCLUDEFILES As Long = &H4000
Private Const MAX_PATH As Long = 260


Function BrowseFolder(Optional Caption As String, _
Optional InitialFolder As String) As String

Dim SH As Shell32.Shell
Dim F As Shell32.Folder

Set SH = New Shell32.Shell
Set F = SH.BrowseForFolder(0&, Caption, BIF_RETURNONLYFSDIRS, _
InitialFolder)

If Not F Is Nothing Then
BrowseFolder = F.Items.Item.Path
End If

End Function


你可以在下列代码中调用BrowseFolder函数

Dim FName As String
FName = BrowseFolder("Select a folder", "C:\InitialFolder")
If FName = "" Then
MsgBox "You didn’t select a folder"
Else
MsgBox "You selected: " & FName
End If


注意: Shell32 允许你指定开始文件夹。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2004-3-16 22:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2004-4-1 14:54 | 显示全部楼层
楼主,我试了一下你的程序,不错,但是如果将 FName = BrowseFolder("Select a folder", "C:\InitialFolder")
中的c:\initialfolder改成自己机子内的一个存在的文件夹后,弹出的对话框内就只有该文件夹下一级的目录,找不到C盘、我的电脑、我的文档之类的东西了,是你的程序有问题,还是ie的版本有问题,我是在98下装的是ie6。

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-5-21 16:50 | 显示全部楼层
以下是引用pwkduke在2004-4-1 14:54:00的发言: 楼主,我试了一下你的程序,不错,但是如果将 FName = BrowseFolder("Select a folder", "C:\InitialFolder") 中的c:\initialfolder改成自己机子内的一个存在的文件夹后,弹出的对话框内就只有该文件夹下一级的目录,找不到C盘、我的电脑、我的文档之类的东西了,是你的程序有问题,还是ie的版本有问题,我是在98下装的是ie6。
对API函数进行了解后,应该能解决

TA的精华主题

TA的得分主题

发表于 2004-5-22 16:22 | 显示全部楼层
要是能再进一步到选择某个文件就好了。

TA的精华主题

TA的得分主题

发表于 2005-8-5 19:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2005-8-6 16:28 | 显示全部楼层
以下是引用cheese在2005-8-5 19:16:00的发言: 我是初学者,能贴上附件,也好学习学习
[em49]waiting[em48]

TA的精华主题

TA的得分主题

发表于 2006-7-10 06:30 | 显示全部楼层
这么复杂的代码,我还是自己做个窗体得了。[em12]

TA的精华主题

TA的得分主题

发表于 2006-7-10 09:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-7-10 09:41 | 显示全部楼层
QUOTE:
以下是引用zhyzhsh在2006-7-10 6:30:00的发言:
这么复杂的代码,我还是自己做个窗体得了。[em12]

拿來主義,拿來能用,不也是一種捷徑嗎?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 00:23 , Processed in 0.037998 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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