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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2016, 12:01   #1
SAUUNSAPR
Пользователь
 
Регистрация: 21.04.2015
Сообщений: 16
По умолчанию Разделение слитного написания в ячейке с разным регистром

Добрый день, уважаемые знатоки Excel. Помогите решить проблему. В одной ячейке введены данные, например: "ИвановИванИванович начальник отдела". А нужно, что бы в данной ячейке или в соседней ФИО было написано все раздельно, например: "Иванов Иван Иванович начальник отдела". Можно было бы и вручную, но когда таких записей несколько тысяч?! Реально ли это сделать формулой или в коде. Спасибо.

Последний раз редактировалось SAUUNSAPR; 17.02.2016 в 12:13. Причина: уточнение
SAUUNSAPR вне форума Ответить с цитированием
Старый 17.02.2016, 12:18   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

v.1
Код:
Sub splitFIO()
    Dim FIO$, uFIO$, newFIO$
    Dim i As Byte
    FIO = "ИвановИвaнИванович начальник отдела"
    uFIO = UCase(FIO)
    newFIO = Mid(FIO, 1, 1)
    For i = 2 To Len(FIO)
        If Mid(FIO, i, 1) = Mid(uFIO, i, 1) Then
            newFIO = newFIO & " " & Mid(FIO, i, 1)
        Else
            newFIO = newFIO & Mid(FIO, i, 1)
        End If
    Next
    MsgBox (FIO & Chr(13) & newFIO)
End Sub
v.2
Код:
Function splitFIO(cel As Range)
    Dim FIO$, uFIO$, newFIO$
    Dim i As Byte
    FIO = cel.Cells(1, 1).Value2
    uFIO = UCase(FIO)
    newFIO = Mid(FIO, 1, 1)
    For i = 2 To Len(FIO)
        If Mid(FIO, i, 1) = Mid(uFIO, i, 1) Then
            newFIO = newFIO & " " & Mid(FIO, i, 1)
        Else
            newFIO = newFIO & Mid(FIO, i, 1)
        End If
    Next
    splitFIO = newFIO
End Function
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 17.02.2016 в 12:49.
Aleksandr H. вне форума Ответить с цитированием
Старый 17.02.2016, 13:00   #3
SAUUNSAPR
Пользователь
 
Регистрация: 21.04.2015
Сообщений: 16
По умолчанию Разделитель слов в ячейке

Спасибо Александр! Но весь смысл в том что в базе данный в ячейках по этому столбцу могут быть разные записи, не только "ИвановИИ", а все что угодно работники напишут, а для дальнейшей обработки данных нужно "подчистить" все эти "глюки" и уже работать с текстом, но не на красивой форме выводимой, а новый текст должен попасть в соседнюю ячейку.
Вложения
Тип файла: xls Разделение слов слитных в Excel.xls (14.5 Кб, 9 просмотров)
SAUUNSAPR вне форума Ответить с цитированием
Старый 17.02.2016, 13:11   #4
svsh2016
Форумчанин
 
Регистрация: 16.06.2015
Сообщений: 100
По умолчанию

добрый день,еще вариант макроса,кнопка test

Код:
 Sub test()
   Dim t$, i&, j&, i1&, t1$, m&
 For j = 1 To Range("A" & Rows.Count).End(xlUp).Row: m = 0
   t = Range("A" & j)
   For i = 2 To Len(t)
     If Mid(t, i, 1) Like "[А-ЯЁ]" Then
       m = m + 1
       If m = 1 Then i1 = i: t1 = Left(t, i - 1)
       If m = 2 Then Range("C" & j) = t1 & Chr(32) & Mid(t, i1, i - i1) & Chr(32) & Mid(t, i)
     End If
   Next i, j
End Sub
Вложения
Тип файла: xls example_17_02_2016_progr1.xls (36.0 Кб, 17 просмотров)

Последний раз редактировалось svsh2016; 17.02.2016 в 13:12. Причина: русские буквы подправил
svsh2016 вне форума Ответить с цитированием
Старый 17.02.2016, 13:38   #5
SAUUNSAPR
Пользователь
 
Регистрация: 21.04.2015
Сообщений: 16
По умолчанию Разделитель слов в ячейке

