-Медведь- Пользователь Сообщений: 8 |
Всем привет. Помогите плз. грамотно решить задачу. Алексей |
Function MaskCompare(Txt As String, mask As String, CaseSensitive As Boolean) If Txt Like mask Then |
|
Владимир Пользователь Сообщений: 8196 |
{quote}{login=-Медведь-}{date=29.06.2011 02:16}{thema=Проверка ячейки на недопустимые символы.}{post}Всем привет. Помогите плз. грамотно решить задачу. Алексей ..Z ну и «-«. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир Пользователь Сообщений: 8196 |
Еще раз. Почему этот знак «-» допустим в ФИО? «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир, есть такой дядька с фамилией Мамин-Сибиряков. Без «-» тут никак :-)) |
|
Микки Пользователь Сообщений: 3280 |
{quote}{login=Владимир}{date=29.06.2011 02:21}{thema=}{post}Еще раз. Почему этот знак «-» допустим в ФИО?{/post}{/quote} |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
{quote}{login=Владимир}{date=29.06.2011 02:21}{thema=}{post}Почему этот знак «-» допустим в ФИО?{/post}{/quote} |
Владимир Пользователь Сообщений: 8196 |
Остальные знаки сами добавите. — «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир Пользователь Сообщений: 8196 |
Знак вопроса тоже в тильду заключите, т.к. он тоже является служебным символом. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Мы с Hugo делали такую ЮДФ на форуме для Serge007. Я сам — дурнее всякого примера! … |
Владимир Пользователь Сообщений: 8196 |
{quote}{login=KukLP}{date=29.06.2011 02:48}{thema=}{post}Я в формулах не спец. Да ладно тебе, скромничать.. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
-Медведь- Пользователь Сообщений: 8 |
Спасибищще всем!!! Алекс |
-Медведь- Пользователь Сообщений: 8 |
Почти работает. Sub Check110(EmplRow, EmplCol) Вспмнил ещё про «пробел» который бывает в фамилиях типа «Исламова Севда Джалил кызы» Возможно ли оптимизировать код? Алекс |
Hugo Пользователь Сообщений: 23253 |
Так вроде быстрее будет, но не уверен, что всё 100% правильно (поотключал лишнее): Sub Check110() ‘(EmplRow, EmplCol) Но тут ведь RegExp просится, но я в нём ещё не освоился… |
Hugo Пользователь Сообщений: 23253 |
End Select |
-Медведь- Пользователь Сообщений: 8 |
#16 30.06.2011 11:49:18 Спасибо! Вот что получилось: Sub Check110(EmplRow, EmplCol, Sym1, Sym2) Зато теперь можно проверять не только фамилии, но и, скажем должности: ‘ Проверка фамилии (столбец 1) на недопустимые символы (допустимы: буквы, «-» и » «) ‘ Проверка должности (столбец 2) на недопустимые символы (допустимы: ЦИФРЫ, буквы, «-» и » » и ещё «.») Алексей |
Недавно я унаследовал макрос VBA, в который нужно добавить логику проверки. Мне нужно определить, не являются ли какие-либо символы в текстовой ячейке символами ASCII (т.е. имеют двоичное значение> 0x7F). Ячейки могут содержать некоторые управляющие значения каретки (в частности, переводы строки), которые необходимо сохранить (поэтому функция CLEAN не работает для этой проверки). Я пробовал функцию IsText, но обнаружил, что она интерпретирует последовательности символов UTF-8 как действительный текст (чего я не хочу).
Мне не нужно фактически манипулировать строкой, я просто хочу отобразить ошибку для пользователя, который запускает макрос, чтобы сообщить ему, что в определенной ячейке есть недопустимые (не ASCII) символы.
3 ответа
Лучший ответ
Команда asc (символ) преобразует символ в его значение ASCII.
Hex (asc (символ)) преобразует символ в его шестнадцатеричное значение.
Как только вы это сделаете, вы можете легко провести несколько сравнений, чтобы определить, плохие ли данные, и при необходимости выбросить ошибки.
Вот пример кода: http://www.freevbcode.com/ShowCode.asp?ID=4486
2
LeppyR64
4 Ноя 2008 в 20:22
Если вам нужен технически чистый подход, вы можете попробовать регулярное выражение. Добавьте ссылку в VBA на библиотеку сценариев Microsoft и попробуйте этот код. Это выглядит немного сложным, но вы будете поражены тем, на что способны регулярные выражения, и у вас будет ценный инструмент для использования в будущем.
Function IsTooHigh(c As String) As Boolean
Dim RegEx As Object
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
.Global = True
.MultiLine = True
.Pattern = "[^x00-x7F]"
End With
IsTooHigh = RegEx.Test(c)
End Function
Эта функция выдает значение ИСТИНА, если какой-либо символ в строке c не находится (^) в диапазоне от 0 (x00) до 127 (x7F).
Вы можете найти в Google «регулярное выражение» и все, что вам нужно, и получить ответ практически на любом языке, потому что, как и SQL, шаблоны регулярных выражений кажутся языково-независимыми.
Function IsGoodAscii(aString as String) as Boolean
Dim i as Long
Dim iLim as Long
i=1
iLim=Len(aString)
While i<=iLim
If Asc(Mid(aString,i,1))>127 then
IsGoodAscii=False
Exit Function
EndIf
i=i+1
Wend
IsGoodAscii=True
End Function
0
jpinto3912
13 Июл 2011 в 01:02
- Remove From My Forums
-
Question
-
i was not able to find in documentation what are Invalid Characters for Excel Sheet Names.
I was able to find few like ?, * etc. but need a complete list to avoid any runtime errors before Renaming sheets.
Answers
All replies
-
Copy from a VSTO sample :
static internal string CreateValidWorksheetName(string name) {
// Worksheet name cannot be longer than 31 characters.
System.Text.StringBuilder escapedString;
if (name.Length <= 31) {
escapedString = new System.Text.StringBuilder(name);
}
else {
escapedString = new System.Text.StringBuilder(name, 0, 31, 31);
}
for (int i = 0; i < escapedString.Length; i++) {
if (escapedString
== ‘:’ ||
escapedString
== ‘\’ ||
escapedString
== ‘/’ ||
escapedString
== ‘?’ ||
escapedString
== ‘*’ ||
escapedString
== ‘[‘ ||
escapedString
== ‘]’) {
escapedString
= ‘_’;
}
}
return escapedString.ToString();
}
HTH,
-
The following characters are prohibited in excel worksheet names
/
?
*
[
]Lenght limitations is 31 characters
-
this code is absolutely correct, sum typing error above hence I am mentioning only ‘for’ loop here
if (escapedString[i] == ‘:’ || escapedString[i] == ‘\’ || escapedString[i] == ‘/’ || escapedString[i] == ‘?’ || escapedString[i] == ‘*’ || escapedString[i] == ‘[‘ || escapedString[i] == ‘]’)
{
escapedString[i] = ‘_’;
}
QSS — QSOFT Solution, (we deliver quality software)
-
-
Edited by
Wednesday, August 19, 2015 4:07 PM
-
Edited by
-
One also very important character to escape and no where do be found in the doc is ‘ (apostrophe)!
в Java мы используем следующий пакет для программного создания документов excel:
org.apache.poi.hssf
Если вы попытаетесь установить имя листа (не файл, а внутренний лист Excel), вы получите сообщение об ошибке, если:
- имя более 31 символов
- имя содержит любой из следующих символов:/*? [ ]
однако, после создания документа с именем листа:
@#$%&()+~`»‘:;,.|
ошибка не выводится, и все кажется прекрасным в Java. Когда вы откроете файл excel в Office 2003, он выдаст вам сообщение об ошибке, что имя листа было недопустимым и что он переименовал его во что-то общее, например «лист 1».
Я мало знаю о ранее заявленном пакете, который мы используем, но похоже, что он неправильно фильтрует недопустимые имена листов Excel. Любая идея о том, как я могу отфильтровать все известные недействительные персонажи? Я не решаюсь просто отфильтровать все символы без слов.
4 ответов
Я думаю, проблема в двоеточии, а не в восклицательном знаке.
Если вы открываете Excel и пытаетесь вручную редактировать имя листа, единственными символами, которые он не позволяет вам вводить, являются [ ] */ ? :
если вставить один из этих символов, вы получите следующую ошибку: (Excel 2003)
переименовать лист или диаграмму, вы
введено недопустимое имя. Попробуйте один из
следующее:
- убедитесь, что введенное вами имя не превышать 31 символа.
- убедитесь, что имя не должно содержать следующие
знаков: / ? * [ или ]- убедитесь, что вы не оставить имя пустым.
Это то, что я использую в C# (должно быть похоже на Java):
const string invalidCharsRegex = @"[/*'?[]:]+";
const int maxLength = 31;
string safeName = Regex.Replace(worksheetName, invalidCharsRegex, " ")
.Replace(" ", " ")
.Trim();
if (string.IsNullOrEmpty(safeName))
{
safeName = "Default"; // cannot be empty
}
else if (safeName.Length > maxLength)
{
safeName = safeName.Substring(0, maxLength);
}
вы можете использовать это:
protected Sheet createSheet(XSSFWorkbook book, String nameSheet) {
return book.createSheet(WorkbookUtil.createSafeSheetName(nameSheet));
}
В Java мы используем следующий пакет для программного создания документов excel:
org.apache.poi.hssf
Если вы попытаетесь установить имя листа (не файл, а внутренний лист Excel), вы получите сообщение об ошибке, если:
- Имя более 31 символа
- Имя содержит любой из следующих символов:/ *? []
Однако после создания документа с именем листа:
@# $% &() + ~ `» ‘:;., |
Ошибка не выводится, и все кажется прекрасным в Java. Когда вы открываете файл excel в Office 2003, он даст вам сообщение о том, что имя листа недействительно и что оно переименовано в нечто общее, например «Лист 1».
Я не знаю много о ранее заявленном пакете, который мы используем, но похоже, что он неправильно фильтрует неверные имена листов Excel. Любая идея, как я могу отфильтровать все известные недопустимые символы? Я не решаюсь просто отфильтровать все символы, отличные от слов.