Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2011, 12:34   #1
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию Преобразование в транслит и запись в ячейку

У меня в Excel есть список вида

(см. вложение)

Я хочу написать скрипт на VBA, который будет:
  • читать данные из графы "ФИО"
  • делить их на фамилию, имя и отчество
  • фамилию переводить в транслит
  • имя и отчество обрезать до первых букв и тоже переводить в транслит. Затем склеивать фамилию и инициалы. К примеру, имеем "Иванов Виталий Алексеевич". Должны получить "IvanovVA".
  • записывать полученное в графу "Логин"
  • брать от логина только фамилию ("Ivanov"), преобразовывать первую прописную букву в строчную (что бы было "ivanov") и записывать в графу "Пароль"

Понимаю, что мне тут нужна будет таблица транслита и, по ходу, регулярные выражения.

Вопрос мой в другом: подскажите ссылки, по которым можно почитать информацию по моему вопросу. А то в гугле примеры не совсем для меня, немного сложные. А я VBA мало занимался (php в основном), долго в них разбирался. Вот на php знаю книжки, в которых конкретные мини-задачи разбираются (открытие файла, чтение из массива и тд.), кто подскажет на VBA похожие книжки?
Изображения
Тип файла: jpg delaem_vba_script_dlya_sozd_loginov_i_parolej_studentam_001.jpg (13.9 Кб, 222 просмотров)
fs444 вне форума Ответить с цитированием
Старый 13.03.2011, 12:58   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

1) Никаких регулярных выражений здесь не нужно.
Достаточно циклической подстанови с помошью функции Replace.
2) Вызывает большое сомнение постановка задачи
Иванов Виталий Алексеевич и Иванов Виктор Александрович получат один и тот же комплект логина и пароля ...
Да и сам пароль уж больно крутой
Для сведения (если это реальная задача а не учебный пример):
3) Отчества бывают сложные типа Курбанбек Баши оглы.
4) Отчества может не быть совсем как такового
5) Имён (в т.ч. у Российских граждан) может быть несколько. Реальный вариант из жизни: человека по паспорту звали Уткин Игорь Михаил Кристиан Харральдович
6) Имя и отчество могут содержать дефис. В этом случае по правилам формирования инициалов берутся 2 буквы через дефис.
7) Транслитерация в латиницу фамилий для английского, немецкого, французского и испанского производится по разным правилам.

В остальном, наберите в Google "VBA для чайников" и будет вам счастье.

Последний раз редактировалось Aent; 13.03.2011 в 16:58.
Aent вне форума Ответить с цитированием
Старый 13.03.2011, 14:08   #3
MCH
Форумчанин
 
Регистрация: 21.11.2010
Сообщений: 326
По умолчанию

Цитата:
подскажите ссылки, по которым можно почитать информацию по моему вопросу
http://www.planetaexcel.ru/tip.php?aid=110
http://www.excelworld.ru/index/knigi...plication/0-12
Вложения
Тип файла: rar Pass.rar (9.0 Кб, 46 просмотров)
MCH вне форума Ответить с цитированием
Старый 13.03.2011, 14:10   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Aent, смог! я даже не пытался над всем этим задуматься.
Уткин Игорь Михаил Кристиан Харральдович - а человеку с этим жить. хорошо хоть Акакием не назвали, бывает родители не любят своих детей еще при рождении... допускаю, что Харральд сделал в отместку за свое имя.
задача решена в лоб. после прочитанного понимаю, может использоваться исключительно, как пример.
Вложения
Тип файла: rar Книга617.rar (13.1 Кб, 51 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 13.03.2011, 14:26   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Сообщение от Aent Посмотреть сообщение
Для сведения (если это реальная задача а не учебный пример):
3) Отчества бывают сложные типа Курбанбек Баши оглы.
4) Отчества может не быть совсем как такового
5) Имён (в т.ч. у Российских граждан) может быть несколько. Реальный вариант из жизни: человека по паспорту звали Уткин Игорь Михаил Кристиан Харральдович
6) Имя и отчество могут содержать дефис. В этом случае по правилам формирования инициалов берутся 2 буквы через дефис.
Aent, а у вас, случайно, нет наработок в виде UDF-функции, которая бы сокращала ФИО, с учётом всех этих особенностей?

Я использую пока слишком упрощённый вариант - но хотелось бы найти универсальное решение (часто требуется в работе):

Код:
Function CropFIO(ByVal FIO As String) As String
    ' получает в качестве параметра текстовую строку с виде "Фамилия имя отчество"
    ' обрезает имя и отчество, оставляя лишь инициалы - в виде "Фамилия И. О."
    Application.Volatile True
    CropFIO = Application.Trim(FIO): arr = Split(Replace(CropFIO, "-", " - "), " ")

    For i = UBound(arr) - 1 To UBound(arr)
        If Len(arr(i)) > 1 Then arr(i) = UCase(Left(arr(i), 1)) & "."
    Next i
    CropFIO = Replace(Replace(Join(arr, " "), " - ", "-"), ". ", ".")
