2017-02-21 20 views
0

Я пытаюсь написать скрипт VBA, который преобразует файл Excel в XML. Я извлекаю имя файла, используя функцию Application.GetSaveAsFilename(). Но эта функция открывает диалоговое окно «Сохранить как». Я хочу подавить диалог таким образом, что пользователю не будет предложено вручную щелкнуть значок при каждом запуске кода. Вместо этого XML должен быть беззвучно генерирован в месте жесткого кодирования.Избегайте диалога «Сохранить как» при преобразовании Excel в XML с помощью сценария VBA

Код:

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 ... 

The 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, и LPT9 за MS).

+0

Рабочая книга будет выполнена, так как это будет использоваться в моей системе автоматизации, поэтому использование этого файла ThisWorkbook.path не является проблемой. Также имена листов предопределены, поэтому вероятность того, что это будет зарезервированное имя, будет меньше. Код работал как шарм. Спасибо! –