0

文字列を適切なケースで変換する VBA マクロを作成していますが、いくつかの制限があります。

冒頭のテキスト:

  1. DTest dk;G3Gj
  2. _dsc0148A
  3. 1陶器2
  4. Articiart147
  5. あなたがそれを必要としない場合
  6. 押された喜び
  7. オンザフロア

望ましい結果:

  1. Dtest Dk;G3gj
  2. _Dsc0148a
  3. 1陶器2
  4. Articiart147
  5. 必要ない場合
  6. 押された_喜び
  7. オンザフロア

試行 1:

Sub ChangePCase()
 rownum = 2
 colnum = 1

 ActiveSheet.Range("a2", ActiveSheet.Range("a2").End(xlDown)).Select

     For Each Cell In Selection
       mystr = Cells(rownum, colnum).value

        Text = WorksheetFunction.Proper(mystr)
        Cells(rownum, colnum + 1) = Text
        rownum = rownum + 1
     Next
End Sub

結果

  1. Dtest Dk;G3Gj
  2. _Dsc0148A
  3. 1陶器2
  4. Articiart147
  5. イフ・ユー・ドント・ニード・イット
  6. 押された_喜び
  7. オンザフロア

一部の文字は、数字または特殊文字の後に大文字になります。

特殊文字の後の文字を大文字にしないように制限する方法はありますが、単語の最初の文字が特殊文字の場合、2 番目の文字は 2 番目の数字として大文字にする必要があります。

試行 2:

私の他のコードはより良い結果をもたらしますが、特殊文字の後の単語の2番目の文字を大文字にしません。出力付きのコードは

Sub Propername()
rownum = 2
colnum = 1

ActiveSheet.Range("a2", ActiveSheet.Range("a2").End(xlDown)).Select

For Each Cell In Selection

 Text = Trim(StrConv(Cells(rownum, colnum).value, vbProperCase))
 Cells(rownum, colnum + 1) = Text
rownum = rownum + 1
Next
 End Sub

結果

  1. Dtest Dk;k3kj
  2. _dsc0148a
  3. 1陶器2
  4. Articiart147
  5. イフ・ユー・ドント・ニード・イット
  6. 押された喜び
  7. 床の上で

2 番目と 3 番目の 2 番目の文字は大文字ではありませんが、6 p の喜びも大文字ではありません。

4

3 に答える 3

1

この/は要件を満たしています

更新: Proper case 関数とアポストロフィの制限に対処するための修正を追加しました

Sub NotScared_butConfused()
Dim objRegex As Object
Dim objRegMC As Object
Dim objRegM As Object
Dim X
Dim lngCnt As Long

X = Range([a2], Cells(Rows.Count, "A").End(xlUp))
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Pattern = "([\_\-\$;:\s])+([a-z])"
.Global = True
For lngCnt = 1 To UBound(X)
X(lngCnt, 1) = Application.Proper(LCase$(X(lngCnt, 1)))
If .test(X(lngCnt, 1)) Then
Set objRegMC = .Execute(X(lngCnt, 1))
For Each regm In objRegMC
Mid$(X(lngCnt, 1), regm.firstindex + 2, 1) = UCase$(regm.submatches(1))
Next
End If
With Application
X(lngCnt, 1) = .Substitute(.Proper(.Substitute(X(lngCnt, 1), "'", "zyx")), "zyx", "'")
End With
Next
End With
If lngCnt > 1 Then [b2].Resize(UBound(X), 1) = X
End Sub
于 2013-07-08T12:20:17.167 に答える