RDHS によってコードを最適化するために、文字列の大文字バージョンを維持する必要はありません。これは可能な限り最適化されていると思います。
コード 1:
Private Function RandomCaps(s As String) As String
Dim i As Long
RandomCaps = LCase$(s)
For i = 1 To Len(s)
If Rnd < 0.5 Then
Mid(RandomCaps, i, 1) = UCase(Mid(RandomCaps, i, 1))
End If
Next i
End Function
上記のコードは優れていますが、非常に大きな文字列の場合は、これを試してみてください (RDHS のコードに対するパフォーマンスはテストされていません)。
コード 2:
Private Function RandomCaps(s As String) As String
Dim b() As Byte
b = StrConv(Text1.Text, vbFromUnicode)
Dim i As Long
For i = 0 To UBound(b) - 1
If Rnd < 0.5 Then
If UCase(Chr(b(i))) = Chr(b(i)) Then
'original char is uppercase, make it lowercase
b(i) = Asc(LCase(Chr(b(i))))
Else
'original char is lowercase, make it uppercase
b(i) = Asc(UCase(Chr(b(i))))
End If
End If
Next i
RandomCaps = StrConv(b, vbUnicode)
End Function
編集:
いくつかのパフォーマンス テストを行いましたが、上記の 2 つのコードの違いはごくわずかです。2 番目のコード ブロックは、最初のコード ブロックよりも約 1% 高速です。
編集2:
以前の編集は無視してください。コード 2 はコード 1 よりも約 50% 効率が低くなります。ただし、RDHS が示唆するように、コード 2 を調整して、CHR と ASC を行き来する代わりに値を比較しました。約 40 文字の入力文字列から開始する方が効率的です。長いです。入力文字列が長いほど、コード 3 のパフォーマンスが向上します。入力文字列の長さが 944640 文字の場合、コード 3 はコード 1 よりも 57% 高速です。
統計: 最初の列は入力文字列の長さ (文字単位)、2 番目の列はコード 2 と比較したコード 3 の効率です。ご覧のとおり、文字列の長さが 5 文字の場合、コード 2 は 46% 効率的です。文字列の長さが 40 前後から始まると、コード 3 はますます効率的になります。
5 -46.80%
50 6.22%
100 21.50%
500 38.54%
1000 41.11%
10000 44.87%
100000 43.25%
1260000 43.02%
コード 3:
Private Function RandomCaps(s As String) As String
Dim b() As Byte
b = StrConv(Text1.Text, vbFromUnicode)
Dim i As Long
For i = 0 To UBound(b) - 1
If Rnd < 0.5 Then
If b(i) >= 64 And b(i) <= 90 Then
'A to Z
b(i) = b(i) + 32
ElseIf b(i) >= 97 And b(i) <= 122 Then
'a to z
b(i) = b(i) - 32
Else
'everything else
End If
End If
Next i
RandomCaps = StrConv(b, vbUnicode)
End Function