6

私はグーグルでページを次々と探し回っていて、ここでこの一見単純な要求に対する解決策を探していましたが、役に立ちませんでした。を使用して文字列を文の大文字小文字に変換する信頼できる方法を知っている人はいますか?

理想的には、関数ではなくサブに組み込むので、GUIから呼び出す方が簡単です。

参考までに、私は欲しいと思います:

ここに長くて醜い大文字の文があります。すぐに修正してください。

になる:

これは長くて醜い大文字の文です。すぐに修正してください。

タイトルケースへの変換非常に簡単であることがわかりましたが(そのための組み込み関数があるため)、センテンスケースへの変換は実際に非常に難しいことが証明されています。

私は次の方法のいくつかを試しましたが、毎回エラーが発生します。

どうすればこれを機能させることができますか?

4

3 に答える 3

8

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
于 2012-06-12T10:20:40.140 に答える
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)を使用して、スペースの数に関係なく、文字列の前後のすべてのスペースを(文の大文字と小文字を変更せずに)削除することもできます。

于 2017-02-28T13:15:47.663 に答える
0

私はそれが古い投稿であることを知っています、誰かのための組み込み関数を使用した短いコードが参照するかもしれません(それは自明です)。余分なスペースを削除するには、必要に応じてテキスト全体をトリム機能で折り返します。

Public Function SentenceCase(Text As String) As String
    SentenceCase = UCase(Mid(Text, 1, 1)) & LCase(Mid(Text, 2))
End Function
于 2021-06-30T11:54:44.577 に答える