Консультация № 160014
09.02.2009, 15:42
0.00 руб.
0 3 2
Уважаемые эксперты, как известно нельзя сохранить файл, если в его имени имеются следующие знаки /\:*?<>|]*". Вопрос в том как записать условие если в переменной которую я буду использовать как имя для сохранения файла имеется один из этих знаков то ....
Как при помощи ВБА выделить в документе несколько закладок, несколько мест когда известно начало и конец этих мест, как это мы делаем без ВБА при нажатии клавиши Контрол в Ворде.
Заранее спасибо!

Обсуждение

давно
Модератор
137394
1850
09.02.2009, 18:20
общий
это ответ
Здравствуйте, Ципихович Эндрю! Ответ на первый вопрос:
Легче всего написать функцию:
Код:
Function NoLegal(InText)
' Функция возвращает True, если в строке InText содержится хотя бы один
' один символ указанный в поиске (см. ниже)

NoLegal = False
NoLegal = NoLgal Or InStr(1, InText, "/", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, "", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, ":", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, "*", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, "?", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, "<", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, ">", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, "|", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, "]", 1) <> 0
NoLegal = NoLgal Or InStr(1, InText, """", 1) <> 0
End Function

Если имеем строковую переменную, содержащую имя файла (для примера, NameOfFile),
то в условии для анализа наличия неправильного символа можно записать:

If NoLegal(NameOfFile) Then .....

Условие будет выполняться, если в имени содержится хотя бы один "неправильный" символ.
(Кстати, с символом ] в имени файл сохраняется - не знаю, чем он Вам не понравился)
В тексте функции можете добавить (удалить) строки с необходимыми (лишними) символами.

Можно переписать функцию в ином виде, в аргументе указать "запретные" символы
Она получается более гибкой и наглядной в использовании, но чуть длиннее при вызове.
Код:
Function NoLegal2(InText, SymbErr)
' Функция возвращает True, если в строке InText содержится хотя бы один
' символ из строки SymbErr

NSymbErr = Len(SymbErr)
NoLegal2 = False

For i = 1 To NSymbErr
NoLegal2 = NoLegal2 Or InStr(1, InText, Mid(SymbErr, i, 1)) <> 0
Next

End Function

Пример использования:

If NoLegal2(NameOfFile, "/\:*?<>|]""") Then .....

Обратите внимание, в литерале " необходимо заменить на ""

Возможно удобнее написать другую функцию: перед сохранением файла обработать переменную,
содержащую имя файла, функцией ReLegal, она заменит все "неправильные" символы на заданный Вами символ,
Код:
Function ReLegal(InText, Correct)
' Функция возвращает строку, полученную из исходной строки InText
' путём замены перечисленных символов на символ, определённый в аргументе Correct

ReLegal = InText
ReLegal = Replace(ReLegal, "/", Correct)
ReLegal = Replace(ReLegal, "", Correct)
ReLegal = Replace(ReLegal, ":", Correct)
ReLegal = Replace(ReLegal, "*", Correct)
ReLegal = Replace(ReLegal, "?", Correct)
ReLegal = Replace(ReLegal, "<", Correct)
ReLegal = Replace(ReLegal, ">", Correct)
ReLegal = Replace(ReLegal, "|", Correct)
ReLegal = Replace(ReLegal, "]", Correct)
ReLegal = Replace(ReLegal, """", Correct)
End Function

например, на подчеркивание _ :

CorrectName = ReLegal(NameOfFile, "_")
или
NameOfFile = ReLegal(NameOfFile, "_")
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Модератор
137394
1850
09.02.2009, 21:05
общий
Дополнил ответ
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
10.02.2009, 03:36
общий
это ответ
Здравствуйте, Ципихович Эндрю!
по первому вопросу:
во-первых символы "[" и "]" - вполне допустимы:
http://ru.wikipedia.org/wiki/Имя_файла

...
В имени файла запрещено использование некоторых служебных символов: «\», «/», «:»(только в Windows - в Linux этот символ в имени разрешён), «*», «?», «"», «<», «>», «|».
...

во вторых, часто достаточно использовать Like:
Код:

If FileName Like "*[\/:*?""<>|]*" Then
MsgBox "Invalid filename!"
Exit Sub
End If


по второму вопросу:
Скорее всего никак...

у доступа к "несмежному выделению" (не знаю как перевести discontiguous selections) посредством VBA есть некоторые ограничения...
http://support.microsoft.com/kb/288424

Успехов.
Форма ответа