2015-07-01 48 views
0

以下是由其他人修改將文本更改爲判例(大寫的每個句子的第一個字母)的功能。該函數很好地工作,除了不使第一個字的第一個字母大寫。另一個問題是,如果一個句子全部輸入大寫,該函數什麼都不做。我正在尋找一些幫助來調整功能來糾正這些問題。Excel VBA判刑案件功能需要微調

Option Explicit 
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 
End With 

ProperCaps = strIn 
End Function 

感謝, 加里

+0

這從您的語句似乎是矛盾的:「該功能很好地工作,除了它不大寫第一個單詞的第一個字母」是不是「把第一個字的第一個字母大寫」與「大寫的每個句子的第一個字母」相同?如果它無法執行預期的基本操作,它如何能很好地工作? – David

+0

好吧,它確實有一些缺陷,我正在尋求幫助來糾正它。你能幫我嗎? – zoom38

回答

1

我改名的功能SentenceCase(),並做了一些調整:


Public Function SentenceCase(ByVal str As String) As String 
    Dim regEx As Object, regExM As Object, indx As Object, indxs As Object 
    Set regEx = CreateObject("VBScript.RegExp") 
    str = Replace$(str, vbNullChar, vbLf) 
    str = Replace$(str, vbBack, vbLf) 
    str = LTrim$(LCase$(str)) 
    With regEx 
     .IgnoreCase = True 
     .MultiLine = True 
     .Global = True 
     .Pattern = "(^|[\n\f\r\t\v\.\!\?]\s*)(\w)" 
     If .Test(str) Then 
      Set indxs = .Execute(str) 
      For Each indx In indxs 
       Mid$(str, indx.FirstIndex + 1, indx.Length) = UCase$(indx) 
      Next 
     End If 
    End With 
    SentenceCase = str 
End Function 

這是我測試過:

MsgBox SentenceCase(" UPPER CASE SENTENCE." & _ 
        vbCrLf & "next line!nEXT sENTENCE" & _ 
        vbCr & "cr ! lower case" & _ 
        vbLf & "lf .new sentence" & _ 
        vbNullChar & " null?null char" & _ 
        vbNullString & "nullString spaces" & _ 
        vbTab & "TAB CHAR.ttt" & _ 
        vbBack & "back? back char" & _ 
        vbFormFeed & "ff ff words" & _ 
        vbVerticalTab & "vertical tab.| lower .case words") 

結果:

test 1

test 2

test 3

你可以在這裏找到更多的細節:Microsoft - Regular Expressions

+0

保羅它仍然沒有大寫第一句的第一個字母。 – zoom38

+0

@ zoom38讓我知道如果這不起作用 –

+0

我做了一些測試,並提出了另一個問題。您的新代碼大寫第一個句子的第一個字母,但只在消息框中不在單元格本身中。您的新代碼還會將每行的首字母大寫,而不管它是否是句首。 – zoom38

0

保羅感謝您抽出寶貴時間來幫助。我放棄了,並搜查了淨多一些發現一個可行子,從另一個公告板獲得了幫助,並與下面上來:

Sub SentenceCase(rng As Range) 
Dim V  As Variant 
Dim s  As String 
Dim Start As Boolean 
Dim i  As Long 
Dim ch  As String 

Application.ScreenUpdating = False 
Application.EnableEvents = False 
ActiveSheet.Unprotect 

With rng 
    V = .Value 
    If IsDate(V) Or IsNumeric(V) Then Exit Sub 
    s = CStr(V) 
    Start = True 

    For i = 1 To Len(s) 
     ch = Mid$(s, i, 1) 
     Select Case ch 
     Case "." 
      Start = True 
     Case "?" 
      Start = True 
     Case "!" 
      Start = True 
     Case "a" To "z" 
      If Start Then ch = UCase$(ch) 
      Start = False 
     Case "A" To "Z" 
      If Start Then 
       Start = False 
      Else 
       ch = LCase$(ch) 
      End If 
     End Select 
     Mid$(s, i, 1) = ch 
    Next i 
    .Value = s 
End With 

ActiveSheet.Protect 
Application.ScreenUpdating = True 
Application.EnableEvents = True 

末次

這段代碼是做什麼,我需要。再次感謝您的幫助。

加里