[三流君] −−> [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でした。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.040を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・