Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VBA代码库06:实现健壮的“另存为”功能

VBA代码库06:实现健壮的“另存为”功能

作者头像
fanjy
发布于 2019-07-18 14:01:47
发布于 2019-07-18 14:01:47
2.2K0
举报
文章被收录于专栏:完美Excel完美Excel

学习Excel技术,关注微信公众号:

excelperfect

下面的自定义函数GetSaveAsFilenamePlus函数的代码能够更好地实现GetSaveAsFilename方法的“另存为”功能。该函数接受两个参数,分别是文件名和路径,用于“另存为”对话框中的默认值。如果用户输入的文件名已存在,则会询问用户是否覆盖掉已存在的文件、输入另一个文件名、或者取消保存操作。如果用户取消保存,则该函数返回零长字符串。

GetSaveAsFilenamePlus函数代码如下:

Function GetSaveAsFilenamePlus( _

strFileName As String, _

strPathName As String) As String

Dim strFullName As String

Dim strPrompt As String

Dim strCurDir As String

Dim iOverwrite As Long

If ActiveWorkbook Is Nothing Then

GoTo ExitSub

End If

'保存当前目录,以便以后恢复

strCurDir = CurDir

'切换到所需要的目录

If Len(strPathName) > 0 Then

ChDrive strPathName

ChDir strPathName

End If

'循环直至输入了不同的文件名

Do

strFullName = _

Application.GetSaveAsFilename( _

strFileName, _

"Excel Files(*.xls*),*.xls*", , _

"浏览到文件夹并输入文件名")

If Len(strFullName) = 0 Then GoToExitSub

If strFullName = "False" ThenGoTo ExitSub

'如果文件名唯一,退出循环并保存文件

If Not FileExists(strFullName) ThenExit Do

'告诉用户文件名已存在

'解析文件名

strFileName =FullNameToFileName(strFullName)

strPathName =FullNameToPath(strFullName)

'消息字符串

strPrompt = "名称为'" & strFileName &"'的文件已在'" _

& strPathName & "'中."

strPrompt = strPrompt & vbNewLine& vbNewLine & _

"想要覆盖已存在的文件吗?"

'询问用户要执行的操作

iOverwrite = MsgBox(strPrompt,vbYesNoCancel + vbQuestion, _

"文件已存在")

Select Case iOverwrite

Case vbYes

'覆盖已存在的文件

Exit Do

Case vbNo

'再次循环获得新文件名

Case vbCancel

GoTo ExitSub

End Select

Loop

'使用上面的文件名保存文件

Application.DisplayAlerts = False

ActiveWorkbook.SaveAs strFullName

Application.DisplayAlerts = True

GetSaveAsFilenamePlus = strFullName

ExitSub:

'恢复为已前的默认目录

ChDrive strCurDir

ChDir strCurDir

End Function

在GetSaveAsFilenamePlus函数中调用的函数过程代码如下:

'判断文件是否已存在

'比Dir更灵活

Function FileExists(ByVal FileSpec As String) As Boolean

Dim Attr As Long

On Error Resume Next

Attr = GetAttr(FileSpec)

If Err.Number = 0 Then

'没有错误,表明找到

'如果设置了Directory属性则不是文件

FileExists = Not ((Attr AndvbDirectory) = vbDirectory)

End If

End Function

'将包含路径和文件名的字符串解析并获取文件名

Function FullNameToFileName(sFullName As String) As String

Dim k As Integer

Dim sTest As String

If InStr(1, sFullName, "[") >0 Then

k = InStr(1, sFullName, "[")

sTest = Mid(sFullName, k + 1, InStr(1,sFullName, "]") - k - 1)

Else

For k = Len(sFullName) To 1 Step -1

If Mid(sFullName, k, 1) ="\" Then Exit For

Next k

sTest = Mid(sFullName, k + 1,Len(sFullName) - k)

End If

FullNameToFileName = sTest

End Function

