mrdime
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору KDPoid Спасибо подход, понятен и решение оч. хорошее. Но при дальнейших экспериментах с кодом (по указанной выше ссылке), я увидел, что кроме проблем со спец. кирилличными символами есть проблема и в самом подходе. Встроенная функция Asc() вовращает код лишь первого символа в из переменной Массив (i), т.е. если встречается несколько человек, фамилии которых начинаются на одну букву, то в сортировке необходимо анализировать вторую, а при необходимости - третью и т.д. букву (если первые 2 совпадут). Данный код этого не может сделать, соответственно люди с похожими началами фамилий располагаются как попало. Я несколько изменил подход, вместо сложной конструкции Цитата: If Asc(UCase(Массив(i - 1))) > Asc(UCase(Массив(i))) Then | , скормил Екселю упрощенный вариант, т.е. Цитата: If UCase(Массив(i - 1)) > UCase(Массив(i)) Then | Не знаю, как Ексел или VBA (в данном случае) это обрабатывает, но сортировать начал абсолютно грамотно, т.е. учитывать все символы в процессе сравнения. Думаю, сравнение тоже базируется на кодах ASCI, только как-то комплексно (т.е. перебирая все символы). НО, при этом проблема со спец. кирилличными символами осталась (фактически - это одна украинская буква "І", т.к. на другие спец. буквы обычно фамилии не начинаются.) Если фамилии начинаются на эту букву, такие элементы массива сабж бросает в начало списка (очевидно потому, что эта буква имеет код ASCI 178, т.е. меньше, чем у всех других букв алфавита). Поскольку от функции сравнения с использованием функции Asc(), я ушел, то и использование пользовательской функции MyAsc(), тоже уже не сработает. Соответсвенно вопрос остается открытым: как правильно отсортировать элементы массива с учетом вышеописанной проблемы со спец. символами (буквой "І")? Интересует сам принцип решения проблемы, а не конкретный символ, т.к. в русском это может быть буква "Ё" например при сортировке фамилий. |