Удалить недопустимые символы при сохранении книги Excel VBA

этот код в основном переформатирует файл xls и сохраняет его как xlsx. однако он использует G2 и H2 для получения имени файла для вновь отформатированного файла. Это означает, что определенные символы не могут быть в имени файла. Я добавил кусок кода для замены этих символов (

' Remove/Replace Invalid File Name Characters
 WkbName = Range("H2")
    MyArray = Array("<", ">", "|", "/", "*", "\", ".", "?", """")
    For X = LBound(MyArray) To UBound(MyArray)
        WkbName = Replace(WkbName, MyArray(X), "_", 1)
            Next X
                'MsgBox WkbName     'dispaly file name with illegal characters removed

    ActiveWorkbook.SaveAs Filename:= _
       WBPath & "\BOM_" & Range("G2") & "_" & WkbName & ".xlsx" _
        , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 

) activeworkbook.saves как есть, куда меня всегда ведет отладчик

Я получаю сообщение об ошибке, в котором говорится, что всегда есть недопустимый символ, даже если это обычный текст в h2, я что-то упустил?

полный код ниже

Sub FormatBOMExport()
'
' FormatBOMExportPnV Macro
'
Application.ScreenUpdating = False
Application.DisplayAlerts = False

' delete extra sheets
Sheets(Array("Sheet2", "Sheet3")).Select
    ActiveWindow.SelectedSheets.Delete

WBPath = Application.ActiveWorkbook.Path
OrgFile = Application.ActiveWorkbook.FullName

        Range("B1").Select
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With

    Columns("A:M").Select
    Selection.Replace What:="" & Chr(10) & "", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

    Selection.Columns.AutoFit
    Selection.Rows.AutoFit

    Columns("J:J").Select
        With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With

'    Columns("J:J").Select
'        Columns("J:J").ColumnWidth = 100
'            Selection.Rows.AutoFit

    Columns("G:G").EntireColumn.AutoFit
        Range("G2").Select

' Remove/Replace Invalid File Name Characters
 WkbName = Range("H2")
    MyArray = Array("<", ">", "|", "/", "*", "\", ".", "?", """")
    For X = LBound(MyArray) To UBound(MyArray)
        WkbName = Replace(WkbName, MyArray(X), "_", 1)
            Next X
                'MsgBox WkbName     'dispaly file name with illegal characters removed

    ActiveWorkbook.SaveAs Filename:= _
       WBPath & "\BOM_" & Range("G2") & "_" & WkbName & ".xlsx" _
        , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

    If Len(Dir$(OrgFile)) > 0 Then
        Kill OrgFile
            End If

  Application.DisplayAlerts = True

Application.ScreenUpdating = True

 ' MsgBox OrgFile & " has been deleted and saved as " & "BOM_" & Range("G2") & "_" & Range("H2") & ".xlsx"

End Sub
`

прошу извинить за мои заметки и случайную хрень в коде. Я всегда убираю его, прежде чем отдать другим

введите описание изображения здесь


person Alberto Brown    schedule 13.06.2018    source источник
comment
Может быть, в G2 есть недопустимые символы? Было бы неплохо, если бы вы разместили фактическое сообщение об ошибке и некоторые примеры данных.   -  person chris neilsen    schedule 14.06.2018
comment
перед строкой сохранения сделайте строку msgbox, чтобы увидеть, верны ли результаты. msgbox WBPath & "\BOM_" & Range("G2") & "_" & WkbName & ".xlsx" если это неверно, вы будете знать, где отредактировать строку.   -  person Davesexcel    schedule 14.06.2018
comment
Как насчет «WkbName = Application.WorksheetFunction.Clean(WkbName)»   -  person Keith Swerling    schedule 03.05.2021


Ответы (1)


Потому что в имени файла может быть больше недопустимых символов. Ваш подход правильный, но это не полный список недопустимых символов, которые нужно удалить или заменить из имени файла перед его сохранением. Например. эти символы отсутствуют в массиве в вашем коде -> : & . Однако рекомендуется, чтобы имя файла не содержало и других разрешенных специальных символов.

Ниже я предоставляю функцию, которая возвращает безопасную строку, которую можно использовать для создания имени файла перед сохранением.

Function ReplaceIllegalCharacters(strIn As String, strChar As String) As String
    Dim strSpecialChars As String
    Dim i As Long
    strSpecialChars = "~""#%&*:<>?{|}/\[]" & Chr(10) & Chr(13)

    For i = 1 To Len(strSpecialChars)
        strIn = Replace(strIn , Mid$(strSpecialChars, i, 1), strChar)
    Next

    ReplaceIllegalCharacters = strIn 
End Function

В частности, в коде замените строку ActiveWorkbook.SaveAs этой строкой:

ActiveWorkbook.SaveAs Filename:= _
   WBPath & "\BOM_" & Range("G2").Value2 & "_" & ReplaceIllegalCharacters(Range("H2").Value2, "_") & ".xlsx" _
    , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
person jainashish    schedule 14.06.2018
comment
strSpecialChars(i) не работает в VBA. Вместо этого используйте Mid$(strSpecialChars, i, 1) - person chris neilsen; 14.06.2018
comment
Спасибо, Крис - это то, что происходит, когда вы работаете на нескольких языках. Иногда я тоже кодирую на C#. Исправление кода. Большое спасибо за указание. - person jainashish; 14.06.2018
comment
отредактированный пост, чтобы включить исходное сообщение об ошибке и сообщение после использования вашей функции и редактирования кода @jainashish - person Alberto Brown; 19.06.2018
comment
Снова отредактировал мой пост - нужно добавить положение, чтобы включить квадратные скобки! - person jainashish; 19.06.2018
comment
странный. Мне пришлось перезапустить Excel 2 раза, но теперь он работает. Спасибо за вашу помощь - person Alberto Brown; 19.06.2018
comment
также есть ли шанс, что есть простой способ проверить листы 2 и 3 перед их удалением? ' delete extra sheets Sheets(Array("Sheet2", "Sheet3")).Select ActiveWindow.SelectedSheets.Delete - person Alberto Brown; 19.06.2018
comment
Посетите эту ссылку: stackoverflow.com/questions/18594223/ - person jainashish; 20.06.2018