Как мне сделать заглавной первую букву в каждом абзаце, если в ячейке несколько абзацев? - PullRequest
0 голосов
/ 09 марта 2020

Итак, у меня есть списки, в которых одна ячейка в каждой строке будет иметь либо абзац, либо несколько абзацев. Мне нужно стандартизировать их, чтобы они были в предложении. Я построил некоторый код для этого, который работает, если есть один абзац, но когда в ячейке есть несколько абзацев или разрывов строк, он не может использовать заглавную букву. Я пытался найти и заменить сам разрыв строки как переменную, но это не сработало, и я застрял.

Большая часть моего кода работает путем преобразования всего выбранного диапазона в Lcase и затем выполняя серию поиска и замены, чтобы первая буква каждого предложения была заглавной.

Selection.Replace What:=". a", Replacement:=". A"

I go по всему алфавиту, чем сделать это снова с "! a" и "~? a "

Но этот метод не сработает, если между предыдущим абзацем и новым абзацем есть разрыв строки.

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

For Each cell In RNG
cell.Value = UCase(Left(cell.Value, 1)) & Right(cell.Value, Len(cell.Value) - 1)
Next cell

Еще раз спасибо Скотту Крейнеру за ответ!

Selection.Replace What:=Chr(10) & "A"

Это решает мою проблему!

Ответы [ 3 ]

1 голос
/ 09 марта 2020

Попробуйте этот код, пожалуйста:

Sub testProperCaseParagraph()
  Dim sh As Worksheet, arr As Variant, rng As Range, cel As Range
  Dim El As Variant, strProp As String

  Set sh = ActiveSheet 'use here your sheet
  Set rng = sh.Range("A14:B22") 'use here your range (I used it for testing purpose)
    For Each cel In rng
        arr = Split(cel.value, vbLf)
        For Each El In arr
            If strProp = "" and El <> "" Then
                strProp = UCase(left(El, 1)) & Right(El, Len(El) - 1)
            ElseIf El <> "" Then
                strProp = strProp & vbLf & UCase(left(El, 1)) & Right(El, Len(El) - 1)
            End If
        Next
        cel.value = strProp: strProp = ""
    Next
End Sub
1 голос
/ 10 марта 2020

Я бы попробовал подход с RegEx, чтобы дать вам больше гибкости в будущем, если это необходимо:


Sub LoopCellFormat()

For Each cell In RNG
cell.Value = StandardPar(Cell.Value)
Next cell

End Sub

Function StandardPar(ByVal txt As String) As String
 Dim m As Object
 txt = LCase(txt)

 txt = Application.Replace(txt, 1, 1, UCase(Left$(txt, 1)))
 Debug.Print txt

 With CreateObject("VBScript.RegExp")
 .Pattern = "[!\?\.][\s\n\r]+."
 .Global = True
 For Each m In .Execute(txt)

 txt = Application.Replace(txt, m.FirstIndex + 1, m.Length, UCase(m.Value))

 Next

 End With
 StandardPar = txt

End Function

Чтобы использовать RegEx, вы должны установить ссылку в редакторе VBA:

enter image description here

0 голосов
/ 09 марта 2020

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

Sub ParagraphsCapitalize()

    Dim p&, s$

    s = [a1]

    p = InStr(s, vbLf)
    If p Then Mid(s, p + 1, 1) = UCase(Mid(s, p + 1, 1))

    Debug.Print s

End Sub

Здесь я уточнил это для вас ...

Sub Test()

    MsgBox ParagraphCaps([a1])

End Sub



Function ParagraphCaps$(s$)

    Dim p&
    Do
        p = InStr(p + 1, s, vbLf)
        If p Then Mid(s, p + 1, 1) = UCase(Mid(s, p + 1, 1))
    Loop While p
    Mid(s, 1, 1) = UCase(Mid(s, 1, 1))

    ParagraphCaps = s

End Function
...