End Function
EducatedFool вне форума Ответить с цитированием
Старый 14.03.2011, 23:45   #6
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

EducatedFool, c инициалами вопрос очень мутный.
Во первых, не существует точного формального алгоритма разделения ФИО на части. Отделить фамилию от имени формально нельзя не зная
генеологии и языка носителя. Можно только воспользоваться разнообразными эвристиками.
Кроме того, разные органы (в разное время) придерживались (-ются) разных взглядов на то как в том или ином случае должны выглядеть инициалы.
Одно дело документы УФМС - другое, регистраторы ЦБ, третье - оформление коммерческих документов.
Так, часть служб требует что бы 2-3 сложные короткие имена Юго-Восточной Азии не сокращались. А часть нет.
Да же с вопросом где должны стоять инициалы справа или слева - нет однозначности. Нет, конечно есть правила русского языка... Но превалируют правила делового оборота той или иной структуры (или просто как захочет левая задняя нога клерка принимающего документы)...
У многих возможно возникает вопрос: А откуда берётся весь этот зоопарк и зачем это всё нужно? Как правило, все эти Доны Педро - иностранные граждане получающие Российский паспорт на основании ранее выданных вне юрисдикции РФ документов. Ситуации правовые бывают разные. И достаточно часто в новый Российский паспорт пишется вариант транслитерации на кириллицу с языка носителя.
Российские паспорта с -оглы и -кызы выдаются сейчас в Татарстане. Мне встретился клиент которого по паспорту 2007 г. звали Мустафа Олег оглы...
Лет 15 назад я слепил на коленке ad hoc функцию Инициалы.
Привожу её в UDF варианте вместе с вариантом, предложенным вами (Который весьма элегантен и в 90% жизненных ситуаций даст правильный результат).
Код функции Инициалы строился годы как стройная система костылей и подпорок. До глобального рефакторинга руки так и не дошли
Ещё раз подчеркну - приводится весьма упрощённый эвристический алгоритм. Да же список служебных частиц для тюркско-арабских имён не полный.
Тем ни менее он охватывает подавляющее большинство реально встречавшихся вариантов. Хотя, для, скажем, фрайхерра фон унд цу Гуттенберга Карла-Теодора Марии Николауса Иоганна Якоба Филиппа Франца Йозефа Сильвестра результат будет неверным. Благо, министр обороны Германии не российский гражданин
Вложения
Тип файла: zip Инициалы.zip (17.3 Кб, 116 просмотров)

Последний раз редактировалось Aent; 15.03.2011 в 02:56.
Aent вне форума Ответить с цитированием
Старый 15.03.2011, 07:05   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Aent, большое спасибо за функцию
Добавил её себе в записную книжку
EducatedFool вне форума Ответить с цитированием
Старый 18.06.2011, 01:03   #8
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию

Спасибо за ответы. Если у кого-то еще будут мнения, пишите, с удовольствием почитаю.

Так как сам лучше всего знаю php, решение своего вопроса придумал именно на нем:

Написал три скрипта:

sozdaem_logini_i_paroli_studentov.p hp
PHP код:
<?php
    
include("translit_fam.php");

include(
"translit_imya_otch.php");

function 
generateEmail($length 6){
  
$chars 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
  
$numChars strlen($chars);
  
$string '';
  for (
$i 0$i $length$i++) {
    
$string .= substr($charsrand(1$numChars) - 11);
  }
  
  
$string strtolower($string);
  return 
$string;
}

$fio_studentov file("fio_studentov.txt");

$kolvo_elem_massiva count($fio_studentov);

//echo $kolvo_elem_massiva;

echo "<table border='1'>";
//<tr><td>ФИО студента</td><td>Логин</td><td>Пароль</td>";

