Недопустимые символы в excel

 

-Медведь-

Пользователь

Сообщений: 8
Регистрация: 01.01.1970

Всем привет.  
Поиском ничего похожего не нашел. Странно, задача по идее не эксклюзивная.  
Есть некая ведомость. Необходимо проверить каждую ячейку столбца «Фамилия» на недопустимые в фамилии символы.  
По идее фамилия может содержать только буквы А-Я и A-Z ну и «-«.  
А символы типа «.», «:»,»?»,»*»,»…» т.д. — являются недопустимыми.  

  Помогите плз. грамотно решить задачу.  

  Алексей  
(файл прикладывать смысла нет, суть вроде ясна)

 

Function MaskCompare(Txt As String, mask As String, CaseSensitive As Boolean)  
   If Not CaseSensitive Then  
       Txt = UCase(Txt)  
       mask = UCase(mask)  
   End If  

             If Txt Like mask Then  
           MaskCompare = True  
       Else  
           MaskCompare = False  
   End If  
End Function

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

{quote}{login=-Медведь-}{date=29.06.2011 02:16}{thema=Проверка ячейки на недопустимые символы.}{post}Всем привет.  
Поиском ничего похожего не нашел. Странно, задача по идее не эксклюзивная.  
Есть некая ведомость. Необходимо проверить каждую ячейку столбца «Фамилия» на недопустимые в фамилии символы.  
По идее фамилия может содержать только буквы А-Я и A-Z ну и «-«.  
А символы типа «.», «:»,»?»,»*»,»…» т.д. — являются недопустимыми.  

  Помогите плз. грамотно решить задачу.  

  Алексей  

    ..Z ну и «-«.  
А этот почему допустим?  
(файл прикладывать смысла нет, суть вроде ясна){/post}{/quote}

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Еще раз.  

  Почему этот знак «-» допустим в ФИО?

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Владимир, есть такой дядька с фамилией Мамин-Сибиряков. Без «-» тут никак :-))

 

Микки

Пользователь

Сообщений: 3280
Регистрация: 24.12.2012

{quote}{login=Владимир}{date=29.06.2011 02:21}{thema=}{post}Еще раз.  

  Почему этот знак «-» допустим в ФИО?{/post}{/quote}  
Иванов-Смоленский. А Мамин он Сибиряк

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=Владимир}{date=29.06.2011 02:21}{thema=}{post}Почему этот знак «-» допустим в ФИО?{/post}{/quote}  
Петров-Водкин ещё :-)

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Остальные знаки сами добавите.  

  —  
88878

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Знак вопроса тоже в тильду заключите, т.к. он тоже является служебным символом.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Мы с Hugo делали такую ЮДФ на форуме для Serge007.  
Public Function Replace_symbols(ByVal sStr As String) As String  
Dim i As Byte  
Dim St As String  
St = «!#$%&'()*+,-./:;<=>?[]_`{|}~»‘ В этой строке сам удалишь лишние символы. Я в формулах не спец.
For i = 1 To Len(St)  
sStr = Replace(sStr, Mid(St, i, 1), » «)  
Next  
Replace_symbols = sStr  
End Function

Я сам — дурнее всякого примера! …

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

{quote}{login=KukLP}{date=29.06.2011 02:48}{thema=}{post}Я в формулах не спец.  
{/post}{/quote}  

  Да ладно тебе, скромничать..    
;D

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

-Медведь-

Пользователь

Сообщений: 8
Регистрация: 01.01.1970

Спасибищще всем!!!  
Поразительная оперативность!  

  Алекс

 

-Медведь-

Пользователь

Сообщений: 8
Регистрация: 01.01.1970

Почти работает.  
Но как-то некрасиво:  

  Sub Check110(EmplRow, EmplCol)  
   Dim i As Byte  
   Dim St As String  
   St = Trim(Worksheets(«Employees»).Cells(EmplRow, EmplCol))  
   For i = 1 To Len(St)  
   If UCase(Mid(St, i, 1)) Like «[А-Я]» Or UCase(Mid(St, i, 1)) Like «[A-Z]» Or Mid(St, i, 1) = «-» Or Mid(St, i, 1) = » » Then
   Else  
   Worksheets(«Employees»).Cells(EmplRow, EmplCol).Interior.ColorIndex = 3  
   Worksheets(«ErrLog»).Cells(LogRow, 3) = «Поле ‘» & Worksheets(«Employees»).Cells(1, EmplCol) & «‘ содержит недопустимые символы»  
   LogRow = LogRow + 1  
   Exit Sub  
   End If  
   Next  
