Lenbについて苦戦しております。
いくつか質問を小出しにして、1つずつ解決していきたいと思っています。すみませんが、宜しくお願いいたします。
「txt元テキスト」に以下文章が入っています。
このページの下の「新しいトピックを作る」ボタンをクリックして質問を入力してください。あるいは下記のリンクをクリックしてください。
●「txtテキスト長さ」を作成し、コントロールソースに
=LenB([元テキスト])
と入れて表示すると128byteと表示される。
これを半角化します。
Private Sub btn半角化_Click()
Me.Refresh
txt変更テキスト = StrConv([元テキスト], 8)
Me.Refresh
End Sub
このページの下の「新しいトピックを作る」ボタンをクリックして質問を入力してください。あるいは下記のリンクをクリックしてください。
●「テキスト長さ2」を作成し、
コントロールソースに
=LenB([変更テキスト])
と入れると136byteと表示される。
半角化したあとのバイト数がおかしい???これが1つ目の疑問です。
もしや濁点なども1とカウントされているのでしょうか。
Excelでは「107」とカウントされます。そちらにあわせたいのですが…。
Len 関数
その文字に何バイト使うか?というのは文字コードに依存します。(LenB関数の埒外)
String Data Type (Visual Basic)
VBAで文字を扱おうとすると基本、Unicodeで扱われます。Unicodeは半角、全角関係なく1文字を2バイトで表現する文字コードです。
半角カナ
いろいろあって、濁音や半濁音を表すときは2文字使うというのが現在です。
以上のことから質問の、
の例では4文字×2バイト増えた数字が表示されるのです。
半角1文字を1、全角1文字を2とカウントするためには、そう表現する文字コードに変換してLenB()を使う必要があります。最初のリンク先にある通り
のような処理をさせます。
ありがとうございます。とても参考になったのですが、うまく行きません。
すみません。書きかけでエンターを押してしまいました。
下記コードで半角化すると文字化けしますが、こちらは今までどおりの式にして
カウントだけ変更すればよいでしょうか、今から試してみます。
半角化じゃなかった、文字コードの変更をすると文字化け、の間違いです。スミマセン。
下記コードで半角化&文字数を表示することができました!
ありがとうございました。
次の質問なのですが、現在ボタンを2回押さないと反映できません。
(それを解消できるかと思って「Me.Refresh」を2回入れているのですが・・だめでした)
1回で反映できる方法はありますでしょうか。
フォームは連結ですか、非連結ですか。
一応、非連結で下記のようなサンプルを作成して確認してみましたが、ボタン1回クリックで表示されました。
テキストボックス
コマンドボタン
連結にしていましたが、[元テキスト]⇒txt元テキスト ・・・等々変更したら1回で表示されるようになりました。教えていただきありがとうございました。
もう1つの質問を記載させていただきます。
現在以下のように、[テキスト]の文章を20バイトで区切ってテキストボックスで3つに分けるという処理をしています。
このとき、うまく20バイトずつ文章が分かれてくれたらいいのですが
全角と半角が混ざった文章だと、文字化けしたり21バイトになったりします。
20バイト以下で、文字化けせずにうまくわけることはできませんでしょうか。
以上、ご検討いただければ幸いです。宜しくお願い致します。
この件ですが、21バイトだった場合19バイトで切り出したらいいですね・・
式を考え中ですが、また相談させていただくと思います。すみません。
5の質問について、解決法がわかれば助かります。
全角、半角に関しては、いろいろ複雑な事情があります。
とりあえず下記を参照してください。
半角1桁全角2桁で計算するLenB、LeftB関数の代替関数 - hatena chips
VBA Unicode 文字の入力や変換、読み込みについて
Unicode文字(Shift-JISにない文字)、サロゲートぺー文字の扱いはどうするのかまずは決める必要があると思います。
ありがとうございます。教えていただいた関数を参考に考えていますが、
行き詰っています。
今回文章を何個かに分割したいので、midで作って繰り返しさせたいと思っていますがうまくいきません・・・
どこが間違っているのでしょうか。
(とりあえず汎用関数の部分のみ↓)
反映させる部分↓
お騒がせしております。
今気づいたのですが、
res = Mid$(S, M, Len(res))
が
res = Mid$(S, LenAnsiB(M), Len(res))
でしょうか。。
あとで試してみます。
Len(M)の間違いでした。。
あと、初心者で申し訳ないのですが、
$マークは、どういう意味があるのでしょうか?
全然違いますね。。
他も試してみたのですがやはりうまく行きません😓
とりあえずUnicodeのことは忘れて、次の例を考えます。
この場合、たとえば
Midh(str, a, b)
のような関数を作ったとしてMidh("あイうエお", 5, 3)
としたとき、「う」はどう扱ったらいいでしょうか?半角を1、全角を2とカウントするようなMidのような関数は現実的ではないでしょう
このようなことをする場合は、すべての文字をひとくくりに考える必要があります
半角を含む文字列を処理する関数「splith()」
テストコード
出力結果
大変悩んでいたので本当に助かります。
じっくり内容を確認し、勉強させていただきます!!本当にうれしいです。
ありがとうございます。
更に初心者の質問で申し訳ありません。
Debug.Print strSplit(sCount)
の部分についてですが、テキストボックスに1個ずつ格納していきたいと思っています。
テキストボックス名 txtB & scount + 1 として
txtB & sCount + 1 = strSplit(sCount)
というのは、不可能のようですね。。
変数名のカウントアップはどうしたらよいのでしょうか。
txtB
は「txtB」という名前のコントロール(またはフィールド)そのものを参照します。コントロール名を動的に生成して参照するなら、文字列を受け取ってコントロールを参照するようなアクションを使う必要がありますそれと、計算順の問題で数値部分は先に計算させる(括弧で囲む)必要がありますね
バッチリうまくいきました。ありがとうございます😊