Страницы: 1
RSS
Сократить имя, отчество
 
Всем привет, подскажите пожалуйста макрос для сокращения имени и отчества до инициалов, т.е из "Иванов Иван Иванович" сделать "Иванов И.И."
 
а фамилия всегда первая?
 
Формулами точно не надо?
 
Да фамилия всегда первая.  
Макрос предпочтительнее)
 
{quote}{login=Serge 007}{date=26.08.2010 12:11}{thema=}{post}Формулами точно не надо?{/post}{/quote}  
 
Не любят формулы они, Сергей.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Владимир, если нужно это выполнить "на месте", то с формулами возникнут сложности :-) Поэтому, наверное, и спрашивает про макрос.
 
сначала загна не в ту тему  
Sub fio()  
Dim rr As Range  
Dim i  
 
Dim rra(), rrr()  
Set rr = Selection  
rra = rr  
For i = LBound(rra) To UBound(rra)  
rrr() = Split(rra(i, 1))'отладчику не нравится эта строка, type mismatch  
rrr(0) = Trim(rrr(0)) & " "  
rrr(1) = Left(rrr(1), 1) & "."  
rrr(2) = Left(rrr(2), 1) & "."  
rra(i, 1) = Join(rrr, "")  
Next  
rr = rra  
End Sub
 
Вставить в нужное место:  
 
       FullFIO = "Иванов Иван Иванович"  
       FIO = Split(FullFIO, " ")  
       If UBound(FIO) >= 3 Then MsgBox "Что-то не так..." Else ShortFIO = FIO(0) & " " & Left(FIO(1), 1) & "." & Left(FIO(2), 1) & "."  
 
На выходе: Иванов И.И.  
Проверка на всякий случай, чтобы в исходной строке не было больше трёх слов (а точнее - больше двух пробелов)
 
Sub fio()  
Dim rr As Range  
Dim i  
Dim ddd  
Dim rra(), rrr()  
Set rr = Selection  
rra = rr  
For i = LBound(rra) To UBound(rra)  
ddd = Application.WorksheetFunction.Trim(rra(i, 1))  
rrr() = Split(ddd, " ") 'все равно выбрасывает  
If UBound(rrr) >= 3 Then  
MsgBox "что-то не так..."  
Else  
rrr(0) = rrr(0) & " "  
rrr(1) = Left(rrr(1), 1) & "."  
rrr(2) = Left(rrr(2), 1) & "."  
rra(i, 1) = Join(rrr, "")  
End If  
Next  
rr = rra  
End Sub
 
Я, если честно, не пытался поправить макрос Тухачевского, а предложил свой с расчетом на то, что эти строки вставить в нужное место уже существующего какого-то макроса. А если отдельно его сделать, то можно так:  
 
Sub sFIO()  
   For Each rcell In Selection.Cells  
       FullFIO = rcell.Value  
       fio = Split(Application.WorksheetFunction.Trim(FullFIO), " ")  
       If UBound(fio) <= 3 Then  
           ShortFIO = fio(0) & " " & Left(fio(1), 1) & "." & Left(fio(2), 1) & "."  
           rcell.Value = ShortFIO  
       End If  
   Next  
End Sub  
 
(спасибо за идею с Application.WorksheetFunction.Trim :))
 
Sub FIO()  
Dim strF As String  
Dim arrStr() As String  
   strF = Trim(CStr(ActiveCell.Value))  
   arrStr = Split(strF, " ", -1, vbTextCompare)  
   ActiveCell.Offset(0, 1).Value = arrStr(0) & " " & Left(arrStr(1), 1) & "." & Left(arrStr(2), 1) & "."  
End Sub  
 
Вопрос только возникает, как быть, если фамилия содержит пробел, или отчества нет вообще.
Кому решение нужно - тот пример и рисует.
 
Спасибо за "Split"! ;)  
 
Чуть не изобрел велосипед :)  
 
Возможно такой вариант подойдет.
<FONT COLOR="CadetBlue">
 
Всем большое спасибо за помощь!
 
А как сделать при помощи макроса:  
"Иванов Иван Иванович" сделать "И.И. Иванов"
 
Sub FIO()  
Dim strF As String  
Dim arrStr() As String  
strF = Trim(CStr(ActiveCell.Value))  
arrStr = Split(strF, " ", -1, vbTextCompare)  
ActiveCell.Offset(0, 1).Value = Left(arrStr(2), 1) & "." &  Left(arrStr(1), 1) & ". " & arrStr(0)  
End Sub
Кому решение нужно - тот пример и рисует.
 
Попробуйте так:  
Sub qqq()  
x = Split(Cells(1, 1))  
Cells(1, 1) = Left(x(1), 1) & ". " & Left(x(2), 1) & ". " & x(0)  
End Sub
 
Всем СПАСИБО!  
Вопрос снят.
 
{quote}{login=Serge 007}{date=26.08.2010 12:11}{thema=}{post}Формулами точно не надо?{/post}{/quote}  
А как это можно сделать формулами?
 
Можно. Было не раз. Вы не ту тему нашли :)
 
=ЛЕВСИМВ(A1;НАЙТИ(" ";A1;1)+1)&". "&ПСТР(A1;НАЙТИ(" ";A1;НАЙТИ(" ";A1;1)+1)+1;1)&"."  
 
 
-----  
26669
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
{quote}{login=vikttur}{date=22.11.2011 04:36}{thema=}{post}Можно. Было не раз. Вы не ту тему нашли :){/post}{/quote}  
В поиске попалась только эта тема.  
 
Владимир, большое спасибо!
 
Всем огромное СПАСИБО! Спасли время и нервы:)
 
{quote}{login=Пытливый}{date=26.08.2010 03:45}{thema=}{post}Sub FIO()  
Dim strF As String  
Dim arrStr() As String  
strF = Trim(CStr(ActiveCell.Value))  
arrStr = Split(strF, " ", -1, vbTextCompare)  
ActiveCell.Offset(0, 1).Value = Left(arrStr(2), 1) & "." &  Left(arrStr(1), 1) & ". " & arrStr(0)  
End Sub{/post}{/quote}  
 
можно так  
добавил  
Sub FIO()  
Dim strF As String  
Dim arrStr() As String  
Dim i, x As Integer  
x = Cells(Rows.Count, 1).End(xlUp).Row  
For i = 1 To x  
strF = Trim(CStr(Cells(i, 1).Value))  
arrStr = Split(strF, " ", -1, vbTextCompare)  
Cells(i, 2).Value = arrStr(0) & " " & Left(arrStr(1), 1) & "." & Left(arrStr(2), 1) & "."  
Next  
End Sub
Страницы: 1
Читают тему
Наверх