Имитация функции разделения строк в формуле Excel

Я пытаюсь разбить строку в формуле Excel, что-то вроде того, что я могу сделать на многих языках программирования, например.

string words = "some text".split(' ');

Проблема в том, что я не могу быть уверен, что в ячейке больше одного слова. Если я попытаюсь использовать функции FIND() или SEARCH(), они вернут #VALUE, если нет места. Есть ли простой способ разбить строку так, чтобы она возвращала отдельные слова (или еще лучше, чтобы она возвращала либо первое слово, либо все остальные слова)?


person a_m0d    schedule 23.06.2009    source источник
comment
Каким образом вы хотите вернуть слова? Excel не может хранить массив в одной ячейке. Так что же должно быть?   -  person Tomalak    schedule 23.06.2009


Ответы (8)


Формула для возврата либо первого слова, либо всех остальных слов.

=IF(ISERROR(FIND(" ",TRIM(A2),1)),TRIM(A2),MID(TRIM(A2),FIND(" ",TRIM(A2),1),LEN(A2)))

Примеры и результаты

Text                  Description                      Results

                      Blank 
                      Space 
some                  Text no space                some
some text             Text with space                  text
 some                 Text with leading space          some
some                  Text with trailing space         some
some text some text   Text with multiple spaces        text some text

Комментарии к формуле:

  • Функция ОБРЕЗАТЬ используется для удаления всех начальных и конечных пробелов. Также удаляется повторяющийся интервал в тексте.
  • Затем функция НАЙТИ находит первое пробел
  • Если места нет, возвращается обрезанный текст.
  • В противном случае функция MID используется для возврата любого текста после первого пробела.
person Robert Mearns    schedule 23.06.2009
comment
Спасибо, это именно то, что я хотел - person a_m0d; 24.06.2009
comment
Почему они не добавляют в Excel приличные функции синтаксического анализа строк!?!? - person Rory; 04.10.2014
comment
@Rory, потому что Excel в первую очередь предназначен для бухгалтеров, и нет элегантного способа переопределить предположение, что бухгалтер управляет приложением. Для программистов нужен Excel. - person dreftymac; 29.12.2015

Следующее возвращает первое слово в ячейке A1, разделенное пробелом (работает в Excel 2003):

=LEFT(A1, SEARCH(" ",A1,1))
person RobS    schedule 23.06.2009
comment
Да, но если в ячейке нет места, она просто вернет ошибку! - person a_m0d; 23.06.2009
comment
= ЛЕВЫЙ (A1; ПОИСК (; СЦЕПИТЬ (A1;); 1)) - person flash; 15.12.2010

=IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)

Это сначала проверит, содержит ли ячейка пробел, если да, то вернет первое значение из пробела, иначе вернет значение ячейки.

Изменить

Просто чтобы добавить к приведенной выше формуле, в ее нынешнем виде, если в ячейке нет значения, она вернет 0. Если вы хотите отобразить сообщение или что-то, чтобы сообщить пользователю, что оно пусто, вы можете использовать следующее:

=IF(IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)=0, "Empty", IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3))
person James    schedule 23.06.2009
comment
Очевидно, вы можете изменить A3 на любую ячейку, которую вы пытаетесь оценить, Джеймс. - person James; 23.06.2009
comment
Не совсем то, что мне нужно, но +1, потому что это было полезно в другом месте - person a_m0d; 24.06.2009

Эти вещи, как правило, будут проще, если вы будете записывать их по ячейке за раз, разбивая длинные формулы на более мелкие, где вы можете проверять их по ходу. Затем вы можете скрыть промежуточные вычисления или свести их все в одну формулу.

Например, взяв формулу Джеймса:

=IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)

Это действительно только в Excel 2007 или новее.

Разбейте его следующим образом:

B3: =FIND(" ", A3)
C3: =IF(ISERROR(B3),A3,LEFT(A3,B3-1))

Просто работать немного легче, по частям. Как только это будет сделано, вы можете превратить его в

=IF(ISERROR(FIND(" ", A3)),A3,LEFT(A3,FIND(" ", A3)-1))

если хотите.

person Carl Manaster    schedule 23.06.2009

Некоторые отличные рабочие листы в других ответах, но я думаю, они упустили из виду, что вы можете определить пользовательскую функцию (udf) и вызвать ее из листа или формулы.

Следующая проблема, которую вы должны решить, - либо работать со всем массивом, либо с элементом.

Например, этот код функции UDF

Public Function UdfSplit(ByVal sText As String, Optional ByVal sDelimiter As String = " ", Optional ByVal lIndex As Long = -1) As Variant
    Dim vSplit As Variant
    vSplit = VBA.Split(sText, sDelimiter)
    If lIndex > -1 Then
        UdfSplit = vSplit(lIndex)
    Else
        UdfSplit = vSplit
    End If
End Function

позволяет отдельные элементы со следующим в одной ячейке

=UdfSplit("EUR/USD","/",0)

или можно использовать блоки ячеек с

=UdfSplit("EUR/USD","/")

person S Meaden    schedule 27.06.2017
comment
Я обычно добавляю вызов Transpose If Application.Caller.Rows.Count > Application.Caller.Columns.Count в конце, если формула вводится в столбце, а не в - person airstrike; 24.04.2020

Если вам нужно распределение по столбцам только один раз, ответом будет функция «Текст в столбцы» в MS Excel.

См. Справочную статью MS здесь: http://support.microsoft.com/kb/214261

HTH

person Toffix    schedule 12.09.2014

Выделите ячейку, используйте Dat => Text to Columns, а DELIMITER - это пробел. Результат будет отображаться в таком количестве столбцов, сколько разделение найдет место.

person user4196835    schedule 30.10.2014

AFAIK лучшее, что вы можете сделать для эмуляции Split(), - это использовать FILTERXML, который доступен начиная с Excel 2013 и далее (не Excel Online или Mac).

Синтаксис более или менее всегда таков:

=FILTERXML("<t><s>"&SUBSTITUTE(A1,"|","</s><s>")&"</s></t>","//s")

Это вернет массив, который будет использоваться в других функциях, и даже будет работать, если не будет найден разделитель. Если вы хотите узнать об этом больше, возможно, вас заинтересует этот пост.

person JvdV    schedule 21.07.2020