既出と思いますが、お願いします。
全角、半角がまじったデータで全角1文字も「1」とカウントする方法って
ありますか?
「おおおお99い」 の場合、99のみ半角で、あとは全角なんですが、
カウント文字数は7にしたいんです、
また、改行コードも1文字としてカウントしたいんです。
どうすればいいでしょうか?
LEN,LENbではできませんでした。
> 既出と思いますが、お願いします。
んー、既出の可能性が高いと思うのならば、先に検索してみた方がいいかと思いますけど…^^;
とりあえず下記トピックを参考にしてください。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200311/03110098.txt
きちんとカウントできると思うのですが。
Dim MyString As String
Dim MyLen As Integer
MyString = "おおおお99い"
MyLen = Len(MyString)
Debug.Print MyLen 'MyLen = 7
MyString = "おおおお99い" & vbCrLf
MyLen = Len(MyString)
Debug.Print MyLen 'MyLen = 9
Len 関数で「おおおお99い」は、ちゃんと7になりますけど。
>改行コードも1文字としてカウントしたいんです。
これは普通には無理ですので、そういう風にロジックを書かないと。
SJISなどのDBCSでは2バイト文字と1バイト文字がありますが、
VBは基本的に内部UNICODEで動作しています。
UNICODEは1文字が2バイトで表現されます。
したがって、サンプルの「おおおお99い」は
Len("おおおお99い") = 7
LenB("おおおお99い") = 14
となります。
#ちなみに、SJISで扱う場合は一旦StrConv関数で変換して、
Len(StrConv("おおおお99い", vbFromUnicode)) = 6
LenB(StrConv("おおおお99い", vbFromUnicode)) = 12
となります。
改行コードについては、通常vbCrLfが使われますが、
これは vbCr と vbLf を連結したものですので、
2文字=4バイトで表現されています。
(Excelのセル内文字列やXMLストリームなど、vbLfを改行コードとして
認識する処理系もあるので注意が必要です。)
Len(vbCrLf) = 2
LenB(vbCrLf) = 4
上に書いたような理由で、
1.与えられた文字列に対してLen関数で総文字列数を取得
2.与えられた文字列中のvbCrLfをカウント
3.総文字列数からvbCrLfの個数を引く
という処理で文字数を算出できますが。
ついでに空白とかタブとか無視したい場合は2.を拡張すればOKです。