[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.040 Len関数で遊ぶ、遊ばれる

Len関数で遊ぶ、遊ばれる

メルマガ発行内容

<Len関数で遊ぶ、遊ばれる>

こんにちは、三流プログラマーKen3です。 今回は、 Len関数で遊ぶ、遊ばれる です。 気楽に読んでください。 /* * 1.文字列を囲う処理で、問題あり */ 下記のような ┌──────────┐ │文字列を囲ってみたい│ └──────────┘ なんて、文字列を作る処理の説明を [No.34 ┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい] でやりました。覚えてますか? で、問題があって、 ^^^^^^^^^^^^^^^^^^ 半角のABCを入れると ┌───────────┐ │半角のABCを入れると│ └───────────┘ と変換されてしまいます。 原因が、半角文字なので、 前回の[No.39 StrConv関数で半角を全角文字にしてみた] では、安易にStrConv関数を使用して、半角文字を全角文字に強制的に直しました。 こんな修正してると、読者離れを起すと危機感(ホントか?)を持った三流作者が 今回、Len関数と格闘して?修正してみたいと思います。 /* * 2.Len関数の単体テスト */ 文字数を数えるLen関数かぁ、ここで半角文字をうまく処理したいなぁ。 VBAの編集画面で、CTRL+Gを押して、 イミディエイト ウインドウ(舌かんだ、じゃなくって指ツッタ)を表示させて、 軽く関数のテストをするか。 (イミディエイトの説明は--> http://www.ken3.org/vba/iwind.html 参照) a = "VBAで楽しく" ? a VBAで楽しく ? len(a) 7 あれ?7が返ってくるね。(Len関数は文字数を返すから普通だろ驚くなよ) ヘルプ見ると、 指定した文字列の文字数または指定した変数に必要なバイト数 を表す長整数型 (Long) の値を返します。 う〜ん、、、あっ、ヘルプのメモを見ると メモ 文字列をバイト データとして扱う場合は、LenB 関数を使用します。 LenB 関数は、指定した文字列のバイト数を返します。 おっ、このLenBって使えそうですね。 ? lenb(a) 14 なんだよ、 思った数値半角の3文字(VBA)と全角の4文字(で楽しく) で11(3+8で)ってだしてよ。。。 そのままじゃ使えないんだよね。 何でだよコラ。オイ黙ってないで答えろよ、 偉そうにしやがって。 ~~~~~~~~~~~~~~~~~~ VBA Len関数で得意のhttp://www.google.co.jp/で検索すると、 すぐに役立つエクセルVBAマクロ集 FAQ ... http://www.asahi-net.or.jp/~zn3y-ngi/YNxv9872.html これにズハリ回答が載ってるよね。 ユニコードかぁVBAと半角でも6ってことか、 LenBを使う前に、UniCodeから戻してから数えるために、 StrConv関数を使ってと、 変換モードにvbFromUnicodeってあるので、 (文字列を Unicode からシステムの既定のコード ページに変換) ? LenB(StrConv("VBAで楽しく", vbFromUnicode)) 11 おっ、これでなんとかなりそうですね。 /* * 3.関数の単体確認が終わったので組みこむ */ やっと、単体の確認が終わったので、組み込みますか。 ? LenB(StrConv("VBAで楽しく", vbFromUnicode)) 11 と半角換算した数が求められるから、 修正点としては、 ・全角の横棒を引いてるループカウンタの修正 ・"VBAで楽しく"みたいに半角文字が奇数だったら"VBAで楽しく "とスペース調整 ですね。 Private Sub btnCONV_Click() Dim i As Integer Dim strLINE1 As String '1行目 Dim strLINE2 As String '2行目 Dim strLINE3 As String '3行目 Dim nBCNT As Integer '文字列の半角換算数 vba040で追加 'vba040で半角文字を想定して追加 nBCNT = LenB(StrConv(txtMOTO, vbFromUnicode)) 'バイト数を計算 If (nBCNT Mod 2) = 1 Then 'Mod演算子で2で割った余りが1か判断 txtMOTO = txtMOTO & " " 'スペースを1つ追加 nBCNT = nBCNT + 1 '文字数も増やす End If '1行目を作る strLINE1 = "┌" '初めに左上端を代入 For i = 1 To nBCNT / 2 '全角─なのでバイト数/2をカウンタ strLINE1 = strLINE1 & "─" Next i strLINE1 = strLINE1 & "┐" '右上端を付ける '2行目を作る strLINE2 = "│" & txtMOTO & "│" '両端に│を付ける '3行目を作る strLINE3 = "└" '初めに左下端を代入 For i = 1 To nBCNT / 2 '全角─なのでバイト数/2をカウンタ strLINE3 = strLINE3 & "─" Next i strLINE3 = strLINE3 & "┘" '右下端を付ける '結果の代入 各ラインをvbCrLFでつなげただけ txtSAKI = strLINE1 & vbCrLf & strLINE2 & vbCrLf & strLINE3 End Sub こんな感じで修正しました。 ポイントは、 ^^^^^^^^^^^ Dim nBCNT As Integer '文字列の半角換算数 vba040で追加 カウンターの変数を追加して、 'vba040で半角文字を想定して追加 nBCNT = LenB(StrConv(txtMOTO, vbFromUnicode)) 'バイト数を計算 テキストボックスtxtMOTOの半角換算したバイト数を計算して、 If (nBCNT Mod 2) = 1 Then 'Mod演算子で2で割った余りが1か判断 txtMOTO = txtMOTO & " " 'スペースを1つ追加 nBCNT = nBCNT + 1 '文字数も増やす End If MOD演算子で、2で割った余りが1か?奇数か?と判断し、 奇数だったら、半角スペースを+して(横棒が全角なので) 忘れないで文字数も増やします。 For i = 1 To nBCNT / 2 '全角─なのでバイト数/2をカウンタ は、 nBCNTは半角換算の数なので、/2で調整してます。 こんな感じで修正しました。 一番のポイントは、関数の単体テストでクリアした、 nBCNT = LenB(StrConv(txtMOTO, vbFromUnicode)) 'バイト数を計算 ですね。 /* * 4.おわりの挨拶 */ 今回は、長くヒッパッタケド、 ・LenB(StrConv(txtMOTO, vbFromUnicode)) の一言かなぁ。 ネットで検索しただけって説もあるけどね。。。ギク。。。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba040.lzh に test040-book.xlsが保存されています。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]