2011-12-21 2 views
3

Я пишу довольно большой макросЗамена несколько недопустимых символов в имени листа

  • который заканчивается путем сохранения рабочей книги с именем, которое пользователь введенному ранее.
  • Я использую заголовок для этого, поэтому мне нужно снять любые зарезервированные символы, которые будут вызывать ошибки файловой системы (/\*|?:<>").

Я хотел бы избежать необходимости использовать большое количество Replace() заявлений, так есть ли способ заменить несколько символов с подчеркиванием в одном заявлении - что-то больше похоже на ?

Спасибо всем!

ответ

7

К счастью, вы обнаружите, что большинство из этих символов являются недействительными уже в качестве листа символов имени, т.е. *?[] и т.д.

Но как вы уже сказали, используйте :)

Что-то вроде ниже для возврата True для действительных строк, False для недействительных.

Я добавил ваши пункты выше, избегая специальных символов по мере необходимости.

[Обновлено: добавлена ​​замена Function]

Sub TestCleanNames() 
    Dim StrArr() 
    Dim StrTst 
    StrArr = Array("Am i ok", "Sheet||a", "audited??", "Sheet1") 
    For Each StrTst In StrArr 
     MsgBox StrTst & " = " & ValidSheetName(CStr(StrTst)) & vbNewLine & CleanSheetName(CStr(StrTst)) 
    Next 
End Sub 

действует функция имя

Function ValidSheetName(strIn As String) As Boolean 
    Dim objRegex As Object 
    Set objRegex = CreateObject("vbscript.regexp") 
    objRegex.Pattern = "[\<\>\*\\\/\?|]" 
    ValidSheetName = Not objRegex.test(strIn) 
End Function 

чистая функция

Function CleanSheetName(strIn As String) As String 
    Dim objRegex As Object 
    Set objRegex = CreateObject("vbscript.regexp") 
    With objRegex 
     .Global = True 
     .Pattern = "[\<\>\*\\\/\?|]" 
     CleanSheetName = .Replace(strIn, "_") 
    End With 
End Function 
+0

+1 вам не нужно будет проверять обратную косую черту, '/', '*' или '?', Потому что они запрещены именами таблиц рабочего листа. – JimmyPena

+1

Я не был особенно ясен с моей формулировкой здесь - к сожалению, фактическое имя листа и имя, которое я имею в виду, разные - мое имя попадает в заголовок листа! Тем не менее, ответ Бреттджа очень хорош на этом, спасибо! – sgtpepper113

0

Вы посмотрели clean()?

В качестве альтернативы, немного хаотичным, но я полагаю, вы могли бы использовать 'substitute'

Substitute(text, old_text, new_text, nth_appearance) 
Смежные вопросы