[No.35 イベント処理について]
[No.36 オブジェクトのプロパティについて]
[No.37 オブジェクトのメソッドについて]
[No.38 キャラクタコード?って何? Chr関数、Asc関数]
[No.39 StrConv関数で半角を全角文字にしてみた]
www.ken3.org(サイト内)から Google を利用して、

三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー] [VBA系 TOP] [三流君 TOP]



No.35 2002/12/28
イベント処理について
[ページTOPへ戻る]

<イベント処理について>

こんにちは、三流プログラマーKen3です。 今回は、イベントについて軽く書きたいと思います。 気楽に読んでください。 /* * 1. イベントって?どんなイメージ? */ イベントって言うと、あっ、クリスマス・イブのイベントかぁ。 なんだか、よくわかんないなぁ、そんなイベント発生したか? 変なもてない男の話は置いといて。 システムを作るポイントとして、イベント処理があります。 パターンとして、なにかしらのイベントが発生したら、 それに対して、処理を行う、対応する動作のプログラムを書くような感じです。 人間の行動で言えば、 新人君、仕事しないで、ボーットしてる(指示待ち/イベント待ち) *まぁ、息すって、何かしら動作待ちしてますね。 会社の外線・内線が鳴る、、無視する(このイベントには反応しない) 自分の携帯が鳴る、2コール以内で反応、外に出て受け処理に入る (イベントに対する、処理がある) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 外線電話には、電話に出る処理が書いてないが(プログラムされてない?) 自分の携帯電話が鳴ったら、盗み聞きされないように外に出て、 電話を受ける処理が書いてあります。 XX君チョットと呼ばれる、、イヤイヤながら、ハイと返事する、、 定時5分前、、帰りの準備イベントが発生(タイマーイベント?) って、感じで、人もそれぞれ、いろいろなイベントに対応して、動作をしてます。 (そんな、単純じゃないしプログラムみたいに同じ動作じゃないし、、) ExcelやAccessのシステムでよく、見かけるのが、 ボタンなどのクリックイベントです。 実行ボタンが押されたら、この処理を実行などのモジュールが記述されてます。 また、イベントには優先順位があります。 更新後イベントが発生する前に変更時イベントが発生するなど、、、 レコード更新後イベントでキャンセルイベントを発生させるなど、 イベント処理、奥が深いので、レコード処理の時などに詳しくやりたいと思います。 例)データ登録時、在庫を確認して、無ければエラーメッセージを表示して、    登録イベントをキャンセルするなど、、 例)新人君、残業イベント発生、、女の子に電話、、予定があったら、    残業イベントキャンセル /* * 2.シートが変わった時のイベントを例題にする */ なんか、ウダウダ、うるさかったけど、 ポイントは、 イベントに対応する処理を書くんですよ。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ってことでした。 Sheet2にシートが切り替わったら、 「シート2ですヨロシク」 のメッセージを出力する場合、 まず、ALT+F11でVBAの編集画面を出します。 次に、Sheet2のイベントを記述したいので、 プロジェクトの中から、 Microsoft Excelオブジェクト Sheet1 Sheet2 ←を選択、右クリックします。 Sheet3 コードの表示を選択します。(Sheet2をダブルクリックでもOK) 白紙のモジュールを記述する画面が表示されます。 次は、Worksheetのオブジェクトを選択します。 選択すると、勝手に Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) End Sub と_SelectionChangeのイベントが出てくるけど、 ここは気にしないで、 右側のプロシージャを選択します。 ▼を押すとオブジェクトのイベントプロシージャが表示されます。 まぁ、いろいろとありますね。 ここでは、Activateを選択します。 すると、 Private Sub Worksheet_Activate() End Sub が追加されます。 ここにメッセージを表示する処理を書きます。 Private Sub Worksheet_Activate() MsgBox "「シート2ですヨロシク」" End Sub テストで、Sheet2をクリックして選択すると、メッセージが出ると思います。 こんな感じで、イベントに対応する処理を地道に書きます。 いろいろなイベントあるので、 /* * 3.単純でウザイ、msgboxを入れてイベントの発生を見る */ イベントがどんなタイミングで発生するか、知りたいですよね。 私もよくわからないので、 全てのイベントにMsgBoxを入れてメッセージを出してみます。 Sheet3のイベントに、書きまくりました。 Private Sub Worksheet_Activate() MsgBox "_Activate イベント発生 こんにちは" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) MsgBox "_BeforeDoubleClick イベント発生 叩くなよそんなに" End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean) MsgBox "_BeforeRightClick イベント発生 右クリックで何したいの?" End Sub Private Sub Worksheet_Calculate() MsgBox "_Calculate イベント発生 計算したよ" End Sub Private Sub Worksheet_Change(ByVal Target As Excel.Range) MsgBox "_Change イベント発生 中身さわったでしょ(変更した)" End Sub Private Sub Worksheet_Deactivate() MsgBox "_Deactivate イベント発生 サヨナラ、また来てね" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) MsgBox "_SelectionChange イベント発生 浮気者セル移動したね" End Sub MsgBoxで止まってしまうので、ダブルクリックのイベントはテストできないけど、 こんな感じでイベントのタイミングを見ることができます。 イベントの発生順位(優先順位)がわかると思います。 =a1+b1とか計算式を入れたり、a1のセルを削除したり、 いろいろとイタズラしてイベントを探ってみてください。 /* * 4.オブジェクトやコントロールによってイベントは違う */ 例題はシート関係のイベントだったけど、 ボタンを押したらクリックイベントが発生するから、 ボタンを押した後の処理を書ける(書くと目的の動作をする) 感覚がなんとなくわかりましたか? まぁ、これも慣れなので、 こんなことしたい と思ったら、 どのタイミングで動作させる、、動作させたらと想像できるようになります。 ~~~~~~~~~~~~~~~ また、Ken3にはクリスマスイベントが発生しないみたいに、 オブジェクトやコントロールによってイベントは違うので、 探ってみてください。 /* * 5.終わりの挨拶 */ 今回は、 ・イベントのイメージ ・シート関係のイベントを追加する方法 ・MsgBoxでタイミングを調べる でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba035.lzh に test035-book.xlsが保存されています。 シートを切り替えて、遊んでくださいね。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.36 2002/12/29
オブジェクトのプロパティについて
[ページTOPへ戻る]

