2017-02-21 62 views
0

我正在嘗試編寫將Excel文件轉換爲XML的VBA腳本。我正在使用Application.GetSaveAsFilename()函數獲取文件名。但是這個功能打開了「另存爲」對話框。我想抑制對話框,以便每次運行代碼時都不會提示用戶手動單擊保存。相反,XML應該在硬編碼位置靜默生成。使用VBA腳本將Excel轉換爲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 
+0

ExportToMyXMLFile的代碼是什麼? –

+0

@Mark對不起,沒有包含ExportToMyXml的代碼,因爲那部分代碼沒有任何問題,所以認爲它是無關緊要的。 –

回答

1

看來,您正在使用Application.GetSaveAsFilename的唯一一件事就是讓路徑InputFiles路徑相對於的ThisWorkbook位置到folderName。操作系統已經提供了!下面的變化應該工作(但我沒有測試他們自己):

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

另外,如果你想有一個更清潔的字符串,

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下降的最後一個路徑組件,就像..,然後& "InputFiles"使InputFiles結束。

一個警告:ThisWorkbook.Path是新的未保存的工作簿的空字符串。在使用上述內容之前,請確保您的工作簿已保存到磁盤。

編輯另一個警告:您正在使用ws.Name直接製作文件名。但是,表單名稱可能包含文件名不能包含的文本。我可以命名一個工作表CON<foo>,但這兩個文件名都不是有效的。 Here's消毒文件名的一個例子(Google的一個簡短結果—未經測試)。然而,即使這個例子似乎沒有檢查reserved names

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

+0

該工作簿將被預先保存,因爲這將用於我的自動化框架中,所以使用ThisWorkbook.path不是問題。此外,圖紙名稱是預定義的,所以不太可能成爲保留名稱。代碼像魅力一樣工作。 謝謝! –