У Manik есть рабочий лист, который в столбце A содержит текстовые значения в формате «mikeDAVIS», где имя человека записано в нижнем регистре, а фамилия – в верхнем регистре. Он хотел бы разделить имена на два отдельных столбца в соответствии с регистром текста.
Это можно сделать с помощью формулы или макроса. Независимо от того, какой подход вы используете, главное – выяснить, где текст переключается с нижнего на верхний регистр. Это можно сделать, только изучив каждый символ в строке. Итак, если вы хотите использовать шаблонный подход, вам нужно будет использовать формулу массива. Следующая формула массива возвращает фамилию того, что находится в ячейке A1:
= MID (A1, MATCH (1, (CODE (MID (A1, ROW ($ 1: 255), 1)) > = 65) * (CODE (MID (A1, ROW ($ 2: 255), 1))Помните, поскольку это формула массива, вам следует введите его, нажав Ctrl + Shift + Enter . Он возвращает все, что есть в ячейке, начиная с первой найденной заглавной буквы. Таким образом, в «mikeDAVIS» он вернет «DAVIS», а в «mikeDavis» он вернет «Davis». Предполагая, что вы используете формулу массива в ячейке B1, вы можете определить имя, используя следующее:
= SUBSTITUTE (A1, B1, "")Это обычная формула, а не формула массива.
Есть много похожих формул массива, которые могут выполнять почти ту же задачу. Например, эта формула массива вернет первое имя (все символы до первого прописного символа) всего, что находится в ячейке A1:
= LEFT (A1, MAX ((CODE (MID ( A $ 1, ROW (INDIRECT ("1:" & LEN (A1))), 1))> 96) * ROW (INDIRECT ("1:" & LEN (A1)))))Затем вы можете использовать ту же обычную формулу (ту, которая использует функцию ПОДСТАВИТЬ) для получения фамилии.
Если вы хотите использовать макро-подход для поиска имен, все, что вам нужно сделать придумали формулу, которая вернет расположение первой заглавной буквы в тексте. Следующий код возвращает эту «точку изменения» в тексте:
Функция GetFirstUpper (MyCell As Range) As Integer Dim sCellValue As String Dim i As Integer sCellValue = Trim (MyCell.Value) i = 1 Выполнить while (Asc (Mid (sCellValue, i, 1))> 90 _ Or Asc (Mid (sCellValue, i, 1))Чтобы использовать функцию, предположим, что имя находится в ячейке A1. Вы можете найти имя и фамилию, используя следующие формулы на своем листе:
= LEFT (A1, GetFirstUpper (A1) -1) = MID (A1, GetFirstUpper (A1), LEN (TRIM ( A1)) - GetFirstUpper (A1) +1)Если вы предпочитаете, чтобы ваш макрос возвращал фактические имена, вы можете использовать следующий, чтобы вернуть все до первой заглавной буквы:
Функция GetFirstName (MyCell As Range) As String Dim sCellValue As String Dim i As Integer sCellValue = Trim (MyCell. Value) i = 1 Do While (Asc (Mid (sCellValue, i, 1))> 90 _ Or Asc (Mid (sCellValue, i, 1))Чтобы использовать макрос, все, что вам нужно сделать, это использовать следующее в ячейке рабочего листа. (Предполагается, что текстовая строка, которая должна быть оценена, находится в ячейке A1.)
= GetFirstName (A1)Небольшое изменение макроса позволит вам аналогичным образом выберите фамилию, которая, как предполагается, начинается с первой встреченной заглавной буквы.
Функция GetLastName (MyCell As Range) As String Dim sCellValue As String Dim i As Integer sCellValue = Trim (MyCell .Value) i = 1 Do While (Asc (Mid (sCellValue, i, 1))> 90 _ Or Asc (Mid (sCellValue, i, 1))Если хотите, вы можете объединить макросы в одну функцию, которая в зависимости от того, что вы укажете, будет возвращать либо имя, либо фамилию:
Функция GetName (MyCell As Range, sWanted As String) As String Dim sCellValue As String Dim i As Integer sCellValue = Trim (MyCell.Value) i = 1 Do While (Asc (Mid (sCellValue, i, 1))> 90 _ Или Asc (Mid (sCellValue, i, 1))Чтобы использовать эту комбинированную функцию, вам просто нужно указать, какое имя вы хотите:
= GetName (A1, "First")Слово «Первый», переданное таким образом в качестве параметра, возвращает имя (все, что находится до первой заглавной буквы). Любая другая строка, переданная в качестве второго параметра (например, «Last», «xxx», «Rest» или даже «»), приводит к возврату фамилии.