Спасибо, оригинально, но вот после ФИО, что то не разделяет дальше, а ведь могут ФИО правильно написать, а вот в должности или другом тексте после ФИО слитно что-то записать, как дальше то делить. И самое главное хотелось бы в виде формулы это получить или функцией прописать, что бы потом на листе протянуть это на всю БД, спасибо!
SAUUNSAPR вне форума Ответить с цитированием
Старый 17.02.2016, 14:00   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

код v.2 пробовали? Там ведь фукнция

Код:
Function splitFIO(cel As Range)
    Dim FIO$, uFIO$, newFIO$
    Dim i As Byte
    FIO = cel.Cells(1, 1).Value2
    uFIO = UCase(FIO)
    newFIO = Mid(FIO, 1, 1)
    For i = 2 To Len(FIO)
        If Mid(FIO, i, 1) = Mid(uFIO, i, 1) Then
            newFIO = newFIO & " " & Mid(FIO, i, 1)
        Else
            newFIO = newFIO & Mid(FIO, i, 1)
        End If
    Next
    splitFIO = Application.Trim(newFIO)
End Function
ps а вот ОЦОР вабше не в тему
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 17.02.2016 в 14:04.
Aleksandr H. вне форума Ответить с цитированием
Старый 17.02.2016, 15:01   #7
SAUUNSAPR
Пользователь
 
Регистрация: 21.04.2015
Сообщений: 16
По умолчанию

Александр Спасибо все замечательно работает 2 вариант с функцией, сейчас только увидел, как зашел на форум. Всем тоже спасибо!
SAUUNSAPR вне форума Ответить с цитированием
Старый 17.02.2016, 16:30   #8
svsh2016
Форумчанин
 
Регистрация: 16.06.2015
Сообщений: 100
По умолчанию

SAUUNSAPR,вариант test2 со считыванием в массив,протягивать не надо
диапазон произвольный ,кнопка test2,
для протягивания функция в столбце H,
приведите файл пример,можно видоизменить для любого варианта.

Код:
 Sub test2()
   Dim t$, z, i&, j&, i1&, t1$, m&
   z = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
 For j = 1 To UBound(z): m = 0
   t = z(j, 1)
   For i = 2 To Len(t)
     If Mid(t, i, 1) Like "[А-ЯЁ]" Then
       m = m + 1
       If m = 1 Then i1 = i: t1 = Left(t, i - 1)
       If m = 2 Then t = t1 & Chr(32) & Mid(t, i1, i - i1) & Chr(32) & Mid(t, i)
     End If
   Next i, j
  Range("C1").Resize(UBound(z), UBound(z, 2)).Value = z
End Sub
Код:
Function yyy$(t$)
   Dim i&, i1&, t1$, m&
   For i = 2 To Len(t)
     If Mid(t, i, 1) Like "[А-ЯЁ]" Then
       m = m + 1
       If m = 1 Then i1 = i: t1 = Left(t, i - 1)
       If m = 2 Then yyy = t1 & Chr(32) & Mid(t, i1, i - i1) & Chr(32) & Mid(t, i)
     End If
   Next
End Function
Вложения
Тип файла: xls example_17_02_2016_progr2.xls (44.5 Кб, 10 просмотров)
svsh2016 вне форума Ответить с цитированием
Старый 17.02.2016, 18:13   #9
svsh2016
Форумчанин
 
Регистрация: 16.06.2015
Сообщений: 100
По умолчанию

добрый вечер,протестируйте также универсальную функцию uuu
в столбце J,к примеру

Код:
Function uuu$(t$)
  With CreateObject("VBScript.RegExp"): .Pattern = "[А-ЯЁ]": .Global = True
    If .test(t) Then uuu = .Replace(t, " $&")
  End With
End Function
Вложения
Тип файла: xls example_17_02_2016_progr4.xls (42.5 Кб, 19 просмотров)
svsh2016 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема в Interbase с регистром Moneo БД в Delphi 0 29.05.2013 23:36
Поиск с независимым регистром bigbang22222 Паскаль, Turbo Pascal, PascalABC.NET 3 12.06.2012 10:05
Проблема с регистром kyrychenko.mitya PHP 46 22.08.2011 10:24
проблема с регистром в запросе SQL Abbatik Помощь студентам 2 28.01.2008 00:48
Нужно разбить те числа которые в одной ячейке по разным ячейчам в столбец Alexander_Gr Microsoft Office Excel 8 20.11.2007 08:02