<オブジェクトのプロパティについて>

こんにちは、三流プログラマーKen3です。 今回は、 オブジェクトのプロパティについて について軽く書きたいと思います。 気楽に読んでください。 /* * 1. オブジェクトのプロパティとメソッド */ オブジェクトのプロパティとメソッド なんて言われてもなぁ、、、なんかピンとこないんだよね正直。 前回やった、イベント処理は、 イベントに対応する処理を書くんだよ、、とイメージはなんとなくわかったけど。 ( 詳細は、http://www.ken3.org/backno/backno_vba08.html#35 の、[No.35 イベント処理について]を参照 ) プロパティはオブジェクトの値や状態を取得したりセットしたり で メソッドは追加や削除、コピーなどの動作なんですよ。 はぁ?何いってんのかよくわかんねえよ。 例題出してくれよ例題。 例題と言われてもなぁ、、、 -- 余談 メールもらいました -- In message "無駄なんだよ", 183さん wrote... >>まず、ALT+F11でVBAの編集画面を出します。 >Sheetを右クリック コードの表示 -- 初め何言ってんだコイツ? と思ったけど、やってみると、私が説明した下記より簡単だった。 In message "[VBAで楽しく No.035] - イベント処理について", >まず、ALT+F11でVBAの編集画面を出します。 > >次に、Sheet2のイベントを記述したいので、 >プロジェクトの中から、 >Microsoft Excelオブジェクト > Sheet1 > Sheet2 ←を選択、右クリックします。 > Sheet3 > >コードの表示を選択します。(Sheet2をダブルクリックでもOK) >白紙のモジュールを記述する画面が表示されます。 > >次は、Worksheetのオブジェクトを選択します。 >選択すると、勝手に >Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) > >End Sub と前回説明してたけど、 画面下でシートを切り替えますよね、 そこで右クリック押すと 挿入、削除、、、 一番下にコードの表示ってあって、これを選択すると、同じ動作ができます。 おっ、手数が1手少なく出きるので、 シートを右クリック -- コード表示もありですね。 *Alt+F11をクセにしてもいいし(私がなっているだけ?) /* * 2.プロパティで値を参照 Rangeオブジェクトの.Address */ プロパティはオブジェクトの値や状態を取得したりセットしたり と言ってたよね。 はい、言ってましたよ。 イメージは、オブジェクトってのは、いろいろな値を持っているんですよ。 例えば、Rangeって便利なオブジェクトには、 .Addressってあって、どのアドレスのデータなのか値を持っています。 セルの選択位置が変わると発生する Worksheet_SelectionChangeイベントに下記のように書いてみます。 *Sheetを選択、右クリック、コードの表示でVBA編集へ行き Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) '.Addressプロパティの値をセルの2,2(B2)にセット Cells(2, 2) = Target.Address End Sub これは、何やってるか。 簡単に説明すると、Target.Addressの値を行2列2(B2)にセットしてます。 これが、値の取得です。 ポイントは、オブジェクト.プロパティで値を参照してます。 Address プロパティ Range オブジェクトを対象にして、マクロの言語の範囲参照を返します。 値の取得のみ可能です。文字列型 (String) の値を使用します。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba036.lzh に test036-book.xlsが保存されています。 クリックして、遊んでくださいね。 /* * 3.プロパティに値をセットする(値を変更する) */ プロパティはオブジェクトの値や状態を取得したりセットしたり と、取得は上で軽くやったから、 今度はセットですね。 せっかくだから、ダブルクリックのイベント処理で、 ダブルクリックされたら"TEST"の文字をセットします。 _BeforeDoubleClickのイベントを記述します (VBAの編集画面で選択します) Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) 'TESTの文字をセットする Target.Value = "TEST" 'おまけで、.Font.Bold で太字を切りかえる If Target.Font.Bold = True Then Target.Font.Bold = False Else Target.Font.Bold = True End If End Sub Worksheet_BeforeDoubleClickのイベントで、 対象となるByVal Target As Excel.Range で渡されたTargetに対して、 .Value 値に"TEST"と文字列をセットしてます。 *ただ、ダブルクリックされたセルにセットしただけです。 次は、取得とセットもできるんですよの例で、 'おまけで、.Font.Bold で太字を切りかえる If Target.Font.Bold = True Then Target.Font.Bold = False Else Target.Font.Bold = True End If これは、ターゲットのフォントが太字だったら(Target.Font.Bold = True) Target.Font.Bold = False と太字を解除してます。 *ON/OFFの切り替えみたいな感じです。 .Bold プロパティ True の場合、フォントを太字にします。 値の取得および設定ともに可能です。バリアント型 (Variant) の値を使用します。 /* * 4.値の取得のみ可能/値の取得および設定ともに可能です */ プロパティには、 値の取得のみ可能 値の取得および設定ともに可能 と2パターンあります。 Target.Address は、 オブジェクトの参照しているアドレスなので、取得のみ可能。 まぁダブルクリックされたアドレスなんだから、 取得のみだよっていわれれば、なんとなくはわかるけど。。。 Target.Font.Bold は、 フォントの太字状態を参照するのと、 プログラムで値をセットして状態を変化させることができました。 ターゲットの状態は? と値を見て(取得して)、変化(新しい値を代入)することができました。 まぁ、これも慣れだし、 .XXXXXプロパティによって違うのも、 あっ、これは内容的に取得のみだな、取得と設定可能だな、、、 とわかるように自然になると思います。 /* * 5.終わりの挨拶 */ 今回は、 ・オブジェクトのプロパティ ・プロパティの値の取得 ・プロパティに値をセット でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba036.lzh に test036-book.xlsが保存されています。 クリックしたり、ダブルクリックで遊んでくださいね。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.37 2002/12/30
オブジェクトのメソッドについて
[ページTOPへ戻る]

<オブジェクトのメソッドについて>

こんにちは、三流プログラマーKen3です。 今回は、 オブジェクトのメソッドについて について軽く書きたいと思います。 気楽に読んでください。 /* * 1. オブジェクトのプロパティとメソッド */ オブジェクトのプロパティは、 前回軽く、やりました(さわりしかやってなかったけどね) ( 詳細は、[No.36 オブジェクトのプロパティについて]を参照 ) 今回は、メソッドで、 メソッドは、追加や削除、コピーなどの 動作なんですよ。 ^^^^^^^^^^^^^^ なんて軽く言ってたよね。 -- 余談 メールもらいました -- In message "カタカナやめろ", 183さん wrote... >>オブジェクト >Object オブジェクトってのは、Objectと書いたほうがわかり易い と 言いたかったのかなぁ。 まぁ、素人が書く(三流作者が書く)メルマガなので、 あまり気にしないで下さい。 でも、カタカナ表記じゃないほうが(プログラムではAs Objectとか使うので) わかり易いご意見は参考になりました。 どうもです。 前回までメルマガタイトル、オブジェクトで発行してたので、 統一性を持たせるために、今回はご勘弁を。 (なんか苦しい言い訳してるみたい(笑)) /* * 2.メソッドは動作 */ メソッドの例かぁ、、、また勝手な作業を作ると、 下記のような表がありました。 B列 C列 4行 配送日時 発行部数 5行 2002/12/29 433 6行 2002/12/28 428 7行 2002/12/27 425 8行 2002/12/26 424 9行 2002/12/24 423 10行 2002/12/23 424 11行 2002/12/22 423 12行 2002/12/19 412 13行 2002/12/19 412 14行 2002/12/18 413 過去10件のデータを管理してます。 12/30日にメルマガを発行したら、 1行データを挿入し新たな入力エリアの作成、 ついでに一番古いデータを削除(12/18) するボタンを作成したいと思います。 5行目で行挿入して、 1つ下がるから、15行目を削除するんだろ、、、 Sub test037_1() ActiveSheet.Rows(5).Insert ActiveSheet.Rows(15).Delete End Sub ActiveSheet.Rows(5)これで5行目のオブジェクトを指定、 .Insertメソッドを使って、行挿入の動作。 次も似たパターンで、 ActiveSheet.Rows(15)これで15行目のオブジェクトを指定、 .Deleteメソッドを使って、行削除の動作。 こんな感じですね。 と言われても、どんな感じ?としか三流君には答えられないよ? えっと、 プロパティの説明をしつこく書くと、 ~~~~~~~~~~ 値の参照やセットだったよね。 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) '.Addressプロパティの値をセルの2,2(B2)にセット Cells(2, 2) = Target.Address End Sub は、アドレスの文字列をB2番地に代入したり、 XXXX = Object.プロパティのパターン や Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) 'TESTの文字をセットする Target.Value = "TEST" 'おまけで、.Font.Bold で太字を切りかえる If Target.Font.Bold = True Then Target.Font.Bold = False Else Target.Font.Bold = True End If End Sub これは、Target As Excel.Range(ダブルクリックされたセル) にデータをセットしてます。 Object.プロパティ = XXXXのパターです。 メソッドは、 ~~~~~~~~~~ Object.メソッド(動作) と、 オブジェクトに対して動作をする感じです。 う〜ん、なんとなくわかったような、わからないような。。。 では、決り文句の、 そのうち慣れるから大丈夫ですよ。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /* * 3.終わりの挨拶 */ 今回は、 ・オブジェクトのメソッドの話でした。 ・メソッドは動作です ・プロパティとメソッドの違いを軽く。 でした。 画像は今回無しで(え〜、手抜きもしかして?) サンプルファイルは、 http://www.ken3.org/vba/lzh/vba037.lzh に test037-book.xlsが保存されています。 たった2行のプログラムしか無いけど。 軽めのサンプルで、 イベント、プロパティ、メソッドは説明し直しかなぁとフト思った。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.38 2002/12/31
キャラクタコード?って何? Chr関数、Asc関数
[ページTOPへ戻る]

