2009年06月27日

バイト数を用いる文字列関数

VB や VBA の文字列関数である Left、Len、Mid、Right は全角文字でも半角文字でも 1文字と計算されてしまいます。

昔のように(?)、半角は 1バイト、全角は 2バイトとなる関数が欲しいと思ったことはないでしょうか?

例えば、全半角混在の固定長テキストファイルからある一部分(mバイト目から長さ nバイト)を切り出すようなことってありませんか?

StrConv関数を組み合わせているだけなんですが、通常の Left、Len、Mid、Right のような感覚で使える関数が欲しいと思って作成しました。

※全角途中指定時の補正を行う改造版を こちら に公開しています。

ascii_string.txt






' @(f)
'
' 機能 : ASCIIでのLeftB
'
' 返り値 : 文字列
'
' 引き数 : ARG1 - 文字列(Unicode)
' ARG2 - (ASCIIでの)文字列長
'
' 機能説明 : 文字列の左端からASCIIコードでのバイト数分の文字列を返す。
'
' 備考 :
'
Public Function pAsciiLeftB(ByVal strValue As String, _
ByVal intLength As Integer) As String
pAsciiLeftB = StrConv(LeftB(StrConv(strValue, vbFromUnicode), _
intLength), vbUnicode)
End Function

' @(f)
'
' 機能 : ASCIIバイト長取得
'
' 返り値 : バイト長
'
' 引き数 : ARG1 - 文字列(Unicode)
'
' 機能説明 : ASCIIコードでのバイト長を返す。
'
' 備考 :
'
Public Function pAsciiLenB(ByVal strValue As String) As Integer
pAsciiLenB = LenB(StrConv(strValue, vbFromUnicode))
End Function

' @(f)
'
' 機能 : ASCIIでのMidB
'
' 返り値 : 文字列
'
' 引き数 : ARG1 - 文字列(Unicode)
' ARG2 - (ASCIIでの)開始位置
' ARG3 - (ASCIIでの)文字列長(省略可)
'
' 機能説明 : 文字列のASCIIコードでの開始位置からバイト数分の文字列を返す。
'
' 備考 :
'
Public Function pAsciiMidB(ByVal strValue As String, _
ByVal intStart As Integer, _
Optional ByVal varLength As Variant) As String
If IsMissing(varLength) Then
pAsciiMidB = StrConv(MidB(StrConv(strValue, vbFromUnicode), _
intStart), vbUnicode)
Else
pAsciiMidB = StrConv(MidB(StrConv(strValue, vbFromUnicode), _
intStart, varLength), vbUnicode)
End If
End Function

' @(f)
'
' 機能 : ASCIIでのRightB
'
' 返り値 : 文字列
'
' 引き数 : ARG1 - 文字列(Unicode)
' ARG2 - (ASCIIでの)文字列長
'
' 機能説明 : 文字列の右端からASCIIコードでのバイト数分の文字列を返す。
'
' 備考 :
'
Public Function pAsciiRightB(ByVal strValue As String, _
ByVal intLength As Integer) As String
pAsciiRightB = StrConv(RightB(StrConv(strValue, vbFromUnicode), _
intLength), vbUnicode)
End Function
この記事へのコメント
ぜんこうさん

Windows API の GetWindowText から返される
半角全角混合テキストをMgsBoxにうまく表示する方法がわからなくて困っているときに、
こちらにたどり着きました。
おかげさまで、きれいに表示できるように
なりました。
素晴らしい関数を教えていただいてありがとうございました。

依田純一
Posted by 依田純一 at 2009年07月30日 13:28
依田さん、お役にたてて光栄です。
Posted by ぜんこう at 2009年07月30日 13:33
ぜんこうさん

ケントと申します。
ACCESSで 半角全角混在の固定長を
取り込む時、ズレがでてしまいネットでいろいろなキーワードで検索しヒットせず困ってました。

ぜんこうさんの関数を使ったら ズレずにインポートできました。

本当に助かりました。
ありがとうございます。

Posted by at 2009年11月07日 12:25
ケントさん
ちょっとしたことなんですが、お役にたてたようで良かったです(^^)
Posted by ぜんこう at 2009年11月07日 13:45
助かりました!
ありがとうございますm(__)m
Posted by Junkbond at 2012年06月02日 09:48
Junkbondさん(?)
なんや知らんけどお役に立てたみたいで (^^)
Posted by ぜんこう at 2012年06月02日 09:53
ぜんこう様

かじたと申します。

図々しいお願いなのですが、
以下のケースの回避方法はないでしょうか?

pAsciiLeftB,pAsciiRightBの文字列長が、
全角文字の途中の時に、
文字化けを起こしてしまいました。

pAsciiMidBの開始位置が
全角文字の後半1バイトの時、
文字列長が全角文字の途中の時にも、
うまくいきません。

何か良い方法はないでしょうか?


Posted by かじた at 2013年01月07日 22:03
かじたさん

お急ぎですか?(週末なら時間とって検討できるかも)

「midb 全角 途中」とかでぐぐってみてはいかがでしょうか!?
Posted by ぜんこう at 2013年01月08日 13:54
かじたさん

この記事にも書き足しましたが、改造版を作成してアップしてみました。
もう自己解決しちゃいましたか?
Posted by ぜんこう at 2013年01月13日 04:32
ぜんこう様

かじたです。
お返事遅くなり、失礼いたしました。

今回の作業に関しましては、
データ入力時の規制で回避しましたが、
改造版を作成いただき、感謝いたします
m(_ _)m

さっそく使わせていただきます!
ありがとうございました。
Posted by かじた at 2013年01月31日 13:48
かじたさん

使ってみて不具合などあれば、また教えて下さい。
Posted by ぜんこう at 2013年01月31日 14:04
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。