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にうまく表示する方法がわからなくて困っているときに、
こちらにたどり着きました。
おかげさまで、きれいに表示できるように
なりました。
素晴らしい関数を教えていただいてありがとうございました。
依田純一
ケントと申します。
ACCESSで 半角全角混在の固定長を
取り込む時、ズレがでてしまいネットでいろいろなキーワードで検索しヒットせず困ってました。
ぜんこうさんの関数を使ったら ズレずにインポートできました。
本当に助かりました。
ありがとうございます。
ちょっとしたことなんですが、お役にたてたようで良かったです(^^)
ありがとうございますm(__)m
なんや知らんけどお役に立てたみたいで (^^)
かじたと申します。
図々しいお願いなのですが、
以下のケースの回避方法はないでしょうか?
pAsciiLeftB,pAsciiRightBの文字列長が、
全角文字の途中の時に、
文字化けを起こしてしまいました。
pAsciiMidBの開始位置が
全角文字の後半1バイトの時、
文字列長が全角文字の途中の時にも、
うまくいきません。
何か良い方法はないでしょうか?
お急ぎですか?(週末なら時間とって検討できるかも)
「midb 全角 途中」とかでぐぐってみてはいかがでしょうか!?
この記事にも書き足しましたが、改造版を作成してアップしてみました。
もう自己解決しちゃいましたか?
かじたです。
お返事遅くなり、失礼いたしました。
今回の作業に関しましては、
データ入力時の規制で回避しましたが、
改造版を作成いただき、感謝いたします
m(_ _)m
さっそく使わせていただきます!
ありがとうございました。
使ってみて不具合などあれば、また教えて下さい。