Неетю задав сьогоднішнє запитання в коментарі на YouTube:
Чи може макрос змінити текст на регістр речення в Excel?
Це дивно: Excel знає ВЕРХНІЙ, нижній і правильний, але він не підтримує інші випадки, що підтримуються Word: Case Sentence Case або tOGGLE cASE.
Виділений регістр тексту можна легко змінити в Microsoft Word за допомогою внутрішньої функції, що називається Змінити регістр.

Ви можете просто натиснути:
- "Речення вироку", щоб написати велику літеру першої букви речення, а всі інші літери залишити малими літерами.
- "мала літера", щоб виключити з тексту великі літери.
- "ЗАГОЛОВКА" для написання великих літер великими літерами.
- "Великі літери кожного слова", щоб зробити велику першу літеру кожного слова, а інші літери залишити малими літерами.
- "tOGGLE cASE" для переключення між двома поданнями справи.
Хоча Excel не є програмою для обробки текстів, іноді вам може знадобитися змінити регістр поданого тексту. Є три функції Excel для забезпечення подібних функцій. Ці функції приймають один аргумент і перетворюють регістр наданого тексту або текстового значення комірки, на яку посилається, як пояснено нижче.
LOWER()
функція виключення великих літер.UPPER()
функція для написання великих літер.PROPER()
функція для написання великої літери першої літери кожного слова.
Незважаючи на те, що в цій статті ми не обговорюватимемо варіант Tooggle Case, варіант Excel Case може бути необхідним для використання в Excel, і це може бути частково досягнуто комбінуванням існуючих функцій для одного речення, як показано нижче.

Ви можете використовувати такі комбінації функцій, щоб застосувати Select Case до даного речення в Excel.
- Візьміть першу літеру даного тексту, використовуючи функцію LEFT (), і перетворіть її у верхній регістр, використовуючи функцію UPPER ():
=UPPER(LEFT(A1,1))
- А візьміть решту тексту, поєднавши разом функції RIGHT () і LEN (), і перетворіть його на нижній регістр, використовуючи функцію LOWER ():
=LOWER(RIGHT(A1,LEN(A1)-1))
- Нарешті об’єднайте ці два результати за допомогою функції CONCAT ():
=CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))
Це перетворить текст на регістр речень. Ви також можете перевірити це для всього тексту з великої літери, який відображається в комірці А2.
Що робити, якщо в комірці є більше, ніж одне речення, яке ви хотіли б змінити на «Вирок речення»?

Одним із варіантів для цього може бути використання 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
Ось результат.

В ідеалі, це може бути гарною ідеєю написати процедуру, яка буде приймати вибраний діапазон, і замінити весь вміст, використовуючи замість призначеного для користувача функцію Sentence Case. Це можна зробити, додавши в проект наступну підпроцедуру, яка застосовуватиме масове та постійне перетворення.
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