'将包含路径和文件名的字符串解析并获取文件路径

Function FullNameToPath(sFullName As String) As String

'不包括结尾反斜线

Dim k As Integer

For k = Len(sFullName) To 1 Step -1

If Mid(sFullName, k, 1) = "\"Then Exit For

Next k

If k < 1 Then

FullNameToPath = ""

Else

FullNameToPath = Mid(sFullName, 1, k - 1)

End If

End Function

使用下面的过程来测试GetSaveAsFilenamePlus函数:

Sub testGetSaveAsFilenamePlus()

Dim strFile As String

strFile =GetSaveAsFilenamePlus("sample.xlsm", "C:\")

If Len(strFile) > 0 Then

MsgBox "文件已成功保存"

Else

MsgBox "文件没有保存"

End If

End Sub

下面是代码的图片版:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VBA解析VBAProject 06——清除VBA工程密码
如果你收到过一些这样的Excel文件,文件里有VBA代码,实现了很好的功能,可是作者却对VBA工程进行了加密,你可能会非常希望查看到里面的VBA代码。
xyj
2020/10/27
6.8K0
创建MyVBA加载宏
MyVBA加载宏主要功能是设置为自动加载,作为打开其他宏文件的一个程序,做好后大概是这么一个东西:
xyj
2020/07/28
1.1K0
创建MyVBA加载宏
合并/拆分 Excel?Python、VBA轻松自动化
当你收集了 n 个人的 EXCEL 记录表,需要将它们汇成一个总表时你会怎么做呢? 如果不通过技术手段,要一个个打开再复制粘贴也太麻烦了吧! 此时就需要一个通过几秒钟的点击就能完成合并的工具。
朱小五
2020/10/09
2.5K0
合并/拆分 Excel?Python、VBA轻松自动化
EXCEL VBA语句集300
        定制模块行为 (1) Option Explicit ‘强制对模块内所有变量进行声明 Option Private Module ‘标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示  Option Compare Text ‘字符串不区分大小写  Option Base 1 ‘指定数组的第一个下标为1 (2) On Error Resume Next ‘忽略错误继续执行VBA代码,避免出现错误消息 (3) On Error GoTo ErrorHandler ‘当错误发生时跳转到过程中的某个位置 (4) On Error GoTo 0 ‘恢复正常的错误提示 (5) Application.DisplayAlerts=False ‘在程序执行过程中使出现的警告框不显示 (6) Application.ScreenUpdating=False ‘关闭屏幕刷新 Application.ScreenUpdating=True ‘打开屏幕刷新 (7) Application.Enable.CancelKey=xlDisabled ‘禁用Ctrl+Break中止宏运行的功能  工作簿 (8) Workbooks.Add() ‘创建一个新的工作簿 (9) Workbooks(“book1.xls”).Activate ‘激活名为book1的工作簿 (10) ThisWorkbook.Save ‘保存工作簿 (11) ThisWorkbook.close ‘关闭当前工作簿 (12) ActiveWorkbook.Sheets.Count ‘获取活动工作薄中工作表数 (13) ActiveWorkbook.name ‘返回活动工作薄的名称 (14) ThisWorkbook.Name ‘返回当前工作簿名称 ThisWorkbook.FullName ‘返回当前工作簿路径和名称 (15) ActiveWindow.EnableResize=False ‘禁止调整活动工作簿的大小 (16) Application.Window.Arrange xlArrangeStyleTiled ‘将工作簿以平铺方式排列 (17) ActiveWorkbook.WindowState=xlMaximized ‘将当前工作簿最大化  工作表 (18) ActiveSheet.UsedRange.Rows.Count ‘当前工作表中已使用的行数 (19) Rows.Count ‘获取工作表的行数(注:考虑向前兼容性) (20) Sheets(Sheet1).Name= “Sum” ‘将Sheet1命名为Sum (21) ThisWorkbook.Sheets.Add Before:=Worksheets(1) ‘添加一个新工作表在第一工作表前 (22) ActiveSheet.Move After:=ActiveWorkbook. _ Sheets(ActiveWorkbook.Sheets.Count) ‘将当前工作表移至工作表的最后 (23) Worksheets(Array(“sheet1”,”sheet2”)).Select ‘同时选择工作表1和工作表2 (24) Sheets(“sheet1”).Delete或 Sheets(1).Delete ‘删除工作表1 (25) ActiveWorkbook.Sheets(i).Name ‘获取工作表i的名称 (26) ActiveWindow.DisplayGridlines=Not ActiveWindow.DisplayGridlines ‘切换工作表中的网格线显示,这种方法也可以用在其它方面进行相互切换,即相当于开关按钮 (27) ActiveWindow.DisplayHeadings=Not ActiveWindow.DisplayHeadings ‘切换工作表中的行列边框显示 (28) ActiveSheet.UsedRange.FormatConditions.Delete ‘删除当前工作表中所有的条件格式 (29) Cells.Hyperlinks.Delete ‘取消当前工作表所有超链接 (30) ActiveSheet.PageSetup.Orientation=xlLandscape 或ActiveSheet.PageSetup.Orientation=2 ‘将页面设置更改为横向 (31) ActiveSheet.PageSetup.RightFooter=ActiveWorkbook.FullName ‘在页面设置的表尾中输入文件路径 ActiveSheet.PageSetup.Le
Tony老师
2020/03/05
2.4K0
Excel VBA编程
在Excel中,数据只有文本,数值,日期值,逻辑值和错误值五种类型。但是在VBA中,数据类型跟Excel不完全相同。根据数据的特点,VBA将数据分为布尔型(boolean),字节型(byte),整数型(integer),单精度浮点型(single),双精度浮点型(double),货币型(currency),小数型(decimal),字符串型(string),日期型(date),对象型等等
全栈程序员站长
2022/08/11
46.9K0
Excel VBA编程
VBA代码:强制用户将工作簿保存为.xlsm文件
这样,在保存Excel工作簿时,在“另存为”对话框的“保存类型”下拉列表中,只有一个选项即“Excel启用宏工作簿(*.xlsm)”,如下图1所示,从而让用户只能将工作簿保存为.xlsm文件。
fanjy
2024/02/29
3970
VBA代码:强制用户将工作簿保存为.xlsm文件
Excel VBA一键整理工资表,并进行分类新建工作簿、加密
Dim arrA, arrB, col_a, col_b, row_a, d, i, Rng As Range, ifile As String
哆哆Excel
2022/10/25
5250
VBA与数据库——写个类操作ADO_DB信息
DB信息:就是手动记录历史DB用的按钮,开始是想打开一个新的数据库就自动记录,后来发现更多的都是临时操作一下,不值得记录,所以干脆做成一个按钮来记录。
xyj
2022/03/29
8120
VBA: 多份文件的批量顺序打印(2)
文章背景:测试仪器的数据有些会以Excel文件的形式保存,工作量大时测试员会选中多份文件进行批量打印,同时可能需要删除一些无需打印的测试数据(比如空白样,错误数据等)。现在以批量打印Excel文件(.xlsx格式)为例,采用VBA编程,进行任务的实现。
Exploring
2022/09/20
1.4K0
VBA:  多份文件的批量顺序打印(2)
VBA汇总一个文件多工作表到一个表
VBA汇总一个文件多工作表到一个表 . 今天在工作中,同事传来一个excel文件中有很多个工作表,要我汇总,每个表的标题是一样的,虽然一个一个复制、粘贴是可以做到的,但时间很长,所以把以前学习一个代码,拿来用一下,代码找了很久才找到,想想还是把他放在这里好一点,以后查找方便 . 把多个工作表的内容汇总到一个“汇总”表中 Sub sheets_to_one() Dim mysht As Worksheet, rng As Range, sht As Worksheet Dim
哆哆Excel
2022/10/31
5930
VBA汇总多个Excel文件数据
将某个文件夹下,所有Excel文件及子文件夹下的Excel文件内容,复制到一张汇总表。
xyj
2020/07/28
2.8K0
VBA汇总多个Excel文件数据
VBA小工具(二)针对大量PQ模型,批量打开刷新更新数据源输出报表
工具下载地址:https://download.csdn.net/download/qq_35866846/12196151
诡途
2022/05/09
4490
VBA小工具(二)针对大量PQ模型,批量打开刷新更新数据源输出报表
VBA实战技巧32:安装Excel加载宏
我们知道,有多种方法可以进入“Excel加载宏”对话框。最简单的就是,单击功能区“开发工具”选项卡“加载项”组中的“Excel加载项”,即可打开如下图1所示的的“加载宏”对话框。
fanjy
2021/08/31
6.3K0
VBA实战技巧32:安装Excel加载宏
VBA常用程序——每个表都应该有
Sub 复制位图() Selection.CopyPicture Appearance:=xlScreen, Format:=xlBitmap End Sub Sub 复制打印() Range("Print_Area").CopyPicture Appearance:=xlScreen, Format:=xlBitmap End Sub Sub 清除图片() For Each shp In ActiveSheet.Shapes If shp.Type = 13 Then shp.Delete
林万程
2018/06/26
1K0
VBA代码:拆分工作簿示例——将工作簿中的每个工作表保存为单独的工作簿
只需在要拆分的工作簿中运行上述代码,就可将该工作簿中的所有工作表全部保存为单独的工作簿。
fanjy
2022/06/04
4.5K0
VBA代码:拆分工作簿示例——将工作簿中的每个工作表保存为单独的工作簿
VBA实用小程序:将Excel中的内容输入到Word
将Excel数据输入到Word文档并不难,但这会破坏书签,如果你在对Word文档进行了大量修改后发现想要重新从Excel中输入数据,那可能会令人沮丧。我想要一个可以根据需要经常重复的将Excel数据输入到Word,这意味着在复制完成后要重新创建书签。
fanjy
2023/02/14
2.4K0
VBA与数据库——写个类操作ADO_打开数据库
在前面介绍的一些操作数据库的代码中,可以看到,主要的操作逻辑基本上是打开数据库-操作-关闭数据库,很多时候改变的仅仅是操作,所以,把这些封装到一个类里面,以后调用自己写的类就会更方便。
xyj
2021/11/12
3K0
VBA与数据库——写个类操作ADO_打开数据库
VBA收藏一常用的自定义函数
Sub 测试() If IsFileExists("D:\new_temp\") Then Debug.Print "存在" Else Debug.Print "不存在" End If End Sub '参数名称 含义 说明 'strShtName 指定工作表名称 必选 'strWbName 指定工作簿名称 可选 'Sub Demo() ' Debug.Print udfSheetExists("Sheet1") ' Debug.Print udfSheetExist
哆哆Excel
2022/10/25
6260
VBA收藏一常用的自定义函数
问与答71: 如何使用VBA打印PDF文件?
A:在《VBA小技巧04:使用VBA获取能够打开指定文件的EXE程序》中,我们介绍了一个自定义函数ExePath,可以获取能够打开指定文件的EXE程序的路径。这样,我们就可以使用EXE程序来打开该文件了。因此,下面的代码先使用ExePath函数获取PDF文件的可执行程序路径,然后使用它来打开指定的PDF文件。
fanjy
2019/11/22
6.5K0
Vba菜鸟教程[通俗易懂]
官方文档:https://docs.microsoft.com/zh-cn/office/vba/api/overview/language-reference 代码完成后:工具-vbaproject属性-保护-查看时锁定-密码
全栈程序员站长
2022/09/05
17.9K0
Vba菜鸟教程[通俗易懂]
推荐阅读
相关推荐
VBA解析VBAProject 06——清除VBA工程密码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档