End Sub  

  Вспмнил ещё про «пробел» который бывает в фамилиях типа «Исламова Севда Джалил кызы»  

  Возможно ли оптимизировать код?  

  Алекс

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Так вроде быстрее будет, но не уверен, что всё 100% правильно (поотключал лишнее):  

  Sub Check110() ‘(EmplRow, EmplCol)  
Dim i As Byte  
Dim St As String, temp$  
St = «dff.gh/ 7 ?dsf 2144» ‘Trim(Worksheets(«Employees»).Cells(EmplRow, EmplCol))  
For i = 1 To Len(St)  
temp = UCase(Mid(St, i, 1))  
Select Case temp  
Case «А» To «Я»  
Case «A» To «Z»  
Case «-»  
Case » »  
Case Else  
Debug.Print temp  
End Select  
‘Worksheets(«Employees»).Cells(EmplRow, EmplCol).Interior.ColorIndex = 3  
‘Worksheets(«ErrLog»).Cells(LogRow, 3) = «Поле ‘» & Worksheets(«Employees»).Cells(1, EmplCol) & «‘ содержит недопустимые символы»  
‘LogRow = LogRow + 1  
‘Exit Sub  
Next  
End Sub  

  Но тут ведь RegExp просится, но я в нём ещё не освоился…

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

End Select  
перед Next передвинуть нужно, ну Вы надеюсь поняли…

 

-Медведь-

Пользователь

Сообщений: 8
Регистрация: 01.01.1970

#16

30.06.2011 11:49:18

Спасибо!  
Тоже вчера «допер» до такой схемы.  

  Вот что получилось:  

  Sub Check110(EmplRow, EmplCol, Sym1, Sym2)  
   Dim i As Byte  
   Dim St As String  
   St = Trim(Worksheets(«Employees»).Cells(EmplRow, EmplCol))  
   For i = 1 To Len(St)  
   Select Case Mid(St, i, 1)  
   Case 0 To 9  
       Sym = 1  
   Case «a» To «z»  
       Sym = 2  
   Case «A» To «Z»  
       Sym = 3  
   Case «à» To «ÿ»  
       Sym = 4  
   Case «À» To «ß»  
       Sym = 5  
   Case «-»  
       Sym = 6  
   Case » »  
       Sym = 7  
   Case «.»  
       Sym = 8  
   Case Else  
       Sym = 0  
   End Select  
   If Sym < Sym1 Or Sym > Sym2 Then  
   Worksheets(«Employees»).Cells(EmplRow, EmplCol).Interior.ColorIndex = 3  
   Worksheets(«ErrLog»).Cells(LogRow, 3) = «Ïîëå ‘» & Worksheets(«Employees»).Cells(1, EmplCol) & «‘ ñîäåðæèò íåäîïóñòèìûå ñèìâîëû»  
   LogRow = LogRow + 1  
   Exit Sub  
   Else  
   End If  
   Next  
End Sub  

    Зато теперь можно проверять не только фамилии, но и, скажем должности:  

  ‘   Проверка фамилии (столбец 1) на недопустимые символы (допустимы: буквы, «-» и » «)  
   Check110 EmplRow, 1, 2, 7  

  ‘   Проверка должности (столбец 2) на недопустимые символы (допустимы: ЦИФРЫ, буквы, «-» и » » и ещё «.»)  
   If Worksheets(«Employees»).Cells(EmplRow, 8) = «» Then  
   Else  
   Check110 EmplRow, 2, 1, 8  
   End If  

  Алексей

Недавно я унаследовал макрос 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

RRS feed

  • 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 (escapedStringIdea == ‘:’ ||

    escapedStringIdea == ‘\’ ||

    escapedStringIdea == ‘/’ ||

    escapedStringIdea == ‘?’ ||

    escapedStringIdea == ‘*’ ||

    escapedStringIdea == ‘[‘ ||

    escapedStringIdea == ‘]’) {

    escapedStringIdea = ‘_’;

    }

    }

    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

  • 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. Любая идея, как я могу отфильтровать все известные недопустимые символы? Я не решаюсь просто отфильтровать все символы, отличные от слов.

Понравилась статья? Поделить с друзьями:
  • Недопустимое имя сводной таблицы в excel причина
  • Недопустимое имя microsoft excel
  • Недопустимая ссылка на расположение в excel график
  • Недопустимая ссылка на источник данных excel сводная таблица
  • Недопустимая ссылка консолидации excel