专栏首页完美ExcelVBA代码库06:实现健壮的“另存为”功能

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

学习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

下面是代码的图片版:

本文分享自微信公众号 - 完美Excel(excelperfect)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 模型评估1(误差、偏差、方差)

    1、方差:是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。描述数据离散程度,数据波动性,会影响模型的预测结果。

    用户5745385
  • Vue学习(四)v-if、v-show、v-for

    v-if是一个指令,(逻辑与原生js一样,只是使用方法稍有不同)需要添加在元素上,如果想要添加在多个元素上,可以使用标签当成一个容器。

    一觉睡到小时候
  • 你真的了解try{ return }finally{}中的return?

    The finally block always executes when the try block exits. This ensures that th...

    一觉睡到小时候
  • Nginx+PHP环境配置

    注:如需转载请注明出处:https://www.cnblogs.com/zhuchenglin/p/11126373.html

    lin_zone
  • 不好好学代码 你连当韭菜都不够格

    面向对象学了这么多,满脑子都是对象,面向对象千好万好,可是就是不知道对象到底有什么用。

    用户5745563
  • JVM学习(二)

    上一篇文章简单介绍了一下jvm的几个概念。接下来这篇文章将跟大家探讨一下JVM的工作原理。

    一觉睡到小时候
  • Leetcode【78、90、289、621、718】

    首先可以想到用回溯法 BFS 求解,如 nums = [0,2,5],使用回溯法可以依次得到 [0]、[0,2]、[0,2,5]、[0,5]、[2]、[2,5]...

    echobingo
  • 宅男知识GET 学多态 认包包

    多态就是指一个引用变量,在编译时和运行时类型不一样的情况。那我们首先就要搞清楚一个概念,什么是编译时,什么是运行时。

    用户5745563
  • java8 异步api、循环、日期

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10801470.html

    上帝
  • 谈谈final、finally、finalize的区别

    这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义...

    一觉睡到小时候

扫码关注云+社区

领取腾讯云代金券