<キャラクタコード?って何? Chr関数、Asc関数>

こんにちは、三流プログラマーKen3です。 今回は、 キャラクタコード?です。 気楽に読んでください。 /* * 1.キャラクタコード?って何? */ 会話の中で、20(ニイマル)だったら? とか、聞いたことありませんか? 20(ニイマル)は、聞かないなぁ そうですか。 キャラクタコード or アスキーコードって聞いた事ありますか? JISコードとかじゃなくて?あっ、ユニコード?EUCコード? 難しい話に、持っていかないで下さい。 えっとですね。 キャラクタコード or アスキーコード 半角文字の文字コードって言っていいのかな。 スペースが16進で20 1 が 16進で31 A が 16進で41 ア が 16進でB1 と、1文字1文字、コードが決まってます。 だから、なに? 通常の計算は、 100-50とか、数値ですよね まぁ、そうですね。 じゃ、文字B−文字Aは(’B’−’A’) そんなのできないよ。 言い方、悪かったです。 Bの文字コード − Aの文字コードは? 1? あまり、なっとくいかないけど。 はい、正解です。 では、Aの文字コード16進で41+3は? なめんなよ、16進で44でしょ。 キャラクタコード表で16進数の44は? キャラクタコード表って、どこにあるんだよ。 オレ持ってないよ。 う〜ん、どこにあるかなぁ? じゃ調べろよ、 ~~~~~~~~~~~~ In message "[VBAで楽しく No.000] - 困った時、情報の探し方(三流君の方法)", mag2 ID 0000099159さん wrote... >私がよく使う方法は、 >http://www.google.co.jp/ >に >キーワード なんて、言ってたよねアナタは。 (詳細は http://www.ken3.org/vba/select.html の 情報の探し方三流君の方法) よし、 http://www.google.co.jp/ から、キャラクタコード表やアスキーコード表で検索すると、いろいろ出てくる。 アスキーコード表 http://hp.vector.co.jp/authors/VA008536/data/ascii.html ↑シンプルなコード表です キャラクタコード表 http://speana-1.hp.infoseek.co.jp/serial/serial_4/char.htm ↑制御コードの説明も載ってます。 こんな感じです。 で、16進44に対応する文字は、"D"です。 こんな会話やってても、意味ないので、 VBAでサンプル作りますか。 /* * 2.VBAだと? */ 例題として、 InputBoxから文字列を受け取ります その中のA〜Zをa〜zに変換して、 msgboxで表示します。 ---- Sub B0_AZtoaz_Click() Dim strMOTO As String Dim strSAKI As String Dim strCHK As String Dim nCNT As Integer Dim nSA As Integer 'ここで、文字を入れる、、 strMOTO = InputBox("A-Zを含む好きな文字列を入れてください") '入力文字数のチェック If Len(strMOTO) = 0 Then MsgBox "0文字だとテストになりませんよ、、、" Exit Sub End If '初期化です strSAKI = "" '入力された文字数分、1文字毎に処理する For nCNT = 1 To Len(strMOTO) strCHK = Mid(strMOTO, nCNT, 1) '一文字取り出す 'A-Z判断 If Asc("A") <= Asc(strCHK) And Asc(strCHK) <= Asc("Z") Then nSA = Asc(strCHK) - Asc("A") 'Aからどれだけ離れているか? strCHK = Chr(Asc("a") + nSA) 'aに求めた差を+する。aから移動 End If '結果の文字を&でプラスする strSAKI = strSAKI & strCHK Next nCNT '結果の表示 MsgBox strMOTO & vbCrLf & "から" & vbCrLf & strSAKI End Sub ---- なんか、サンプルにキレがないなぁ、、、 何か質問は? いいですか、 'ここで、文字を入れる、、 strMOTO = InputBox("A-Zを含む好きな文字列を入れてください") ってなんですか? あまり、使わないのですが、 InputBoxを使用すると、入力用のウインドウが出て、 入力された結果を返してくれます。 ここでは、任意の文字を入れさせたかったので、 使用しています。 [No.11 InputBox関数で簡単な値を受け取る] をみてください。 さらに、素朴な質問なんですが、 Len(strMOTO) , Mid(strMOTO, nCNT, 1) , Asc("A") ってなんですか?Chrって? えっとですね、 len() --> 文字数を返してくれます mid() --> mid("ABCDEFG", 2 , 3) --> 2文字目から三文字分文字を抜き出します asc() --> アスキーコードを返します chr() --> chr(&h41) --> 指定したコードの文字を返します 詳しくは、ヘルプを見るか、サンプルをいろいろ見て、なれてください。 単体は、いいから、詳しく、意味を教えてくださいよ。 '入力文字数のチェック If Len(strMOTO) = 0 Then MsgBox "0文字だとテストになりませんよ、、、" Exit Sub End If これは、inputboxで何も入力しない場合を考えて、 受け取った、文字数を調べています。 0文字の場合、メッセージを出して、終了してます。 'A-Z判断 If Asc("A") <= Asc(strCHK) And Asc(strCHK) <= Asc("Z") Then nSA = Asc(strCHK) - Asc("A") 'Aからどれだけ離れているか? strCHK = Chr(Asc("a") + nSA) 'aに求めた差を+する。aから移動 End If なんか、ごちゃごちゃ、してますね。 えっと、Ifで、コードAより大きくコードZより小さいか聞いて、 その後、−”A”をして差を求めて、”a”を+してる? *Dの時、"D"-"A" が3、、で、"a"+3、3文字分で"d"になる? なんか、よくわからないや、、 あと、 '結果の表示 MsgBox strMOTO & vbCrLf & "から" & vbCrLf & strSAKI の中の、vbCrLfってなに? 結果を改行させたいので、使ってます。 試しに MsgBox "A" & vbCrLf & "B" とやってみてください。 1つ言っていい どうぞ。 strconv("ABCDEFG", vbLowerCase) 有名な標準関数で、できるんじゃない。。。 そうだけど、説明したかったの、、、 strMOTO = InputBox("好きな文字列を入れてください") MsgBox strMOTO & vbCrLf & "から" & vbCrLf & strconv(strMOTO, vbLowerCase) じゃ、コードの説明にならないでしょ、、、 /* * 3.ダブルコーテーションで説明無く使ってましたね。 */ [No.31 Write #で ””を付けた書き込み] でも、 In message "[VBAで楽しく No.031] - Write #で ””を付けた書き込み", >イ.キャラクタコードを指定して >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >そんな変な書き方はイヤなので(ウソ付け、よく使ってるくせに(笑))、 > > Sub test031_2() > Dim strMOJI As String '表示テスト用 > strMOJI = Chr(34) & "なんだかなぁ〜" & Chr(34) > MsgBox strMOJI 'メッセージボックスでテスト表示 > End Sub > >と、Chr関数を使用して、 >ダブルコーテーションの文字コード34を渡してといった方法もあります。 > >ウ.16進数で少しはカッコよくなるかなぁ? >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >上と同じなんだけど、&HXXで16進数にしてみました。 >(どちらかと言えば、16進のほうが多いかなぁコード表も16進だし) > Sub test031_3() > Dim strMOJI As String '表示テスト用 > '&Hで16進数、知ってましたか? > strMOJI = Chr(&H22) & "なんだかなぁ〜" & Chr(&H22) > MsgBox strMOJI 'メッセージボックスでテスト表示 > End Sub ここでは、”を表したかったので、 Chr(&H22) を使ってました。 キャラクタコードの説明が無く、少しわかりにくかったと思います。 /* * 4.おわりの挨拶 */ 今回は、 キャラクタコードの説明と、 strconv("ABCDEFG", vbLowerCase) の内部の動きとは、違うと思いますが、 1つの関数でできてることが、 実際は、いろいろな組み合わせで 動いているんだぁ、、、と少しでも感じてもらえばOKかなぁ。 画像は今回無しで(え〜、手抜きもしかして?) サンプルファイルは、 http://www.ken3.org/vba/lzh/vba038.lzh に test038-book.xlsが保存されています。 たった1つのプログラムしか無いけど。 なかなか、説明、難しい、、と思いつつ、今回も軽めにサヨナラです。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.39 2003/01/03
StrConv関数で半角を全角文字にしてみた
[ページTOPへ戻る]

