Neethu uždavė šios dienos klausimą komentuodamas „YouTube“:
Ar „Excel“ makrokomanda gali pakeisti tekstą į sakinių bylą?
Keista: „Excel“ žino AUKŠTESNĮ, žemesniąjį ir tinkamąjį, bet nepalaiko kitų „Word“ palaikomų atvejų: sakinio byla arba „tOGGLE“ byla.
Pasirinktą teksto raidę „Microsoft Word“ galite lengvai pakeisti naudodamiesi vidine funkcija, vadinama „Change Case“.

Galite tiesiog spustelėti:
- „Sentence Case“, kad pirmoji sakinio raidė būtų didžioji, o visas kitas raides palikite mažąsias.
- „mažosios raidės“, jei norite iš teksto išskirti didžiąsias raides.
- „VIRŠUTINĖ DABAR“, kad visos raidės būtų rašomos didžiosiomis raidėmis.
- „Didžiosiomis raidėmis rašykite kiekvieną žodį“, kad kiekvieno žodžio pirmoji raidė būtų didžioji, o kitas raides palikite mažąsias.
- „TOGGLE cASE“, jei norite pereiti nuo dviejų atvejų rodinių.
Nors „Excel“ nėra teksto apdorojimo programa, kartais gali tekti pakeisti pateikto teksto raidę. Yra trys „Excel“ funkcijos, suteikiančios panašią funkciją. Šios funkcijos turi vieną argumentą ir transformuoja pateikto teksto ar nurodytos langelio teksto vertės atvejį, kaip paaiškinta toliau.
LOWER()
funkcija išskirti didžiąsias raides.UPPER()
funkcija rašyti didžiąsias raides.PROPER()
funkcija rašyti didžiąja raide kiekvieno žodžio raidę.
Nors šiame straipsnyje mes neaptarsime parinkties „Tooggle Case“, „Excel“ gali reikėti naudoti parinktį „Sauseence Case“, ir tai galima iš dalies pasiekti derinant esamas funkcijas vienam sakiniui, kaip parodyta žemiau.

Galite naudoti šiuos funkcijų derinius, kad pritaikytumėte „Select Case“ tam tikram „Excel“ sakiniui.
- Paimkite pirmąją nurodyto teksto raidę naudodamiesi funkcija LEFT () ir paverskite ją didžiosiomis, naudodamiesi funkcija UPPER ():
=UPPER(LEFT(A1,1))
- Paimkite likusį tekstą kartu derindami RIGHT () ir LEN () funkcijas ir pakeiskite jį mažosiomis raidėmis naudodami LOWER () funkciją:
=LOWER(RIGHT(A1,LEN(A1)-1))
- Galiausiai sujunkite šiuos du rezultatus naudodami funkciją CONCAT ():
=CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))
Tai pakeis tekstą į sakinio atvejį. Taip pat galite tai išbandyti visam didžiosiomis raidėmis, kuris rodomas langelyje A2.
Ką daryti, jei langelyje yra daugiau nei vienas sakinys, kurį norite pakeisti į sakinio bylą?

Viena iš galimybių tai padaryti gali būti VBA naudojimas šiai transformacijai atlikti.
SENTENCECASE()
vartotojo apibrėžta funkcija užima pateiktą tekstą, apdoroja tekstą trims skyrybos ženklams (taškas, klaustukas ir šauktukas), kad surastų kelis sakinius, rašytų didžiąsias kiekvieno sakinio raides ir grąžintų rezultatą.
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()
funkcija naudoja pagalbininko funkciją, vadinamą splitAndTransform()
padalinti sakinius ir transformuoti atvejį pagal nurodytą skiriamąjį elementą. splitAndTransform()
yra daugkartinio naudojimo VBA funkcija šiame projekte, todėl ji parašyta kaip atskira pagalbininko funkcija.
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()
pagalbininko funkcija naudoja kitą pagalbinę funkciją, vadinamą, isPuncMarked()
kuri apibrėžia, ar duoto teksto pabaigoje yra skyrybos ženklas. Netgi ji nėra pakartotinai naudojama modulyje, funkcija isPuncMarked () grąžina loginę vertę, o skambinančioji funkcija susijusi tik su verte, kurią ji grąžina, bet kaip ji veikia. Visada yra gera praktika taip pat atskirti šią logiką, kad būtų galima geriau įskaityti priklausomose procedūrose.
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
Štai rezultatas.

Geriausia būtų parašyti procedūrą, kuri atliktų pasirinktą diapazoną ir pakeistų visą turinį naudodama „Sentence Case“, o ne vartotojo apibrėžtą funkciją. Tai galima padaryti pridedant šią papildomą procedūrą prie projekto, kuris pritaikys masę ir nuolatinį transformavimą.
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