はじめて利用させていただきます。
早速ですが、ご質問させていただきます。
if [特定の文字列(変数)の30バイト目が全角文字(30,31を跨ぐ文字)だったら]then
処理
else if [特定の文字列(変数)の30バイト目が半角文字だったら]
処理
End If
という、全角の時と半角の時で処理を分けたいのですが、どう区別したらいいのか悩んでいます。
スマートにIf文で分けられる良い方法はないでしょうか?
1バイト単位で無いとだめですか?
1文字単位なら、
If LenB(StrConv(Mid$(Text1.Text, 30, 1), vbFromUnicode)) > 1 Then
MsgBox "全角です"
End If
LenBで1より大きければ全角!
1バイト単位なら、一度16進数に変換して判断するしか…
1バイトで1文字が表現されるのは、以下の範囲です。
&H00〜&H20、&H80:制御文字(空白やタブや改行などがここに含まれます)
&H21〜&H7Eの範囲:いわゆる英数字 (JIS X 0201 ローマ字)
&HA1〜&HDFの範囲:いわゆる半角カナ(JIS X0201 片仮名)
ここなんかが参考になると思います。
「キャラクターコード」
http://www.infonet.co.jp/ueyama/ip/binary/charcode.html
ShiftJISの場合、
全角文字の2バイト目のコードがとりうる範囲は、
1バイトで表現可能な領域とオーバラップしているため
先頭から1バイトずつ判断していかないとうまくいきません。
たとえば、
VBレスキュ-さんの、
http://www.bcap.co.jp/hanafusa/
⇒文字列処理関係
⇒⇒文字列を指定の幅にカット(漢字分断回避)
http://homepage2.nifty.com/Dee/
⇒VB,VBA,VBS,ACCESS情報屋 Tips
⇒⇒VisualBasic,VBA関係
⇒⇒⇒文字列をSJIS換算のバイト数で切断出力する関数
頭から1文字ずつチェックしていって30バイト目がどうなってるかを見れば良いと思います。
okuさん、だいさん、nanashiさん、お返事ありがとうございます。
参考にと提示していただいたHPを見たりいろいろと思考してみたのですが、やはり上手くいきません。
「頭から1文字ずつチェックしていって30バイト目がどうなってるか」
という処理をどのように記述すれば、
「文字列のXXバイト目が1バイトかどうか(半角かどうか)」
という判断ができるのでしょうか。
ここがどうしてもわかりません。
まァこんな感じであってるかなー?
Dim sBuff$, sData As String
Dim lCnt As Long
sData = "頭から1文字ずつチェックしていaって30バイト目がどうなってるか"
lCnt = 1
Do While (lCnt < 30)
sBuff = Left$(sData, 1)
sData = Mid$(sData, 2)
lCnt = lCnt + LenB(StrConv(sBuff, vbFromUnicode))
Loop
If lCnt = 30 Then
sBuff = Left$(sData, 1)
If LenB(StrConv(sBuff, vbFromUnicode)) = 2 Then
Debug.Print "全角"
Else
Debug.Print "半角"
End If
Else
Debug.Print "全角文字の2Byte目"
End If
もっと良いやり方が分かる方、フォローお願いします。
nanashiさん、再度のお返事ありがとうございます。
無事に判別をつけることができるようになりました。
本当にありがとうございました。
ツイート | ![]() |