for ($i 0$i $kolvo_elem_massiva$i++)
{
   
$fio_studentov[$i] = split(" "$fio_studentov[$i]);

/*   
   echo "Фамилия: ".$fio_studentov[$i]['0']."<br>";
   echo "Имя: ".$fio_studentov[$i]['1']."<br>";
   echo "Отчество: ".$fio_studentov[$i]['2']."<br><br>";
*/

   
$pervaja_bukva_imeni substr($fio_studentov[$i]['1'],0,1);
      
   
//echo $fio_studentov[$i]['1']." - ".$pervaja_bukva_imeni."<br>";
   
   
$pervaja_bukva_otch substr($fio_studentov[$i]['2'],0,1);  
           
   
$familija_v_translite translit_fam($fio_studentov[$i]['0']);
   
//echo $familija_v_translite;
   
$imya_v_translite translit_imya_otch($pervaja_bukva_imeni);
   
   
$otchestvo_v_translite translit_imya_otch($pervaja_bukva_otch); 

   
$parol strtolower($familija_v_translite);
   
   
$dlina_parolya strlen($parol);
   
   if (
$dlina_parolya 6)
   {
      
$dobavit_kolvo_simvolov_v_parol $dlina_parolya;
      
      for (
$j 0$j $dobavit_kolvo_simvolov_v_parol$j++)
      {
         
$parol $parol."1";
      }
   }
   
   if (
$dlina_parolya 6)
   {
     
$parol substr($parol,0,6);  
   }
   
   echo 
"<tr>";
   
   
//вывод просто фамилии
   //echo "<td>".$fio_studentov[$i]['0']."</td>";
   
   
echo "<td>".$fio_studentov[$i]['0']." ".$fio_studentov[$i]['1']." ".$fio_studentov[$i]['2']."</td><td>Tamb_".$familija_v_translite.$imya_v_translite.$otchestvo_v_translite."</td>";
   
   
//вывод случайного мыла
   //echo "<td>".generateEmail()."@inprofin.ru</td>";
   
   //вывод фамилии в качестве мыла
   
echo "<td>".$parol."@inprofin.ru</td>";
   

   
   echo 
"</td><td>".$parol."</td></tr>";

}

echo 
"</table>";

?>
translit_fam.php
PHP код:
<?php

 
function translit_fam($str
{
    
$tr = array("а" => "a""б" => "b""в" => "v""г" => "g""д" => "d""е" => "e""ё" => "e""ж" => "zh""з" => "z""и" => "i""й" => "j""к" => "k""л" => "l""м" => "m""н" => "n""о" => "o""п" => "p""р" => "r""с" => "s""т" => "t""у" => "u""ф" => "f""х" => "h""ц" => "c""ч" => "ch""ш" => "sh""щ" => "sh""ь" => """ы" => "i""ъ" => "j""э" => "e""ю" => "ju""я" => "ja""А" => "A""Б" => "B""В" => "V""Г" => "G""Д" => "D""Е" => "E""Ё" => "E""Ж" => "ZH""З" => "Z""И" => "I""Й" => "J""К" => "K""Л" => "L""М" => "M""Н" => "N""О" => "O""П" => "P""Р" => "R""С" => "S""Т" => "T""У" => "U""Ф" => "F""Х" => "H""Ц" => "C""Ч" => "CH""Ш" => "SH""Щ" => "SH""Ь" => """Ы" => "I""Ъ" => "]""Э" => "E""Ю" => "JU""Я" => "JA");
    
$str strtr($str,$tr);
    
    
$str strtolower($str);
    
$str ucfirst($str);
    
    return 
$str;
}

//echo translit_imya_otch("Юдина");
  
?>
PHP код:
<?php

 
function translit_imya_otch($str
{
    
$tr = array("а" => "a""б" => "b""в" => "v""г" => "g""д" => "d""е" => "e""ё" => "e""ж" => "z""з" => "z""и" => "i""й" => "j""к" => "k""л" => "l""м" => "m""н" => "n""о" => "o""п" => "p""р" => "r""с" => "s""т" => "t""у" => "u""ф" => "f""х" => "h""ц" => "c""ч" => "c""ш" => "s""щ" => "s""ь" => """ы" => "i""ъ" => "j""э" => "e""ю" => "j""я" => "j""А" => "A""Б" => "B""В" => "V""Г" => "G""Д" => "D""Е" => "E""Ё" => "E""Ж" => "Z""З" => "Z""И" => "I""Й" => "J""К" => "K""Л" => "L""М" => "M""Н" => "N""О" => "O""П" => "P""Р" => "R""С" => "S""Т" => "T""У" => "U""Ф" => "F""Х" => "H""Ц" => "C""Ч" => "C""Ш" => "S""Щ" => "S""Ь" => """Ы" => "I""Ъ" => "]""Э" => "E""Ю" => "J""Я" => "J");
    
$str strtr($str,$tr);
    
    
$str strtolower($str);
    
$str ucfirst($str);
    
    return 
$str;
}

//echo translit_imya_otch("Юдина");
  
?>
Еще есть файлик fio_studentov.txt, в котором в виде списка лежат ФИО всех студентов:
Цитата:
Иванов Виктор Петрович
Козлов Николай Иванович
fs444 вне форума Ответить с цитированием
Старый 18.06.2011, 22:26   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А не проще ли было найти в интернете готовую функцию транслита на VBA?
http://excelvba.ru/code/translit
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись из эдита в ячейку таблицы Balabar Помощь студентам 1 25.11.2010 20:20
формула суммпроизв. запись в ячейку gsg Microsoft Office Excel 3 18.11.2010 09:16
Запись данных в ячейку orkus Помощь студентам 15 30.03.2010 16:15
запись двух функций в одну ячейку (ВПР+ЕСЛИОШИБКА) grichanuk Microsoft Office Excel 2 17.11.2009 14:46
Запись числа типа инт в ячейку двумерного массива типа char AxenicX Помощь студентам 1 25.09.2009 00:35