使用VBA脚本将Excel转换为XML时,避免“另存为”对话框

我正在尝试编写一个将excel文件转换为XML的VBA脚本。 我正在使用Application.GetSaveAsFilename()函数获取文件名。 但是这个function打开了“另存为”对话框。 我想压制对话框,以防止用户在每次运行代码时手动单击保存。 相反,应该在硬编码的位置静静地生成XML。

码:

 Sub BasicRTE() Dim FileName As Variant Dim Sep As String Dim Ws As Worksheet Dim autoSetFileName As String Dim folderName As String Dim location As Integer ChDrive (Left(ThisWorkbook.Path, 1)) ChDir ThisWorkbook.Path ChDir ".." ChDir "InputFiles" Application.SendKeys ("{ENTER}") FileName = Application.GetSaveAsFilename( _ InitialFileName:=ThisWorkbook.Worksheets(1).Name, _ FileFilter:="Xml Files (*.xml),*.xml") location = InStrRev(FileName, "\", , vbTextCompare) folderName = Mid(FileName, 1, location - 1) For Each Ws In ThisWorkbook.Worksheets If InStr(1, Ws.Name, "#", vbTextCompare) <> 1 Then ExportToMyXMLFile FName:=CStr(folderName & "\" & Ws.Name & ".xml"), Sep:=CStr(Sep), _ AppendData:=False, Ws:=Ws End If Next End Sub 

看来你唯一使用Application.GetSaveAsFilename的方法是将InputFilespath的path相对于ThisWorkbook的位置放到folderName 。 操作系统已经提供了! 以下更改应该可以工作(但我没有自己testing):

 ' fileName = ... ' don't need this ' location = ... ' or this folderName = ThisWorkbook.Path & "\..\InputFiles" ' eg, C:\Users\Foo\Documents\..\InputFiles 

或者,如果你想要一个更干净的string,

 Dim location as Long ' Never use Integer unless you are calling Win32 or something else esoteric ' Don't need any of this unless later code relies on the current directory ' (which it shouldn't, for robustness). 'ChDrive (Left(ThisWorkbook.Path, 1)) 'ChDir ThisWorkbook.Path 'ChDir ".." 'ChDir "InputFiles" 'Application.SendKeys ("{ENTER}") 'FileName = Application.GetSaveAsFilename( _ ' InitialFileName:=ThisWorkbook.Worksheets(1).Name, _ ' FileFilter:="Xml Files (*.xml),*.xml") folderName = ThisWorkbook.Path location = InStrRev(folderName, "\", , vbTextCompare) folderName = Mid(folderName, 1, location) & "InputFiles" For Each ws ... 

InStrRev + Mid会删除最后一个path组件,就像.. ,然后& "InputFiles"InputFiles放在最后。

一个警告: ThisWorkbook.Path是一个新的,未保存的工作簿的空string。 在使用上述内容之前,请确保您的工作簿已保存到磁盘。

编辑另一个警告:您正在使用ws.Name直接制作文件名。 但是,表名可以包含文件名不能的文本。 我可以命名一个工作表CON<foo> ,但这些文件名都不是有效的。 这里有一个消毒文件名的例子(一个简单的Google结果 – 未经testing)。 然而,即使这个例子似乎没有检查保留名称 。

每个MS的保留名称:CON,PRN,AUX,NUL,COM1,COM2,COM3,COM4,COM5,COM6,COM7,COM8,COM9,LPT1,LPT2,LPT3,LPT4,LPT5,LPT6,LPT7,LPT8和LPT9) 。