<StrConv関数で半角を全角文字にしてみた>

こんにちは、三流プログラマーKen3です。 今回は、 StrConv関数で半角を全角文字にしてみた です。 気楽に読んでください。 /* * 1.文字列を囲う処理で、問題あり */ 下記のような ┌──────────┐ │文字列を囲ってみたい│ └──────────┘ なんて、文字列を作る処理の説明を http://www.ken3.org/backno/backno_vba07.html#34 の、[No.34 ┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい]でやりました。 覚えてますか? 忘れていてもOKです。 In message "[VBAで楽しく No.034] - ┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい", mag2 ID 0000099159さん wrote... >次回は今回作ったフォームの問題点とかを少しやります。 >・半角文字ABCを入れると一発で問題点がわかったりしてね -- と、自ら問題点に気が付いていました。 半角のABCを入れると ┌───────────┐ │半角のABCを入れると│ └───────────┘ と変換されてしまいます。 フォントがプロポーショナルとかの目の錯覚では無く、 あきらかに外枠のほうが長いです。 なんでだろ? /* * 2.処理を見直し原因の追及 */ ボタンを押した時の変換処理を下記のように作ってます。 Private Sub btnCONV_Click() Dim i As Integer Dim strLINE1 As String '1行目 Dim strLINE2 As String '2行目 Dim strLINE3 As String '3行目 '1行目を作る strLINE1 = "┌" '初めに左上端を代入 For i = 1 To Len(txtMOTO) '文字数分─を追加 strLINE1 = strLINE1 & "─" Next i strLINE1 = strLINE1 & "┐" '右上端を付ける '2行目を作る strLINE2 = "│" & txtMOTO & "│" '両端に│を付ける '3行目を作る strLINE3 = "└" '初めに左下端を代入 For i = 1 To Len(txtMOTO) '文字数分─を追加 strLINE3 = strLINE3 & "─" Next i strLINE3 = strLINE3 & "┘" '右下端を付ける '結果の代入 各ラインをvbCrLFでつなげただけ txtSAKI = strLINE1 & vbCrLf & strLINE2 & vbCrLf & strLINE3 End Sub う〜ん、自分が正しいと思って作った処理だから、 なかなか、原因のヶ所を見つけにくい。 そんな時、まずは、 正しい時と不具合が発生する条件をまとめてみる。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 正常な時:「VBAで楽しく」と全て全角文字 以上な時: 「VBAで楽しく」と半角のアルファベットが入っている時 あっ、よく見たら、 For i = 1 To Len(txtMOTO) '文字数分─を追加 strLINE3 = strLINE3 & "─" Next i の処理は、全角の─で横棒を作っているからだね。 Len(txtMOTO)で返ってきた文字数だと、マズイよね。 それにVBAと半角3文字みたいな奇数の時は、半角1スペース+して、 全角の横棒とサイズが合うように調整しないとね。 /* * 3.原因がわかったので、修正する */ なんだぁ、簡単ジャン。 半角文字がまずいんだろ、 だったら全角にしろよ全て。 えっと、客が言ってきた要望は何だったっけ。 In message "[VBAで楽しく No.034] - ┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい", mag2 ID 0000099159さん wrote... >/* > * 1. やりたいこと >*/ > >VBAで楽しく >と >文字列を受け取ったら、 >┌───────┐ >│VBAで楽しく│ >└───────┘ >と、ワクで囲まれた文字列を作ってみたいです。 --- ほら、半角文字のことなんて書いてないよ。 なんか言ってきたら、 インターネット上で半角カナは使わないのが常識で、 それを防止するためにも、 半角文字は全角に直してワクを付けました。 って言えよ。 えっ、全てこちらの都合じゃないですか、 確認しないで勝手に仕様です、、、にしてしまって。 半角カナは私も賛成だけど、面倒だからって、 VBAの半角英数を全角に変換してしまうのはねぇ。 いいよ、時間かかるから、仕様にしといて。 お客がどうしても半角奇数文字を変換したかったら、 追加で工数とお金もらうから。 そんなんで、いいのかよ、、、と純粋なプログラマーの心が腐り始める瞬間でした。 なんて、くだらない話は、置いといて、 腐った先輩が言ってる、半角文字を全角にしてかわすには、 有名なStrConv関数を使います。 使い方は簡単で、 StrConv(文字列, 変換モードの定数) で、 StrConv("abcd", vbWide) とやると、 abcd に変換されます。 定数 内容 vbUpperCase 文字列を大文字に変換します。 vbLowerCase 文字列を小文字に変換します。 vbProperCase 文字列の各単語の先頭の文字を大文字に変換します。 vbWide 文字列内の半角文字 (1 バイト) を全角文字 (2 バイト) に変換します。 vbNarrow 文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換します。 vbKatakana 文字列内のひらがなをカタカナに変換します。 vbHiragana 文字列内のカタカナをひらがなに変換します。 vbUnicode システムの既定のコード ページを使って文字列を Unicode に変換します。 vbFromUnicode 文字列を Unicode からシステムの既定のコード ページに変換します。 といろいろ変換できます。 証拠隠滅も兼ねて、 txtMOTO = StrConv(txtMOTO, vbWide) '半角を全角に変換、データをキレイにする の1文を変換処理に入れます。 Private Sub btnCONV_Click() Dim i As Integer Dim strLINE1 As String '1行目 Dim strLINE2 As String '2行目 Dim strLINE3 As String '3行目 txtMOTO = StrConv(txtMOTO, vbWide) '半角を全角に変換、データをキレイにする '1行目を作る strLINE1 = "┌" '初めに左上端を代入 For i = 1 To Len(txtMOTO) '文字数分─を追加 strLINE1 = strLINE1 & "─" Next i strLINE1 = strLINE1 & "┐" '右上端を付ける '2行目を作る strLINE2 = "│" & txtMOTO & "│" '両端に│を付ける '3行目を作る strLINE3 = "└" '初めに左下端を代入 For i = 1 To Len(txtMOTO) '文字数分─を追加 strLINE3 = strLINE3 & "─" Next i strLINE3 = strLINE3 & "┘" '右下端を付ける '結果の代入 各ラインをvbCrLFでつなげただけ txtSAKI = strLINE1 & vbCrLf & strLINE2 & vbCrLf & strLINE3 End Sub 修正方法に納得いかないけど、こんな感じで不具合は無くなりました。 /* * 4.おわりの挨拶 */ 今回は、 ・不具合が発生したら、正常パターンと異常パターンを比べましょう ・不具合の内容を理解、修正方法の検討 ・StrConv関数を使って、半角文字を全角に変換 でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba039.lzh に test039-book.xlsが保存されています。 *test034持ってる人は、1行追加しただけなので、  練習兼ねて、自分で追加してみてください。 今回の小手先修正、仕様ですで逃げる方法、ふざけるな、、 と思ったアナタ、 正常なプログラマーさんですよキット。 仕様と言って逃げるのも1つの手だと思ったアナタ、 工数にキビシイ管理者になれるOr商売人やなぁ(ほどほどにね(笑)) どっちもケースによっては正解だけどね。 仕様のツメが甘いと後でもめるんだよね。 私はこんな感じをイメージしてない とか そんなの常識、アンタが非常識とかね。 はい、ここまで。 おっと、ここはVBA系のメルマガだった。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *そんなネタが多い愚痴系のメルマガは http://www.ken3.org/guchi/ で書いてるので、よかったら遊びに来てください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 PS.次回は純粋プログラマー半角文字と対決するのお話かなぁ(笑)    *違うネタやるかもしれないけど、次回のメルマガもヨロシクです。


検索して目的の情報を探す。

目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。

カスタム検索
三流君(site:www.ken3.org) 内を Googleを利用してキーワード する

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

リンクや広告など

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

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

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

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

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

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

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]



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