2012-06-11 46 views
6

我已经通过网页拖网对谷歌页面后,在这里寻找一个解决方案,这个看似简单的请求判情况,但无济于事。有谁知道使用将字符串转换为句子的可靠方法吗?转换使用VBA

理想我将建立它变成一分,而不是一个功能,因此更容易从GUI调用。

仅供参考,我会想:

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

成为:

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

转换为标题案例我发现非常简单(因为有一个内置的功能),但转换为句子案件确实证明确实很难。

我曾尝试使用以下一些方法,但拿出的错误动不动:

我怎样才能得到这个工作?

+1

你给按预期工作的第一个环节。 –

+1

对不起,它的确如此。我本质上是错误的。解决了一个sub:'Sub ConvertToSentenceCase()ActiveCell = SentenceCase(ActiveCell)End Sub' – seegoon

+3

你应该发布这个答案(并接受它),以便其他人可以看到你的问题已经解决了(以及你如何解决它),甚至如果你自己解决它。 :-) – JimmyPena

回答

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很好的使用RegExp。由于它不会大写首字母,因此需要稍微调整。 –

+0

@SiddharthRout thx Sid。作出更新 – brettdj

+1

这是一个绝对的梦想。 – seegoon

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) 

    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)除去前部和字符串后面的所有空格(不改变句子的情况下),不管有多少空间是有的。