愚者の経験

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

半角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))

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

半角1、全角2の大きさで切り取るLeft関数」への1件のフィードバック

  1. ピンバック:見かけの文字列長で切り取る[SQL Server] | 愚者の経験

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。