2017-02-21 16 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のコードが問題なく完全に実行されていたため、申し訳ありませんがExportToMyXmlのコードは含まれていませんでした。 –

答えて

1

あなたのためにApplication.GetSaveAsFilenameを使用している唯一のことは、folderNameThisWorkbookの場所に関してInputFilesパスへのパスを取得することであることが表示されます。オペレーティングシステムはすでにそれを提供しています!次の変更作業をする必要があります(しかし、私は彼らに自分自身をテストしていません):

' 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を使用することは問題ではありません。また、シート名はあらかじめ定義されているため、予約名になる可能性は低くなります。 コードは魅力的に機能しました。 ありがとうございます! –

関連する問題