我一直在谷歌上一页一页地浏览,在这里寻找这个看似简单的请求的解决方案,但无济于事。有没有人知道使用vba将字符串转换为句子的可靠方法?
理想情况下,我会将其构建为子而不是函数,因此从GUI调用更容易。
供参考,我希望:
这里是一个长期,极端的高级句子。请立即修改我。
成为:
这是一个冗长,丑陋的大写句子。请立即修改我。
转换为标题案例我发现非常简单(因为有一个内置函数),但事实证明转换为句子确实非常困难。
我尝试了以下一些方法,但每次都会出现错误:
我怎样才能让它发挥作用?
答案 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