愚者の経験

「また今度」はほとんどこない

日別アーカイブ: 11月 26, 2011

半角1、全角2の大きさで切り取るLeft関数

参考:Access Tips by pPoy様のページにある
「半角は1、全角は2として文字列の先頭から見かけのバイト数で切り取る関数」
最近このような関数が必要になる機会が多いので自分流にアレンジしました。
実行速度を追求にしたかったのでその部分は改良(デグレード?)してあります。

Access Tips by pPoy様は一文字ずつStrConvでAscii変換しつつ文字数を数えていますが
私の方はByte配列に文字列全体をAscii変換で代入します。
また、最後にスペース埋めをする処理が追加されています。

標準モジュールなどに貼付けてください。

Public Enum FillOperationEnum
RightFill
LeftFill
NotFill
End Enum

Public Function exLeft(Value As Variant, Length As Long, Optional Operation As FillOperationEnum = NotFill) As String
On Error GoTo exit1
Dim Temp() As Byte
Dim SpaceCount As Long

If Nz(Value, “”) = “” Then Exit Function

Temp = StrConv(Value, vbFromUnicode)

ReDim Preserve Temp(Length – 1)
exLeft = StrConv(Temp, vbUnicode)
SpaceCount = InStr(exLeft, Chr(0))

If SpaceCount > 0 Then
SpaceCount = Len(exLeft) – (SpaceCount – 1)
exLeft = Left$(exLeft, Len(exLeft) – SpaceCount)
Else
If Mid$(Value, Len(exLeft), 1) Right$(exLeft, 1) Then
exLeft = Left$(exLeft, Len(exLeft) – 1)
SpaceCount = 1
End If
End If

If Operation NotFill Then
If Operation = LeftFill Then
exLeft = Space$(SpaceCount) & exLeft
Else
exLeft = exLeft & Space$(SpaceCount)
End If
End If

Erase Temp
Exit Function
exit1:
exLeft = “”
End Function

実行結果は以下のようになります。
exLeft(“aaaああ”, 5) → aaaあ
exLeft(“aaaああ”, 6) → aaaあ(文字の途中で切れる場合は1バイト小さくします。)
exLeft(“aaaああ”, 9, LeftFill) →   aaaああ(Space(2) & “aaaああ”)
exLeft(“aaaああ”, 9, RightFill) → aaaああ  (”aaaああ” & Space(2))

ループしないように作ってありますので若干スピートが出ると期待してます。
検証が不十分なのでこれから色々やってみます。(特に文字切れを起こす場合のあたりが心配です。)