Падение предложений в Excel - Советы по Excel

Ниту задал сегодняшний вопрос в комментарии на YouTube:

Может ли макрос изменить текст на регистр предложений в Excel?

Это странно: Excel знает ВЕРХНИЙ, НИЖНИЙ и Правильный, но не поддерживает другие случаи, поддерживаемые Word: Sentence Case или TOGGLE CASE.

Выбранный текстовый регистр можно легко изменить в Microsoft Word с помощью внутренней функции под названием «Изменить регистр».

Измените параметры команды «Регистр» в Microsoft Word.

Вы можете просто нажать:

  • «Регистр предложения», чтобы сделать первую букву предложения заглавной, а все остальные буквы оставить строчными.
  • "нижний регистр", чтобы исключить заглавные буквы из текста.
  • «ПРОПИСНЫЕ», чтобы сделать все буквы заглавными.
  • «Сделать каждое слово заглавными», чтобы сделать первую букву каждого слова заглавной, а остальные буквы оставить строчными.
  • "TOGGLE CASE" для переключения между двумя видами case.

Хотя Excel не является приложением для обработки текстов, иногда вам может потребоваться изменить регистр данного текста. Есть три функции Excel, обеспечивающие аналогичную функциональность. Эти функции принимают один аргумент и преобразуют регистр предоставленного текста или текстового значения указанной ячейки, как описано ниже.

  1. LOWER() функция исключения заглавных букв.
  2. UPPER() функция для заглавных букв всех букв.
  3. PROPER() функция для заглавной буквы в каждом слове.

Хотя мы не будем обсуждать параметр «Переключить регистр» в этой статье, параметр «Регистр предложения» может потребоваться для использования в Excel, и это может быть частично достигнуто путем объединения существующих функций для одного предложения, как показано ниже.

Выберите Реализация дела с формулами Excel.

Вы можете использовать следующие комбинации функций, чтобы применить Select Case к заданному предложению в Excel.

  1. Возьмите первую букву данного текста с помощью функции LEFT () и преобразуйте ее в верхний регистр с помощью функции UPPER ():

    =UPPER(LEFT(A1,1))

  2. И возьмите остальной текст, объединив функции RIGHT () и LEN () вместе, и преобразуйте его в нижний регистр с помощью функции LOWER ():

    =LOWER(RIGHT(A1,LEN(A1)-1))

  3. Наконец, объедините эти два результата с помощью функции CONCAT ():

    =CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))

Это преобразует текст в регистр предложений. Вы также можете проверить это для всего текста с заглавной буквы, который отображается в ячейке A2.

Что делать, если в ячейке содержится более одного предложения, которое вы хотите изменить на вариант приговора?

Несколько предложений в ячейке.

Один из вариантов сделать это - использовать VBA для выполнения этого преобразования.

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

Function SENTENCECASE(txt As String) Dim resArr() As String Dim newArr1(), newArr2(), newArr3() As Variant ReDim resArr(0) resArr(0) = txt newArr1 = splitAndTransform(resArr(0), ".") If Not IsEmpty(newArr1) Then For Each par1 In newArr1 newArr2 = splitAndTransform(par1, "?") If Not IsEmpty(newArr2) Then For Each par2 In newArr2 newArr3 = splitAndTransform(par2, "!") If Not IsEmpty(newArr3) Then For Each par3 In newArr3 resArr(UBound(resArr)) = par3 ReDim Preserve resArr(UBound(resArr) + 1) Next par3 End If Next par2 End If Next par1 End If SENTENCECASE = Join(resArr, " ") End Function

SENTENCECASE()Функция использует вспомогательную функцию, вызываемую splitAndTransform()для разделения предложений и преобразования регистра по заданному разделителю. splitAndTransform()- это многоразовая функция VBA в этом проекте, поэтому она написана как отдельная вспомогательная функция.

Function splitAndTransform(text, delimiter) Dim tmpArr Dim newArr tmpArr = Split(text, delimiter) If UBound(tmpArr)>= 0 Then ReDim newArr(UBound(tmpArr)) For i = 0 To UBound(tmpArr) If tmpArr(i) "" Then newArr(i) = Trim(tmpArr(i)) newArr(i) = UCase(Left(newArr(i), 1)) & _ LCase(Right(newArr(i), Len(newArr(i)) - 1)) If Not isPuncMarked(newArr(i)) Then newArr(i) = newArr(i) & delimiter End If End If Next i Else ReDim newArr(0) End If splitAndTransform = newArr End Function

splitAndTransform()вспомогательная функция использует другую вызываемую вспомогательную функцию, isPuncMarked()которая определяет, содержит ли данный текст знак препинания в конце. Даже если она не используется повторно в модуле, функция isPuncMarked () возвращает логическое значение, а вызывающая функция заботится только о возвращаемом значении, но о том, как это работает. Всегда рекомендуется также разделять эту логику, чтобы обеспечить лучшую читаемость зависимых процедур.

Function isPuncMarked(sentence) As Boolean Dim rightMost As String rightMost = Right(sentence, 1) If rightMost = "." Or _ rightMost = "?" Or _ rightMost = "!" Then isPuncMarked = True Else isPuncMarked = False End If End Function

Вот результат.

Результат SENTENCECASE UDF.

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

Sub doSentenceCase() Dim rng As Range Dim cll As Range Dim resArr() As String Dim newArr1(), newArr2(), newArr3() As Variant Set rng = Selection For Each cll In rng.Cells ReDim resArr(0) resArr(0) = cll.Value newArr1 = splitAndTransform(cll.Value, ".") If Not IsEmpty(newArr1) Then For Each par1 In newArr1 newArr2 = splitAndTransform(par1, "?") If Not IsEmpty(newArr2) Then For Each par2 In newArr2 newArr3 = splitAndTransform(par2, "!") If Not IsEmpty(newArr3) Then For Each par3 In newArr3 resArr(UBound(resArr)) = par3 ReDim Preserve resArr(UBound(resArr) + 1) Next par3 End If Next par2 End If Next par1 End If cll.Value = Join(resArr, " ") Next cll End Sub

Интересные статьи...