全角文字の数え方


全角文字の数え方  2004-02-16 17:39:39  No: 82060  IP: [192.*.*.*]

既出と思いますが、お願いします。
全角、半角がまじったデータで全角1文字も「1」とカウントする方法って
ありますか?
「おおおお99い」  の場合、99のみ半角で、あとは全角なんですが、
カウント文字数は7にしたいんです、
また、改行コードも1文字としてカウントしたいんです。
どうすればいいでしょうか?
LEN,LENbではできませんでした。

編集 削除
たかみちえ  URL  2004-02-16 17:46:36  No: 82061  IP: [192.*.*.*]

> 既出と思いますが、お願いします。
  んー、既出の可能性が高いと思うのならば、先に検索してみた方がいいかと思いますけど…^^;

  とりあえず下記トピックを参考にしてください。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200311/03110098.txt

編集 削除
しゅう  2004-02-16 23:00:29  No: 82062  IP: [192.*.*.*]

きちんとカウントできると思うのですが。

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

編集 削除
oku  URL  2004-02-16 23:43:26  No: 82063  IP: [192.*.*.*]

Len 関数で「おおおお99い」は、ちゃんと7になりますけど。
>改行コードも1文字としてカウントしたいんです。
これは普通には無理ですので、そういう風にロジックを書かないと。

編集 削除
Kaz  2004-02-19 00:29:57  No: 82064  IP: [192.*.*.*]

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です。

編集 削除