【问题标题】:How do I capitalize the first letter in every paragraph when there are multiple paragraphs in a cell?当单元格中有多个段落时,如何将每个段落中的第一个字母大写?
【发布时间】:2020-06-21 16:53:45
【问题描述】:

所以我有列表,其中每行中的一个单元格将包含一个段落或多个段落。我需要将这些标准化,以便它们在句子中。我已经构建了一些代码来执行此操作,如果只有一个段落,它就可以工作,但是当单元格中有多个段落或换行符时,它无法将第一个字母大写。我尝试使用换行符本身作为变量进行查找和替换,但这不起作用,我被卡住了。

我的大部分代码都将整个选定范围转换为 Lcase,然后进行一系列查找和替换,以使每个句子的第一个字母大写。

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

我浏览了整个字母表,而不是用“!a”和“~?a”再做一遍

但如果前一段和新段落之间有换行符,则此技术将不起作用。

完成后,我使用范围选择将每个单元格中的第一个字母大写,但我不确定这有多相关。

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

再次感谢 Scott Craner 的回答!

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

这解决了我的问题!

【问题讨论】:

  • 你试过StrConv(string,vbProperCase)吗?
  • 请用 Excel 单元格中的“段落”定义您理解的内容。该特定单元格上的新行?按Alt+Enter后获得?
  • What:= Chr(10) & "a"
  • 斯科特·克兰纳,这成功了!非常感谢!

标签: excel vba replace capitalization capitalize


【解决方案1】:

如果需要,我会尝试使用 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 编辑器中设置引用:

【讨论】:

  • 哇,这真的很好用。我不确定正则表达式是如何工作的或它在做什么,但这绝对是功能性的。
【解决方案2】:

请试试这个代码:

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

【讨论】:

  • 我担心这会一直卡在“运行时错误 5:无效的过程或参数”这部分它是这样做的 strProp = strProp & vbLf & UCase(Left(El, 1)) & 右(El, Len(El) - 1)
  • 当您将光标移到变量上时,El 变量会显示什么值,然后代码在出错时停止?字符串末尾是否可以有 vbLf 后跟任何内容?我的意思是,您按 Alt + Enter 并没有输入任何字符串...
  • @MRDoubleyou:我修改了代码以也接受这种情况(空行段落)。请刷新页面并重试代码。
  • 好的。之前没想到,会出现这种空段落的情况……很高兴能帮到你!但是,如果它回答了您的问题,勾选代码左侧的复选框将使其成为接受的答案。这样,如果其他人寻找类似的解决方案,他就会知道哪个答案被接受了......
【解决方案3】:

这应该会让你走上正轨。对于此示例,单元格 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

【讨论】:

  • 我能够得到你放在这里的充实版本,但是当我试图将它添加到我现有的代码中时,它什么也没做?
  • 如果您将 Excel 工作簿通过电子邮件发送给我,我会帮您完成:daniel.ferry@gmail.com
  • 请选择一个答案。
猜你喜欢
  • 2018-03-06
  • 2013-08-13
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多