vb 里面保存文件对话框,最常用就是 CommonDialog 控件的 ShowSave 方法,作用是弹出系统标准另存为窗口,让用户选择保存路径 输入文件名 选择文件格式,拿到完整保存路径之后,再配合代码执行文件写入保存操作,很多新手容易踩一个误区,就是以为调用 ShowSave 就会自动保存文件,实际上这个对话框只负责收集用户选择的路径和文件名,真正写文件保存还需要自己写代码,vb6 和 vba 写法有区别,vba 里面还可以使用 Application.GetSaveAsFilename,不需要额外添加 CommonDialog 控件,在 excel vba 里面这个方案更加方便,不用注册控件,兼容性更好,适合自动化脚本批量导出表格 文本 报表,同时可以设置默认文件名 默认后缀 文件过滤,限制用户只能保存指定类型文件,还能判断用户是否点了取消按钮,避免代码报错。
两种实现方案对照表
| 实现方案 | 适用环境 | 是否需要控件 | 特点 |
|---|---|---|---|
| CommonDialog ShowSave | vb6 | 需要添加部件控件 | 原生系统对话框,功能丰富 |
| GetSaveAsFilename | excel vba | 不需要控件 | 调用 excel 内置方法,无需额外部件 |
方案一 CommonDialog 控件 ShowSave 详细步骤
第一步 添加控件,在 vb 工程里面点击部件,找到 Microsoft Common Dialog Control,勾选之后把控件拖放到窗体上,默认名字是 CommonDialog1
第二步 设置关键属性
Filter 文件过滤器,用来限定保存类型,格式是 描述 | 后缀
DefaultExt 默认扩展名,用户没有手动输入后缀的时候自动补上
FileName 默认文件名,对话框打开就预填名称
第三步 调用 ShowSave 弹出窗口
CommonDialog1.ShowSave
第四步 获取路径,读取 CommonDialog1.FileName,这个变量就是用户选择的完整保存路径
第五步 判断取消,如果用户点击取消,FileName 为空,代码要加判断,防止后续保存报错
第六步 编写文件写入代码,打开文件号,写入内容,关闭文件
基础代码示例
CommonDialog1.Filter = " 文本文件 |.txt|Excel 文件 |.xlsx"
CommonDialog1.DefaultExt = "txt"
CommonDialog1.FileName = "测试文件"
CommonDialog1.ShowSave
If CommonDialog1.FileName <> "" Then
Open CommonDialog1.FileName For Output As 1
Print 1, "这里是要保存的内容"
Close 1
End If
方案二 vba GetSaveAsFilename 详细步骤
这个是 excel vba 专用,不需要 CommonDialog 控件,直接调用内置函数
语法
GetSaveAsFilename (InitialFilename, FileFilter, Title)
参数说明
InitialFilename 默认文件名
FileFilter 文件过滤
Title 对话框窗口标题
代码示例
Dim savePath As Variant
savePath = Application.GetSaveAsFilename (InitialFilename:="报表", FileFilter:="Excel 文件 (.xlsx), .xlsx", Title:="保存报表")
If savePath <> False Then
ThisWorkbook.SaveAs Filename:=savePath
End If
重点判断条件,用户点取消的时候这个函数返回 False,不是空字符串,这个和 CommonDialog 判断不一样,非常容易写错。
核心属性清单
Filter 过滤文件类型,多个类型用竖线分隔
DefaultExt 自动补后缀
FileName 获取完整保存路径
Title 修改对话框窗口标题
InitDir 设置默认打开的文件夹路径
易错重点
第一 ShowSave 只弹窗口,不会自动保存,必须自己写 Open 或者 SaveAs 保存代码
第二 vb6 的 CommonDialog 属于 ActiveX 控件,部分精简系统会提示控件缺失,需要注册 ocx 文件
第三 vba GetSaveAsFilename 取消返回 False,判断的时候不能写 <>""
第四 文件过滤格式不能写错,描述和后缀之间必须用竖线分隔,格式错误对话框会异常
第五 路径包含中文的时候,vb6 旧版本偶尔会出现编码问题,vba 兼容性更好
综合掌握 vb 保存文件对话框,vb6 优先使用 CommonDialog 的 ShowSave,excel vba 优先使用 GetSaveAsFilename,记住对话框只负责获取保存路径,真正保存动作需要额外代码,做好取消按钮判断,设置文件过滤和默认文件名,就可以做出规范的另存为功能。
【常见问题】
问题 1 vb 保存文件对话框调用之后为什么没有自动保存
回答 1 vb 保存文件对话框的 ShowSave 只是弹出窗口获取路径,不会自动写入文件,使用 vb 保存文件对话框之后,还需要额外编写 Open 或者 SaveAs 代码完成保存。
问题 2 vba 里面 vb 保存文件对话框可以不用 CommonDialog 控件吗
回答 1 可以,vba 里面实现 vb 保存文件对话框,可以直接使用 Application.GetSaveAsFilename,不需要添加 CommonDialog 控件,是 vba 更推荐的写法。
问题 3 用户点击取消 vb 保存文件对话框怎么判断
回答 1 vb 保存文件对话框如果是 CommonDialog 方案,取消之后 FileName 为空,如果是 vba GetSaveAsFilename 方案,点击取消返回 False,两种判断方式不一样,写 vb 保存文件对话框代码要区分。
【免责申明】
本内容仅为 vb 与 vba 代码学习参考,vb6 和 vba 版本存在差异,代码请结合自身开发环境测试。


