使用VBA转换为句子案例

时间:2012-06-11 10:39:46

标签: excel vba excel-vba

我一直在谷歌上一页一页地浏览,在这里寻找这个看似简单的请求的解决方案,但无济于事。有没有人知道使用将字符串转换为句子的可靠方法?

理想情况下,我会将其构建为子而不是函数,因此从GUI调用更容易。

供参考,我希望:

  

这里是一个长期,极端的高级句子。请立即修改我。

成为:

  

这是一个冗长,丑陋的大写句子。请立即修改我。

转换为标题案例我发现非常简单(因为有一个内置函数),但事实证明转换为句子确实非常困难。

我尝试了以下一些方法,但每次都会出现错误:

我怎样才能让它发挥作用?

3 个答案:

答案 0 :(得分:7)

您可以使用RegExp更有效地运行解析

像这样的东西

Sub Tested()
    Call ProperCaps("HERE IS A LONG, UGLY UPPERCASE SENTENCE. PLEASE AMEND ME IMMEDIATELY." & vbCrLf & "next line! now")
End Sub

Function ProperCaps(strIn As String) As String
    Dim objRegex As Object
    Dim objRegMC As Object
    Dim objRegM As Object
    Set objRegex = CreateObject("vbscript.regexp")
    strIn = LCase$(strIn)
    With objRegex
        .Global = True
        .ignoreCase = True
         .Pattern = "(^|[\.\?\!\r\t]\s?)([a-z])"
        If .test(strIn) Then
            Set objRegMC = .Execute(strIn)
            For Each objRegM In objRegMC
                Mid$(strIn, objRegM.firstindex + 1, objRegM.Length) = UCase$(objRegM)
            Next
        End If
        MsgBox strIn
    End With
End Function

答案 1 :(得分:1)

感谢您提供有用的代码。为什么VB有适当的情况而不是句子的情况很奇怪。为了我的目的,我已经调整了它,因为如果前面有空格,原版不会把第一个字母大写,希望你不要介意我分享我的一些变化。

为了删除句子开头或结尾的任何不需要的空格,我添加了另一个从上面调用的函数。

Public Function DblTrim(vString As String) As String
Dim tempString As String
tempString = vString

Do Until Left(tempString, 1) <> " "
   tempString = LTrim(tempString)
Loop
Do Until Right(tempString, 1) <> " "
   tempString = RTrim(tempString)
Loop

DblTrim = tempString

End Function

Public Function ProperCaps(strIn As String) As String
    Dim objRegex As Object
    Dim objRegMC As Object
    Dim objRegM As Object
    Set objRegex = CreateObject("vbscript.regexp")
    strIn = DblTrim(strIn)
    strIn = LCase$(strIn)

    With objRegex
        .Global = True
        .ignoreCase = True
         .Pattern = "(^|[\.\?\!\r\t]\s?)([a-z])"
        If .test(strIn) Then
            Set objRegMC = .Execute(strIn)
            For Each objRegM In objRegMC
                Mid$(strIn, objRegM.firstindex + 1, objRegM.Length) = UCase$(objRegM)
            Next
        End If
        ProperCaps = strIn
    End With
End Function

您可以调用ProperCaps(Yourstring)以第一个字母为首字母,并删除所有空格。

您也可以使用DblTrim(Yourstring)删除字符串前后的所有空格(不改变句子大小写),无论有多少空格。

答案 2 :(得分:0)

我知道这是一篇旧帖子,只是一段使用内置函数的简短代码,供某人参考(这是不言自明的)。 要删除多余的空格,请根据需要使用修剪功能将整个文本换行。

Public Function SentenceCase(Text As String) As String
    SentenceCase = UCase(Mid(Text, 1, 1)) & LCase(Mid(Text, 2))
End Function