[No.30 Excel UserForm テキストボックスのイベント]
[No.31 Write #で ””を付けた書き込み]
[No.32 Excel UserForm_KeyDownイベント発生条件]
[No.33 FreeFile関数で空いてるファイル番号を返す方法]
[No.34 ┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい]

www.ken3.org(サイト内)から Google を利用して、

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



No.30 2002/12/19
Excel UserForm テキストボックスのイベント
[ページTOPへ戻る]

<Excel UserForm テキストボックスのイベント>

こんにちは、三流プログラマーKen3です。 今回は、 Excelユーザーフォーム の テキストボックス関係のイベントを少し書きます。 別の機会でフォームの作り方はやるつもりなので、 気楽に読んでください。 /* * 1. 質問来た、今度はカッコつけたいけど、、、、 */ BBS に以下の投稿がありました。 >投稿時間:2002/12/18(Wed) 23:50 > >おなまえ:fox1972 >タイトル:エクセルVBAでのキー操作 >URL : >コメント: > >エクセルにてユーザーフォームを表示しています。 >ファンクションキーを利用してある処理をさせたいのですが、 >何か良い方法はないでしょうか? > >また、フォームを表示したときに、あるテキストボックスに >フォーカスを移動させたいのですが、上手くいきません。 >(どこがアクティブになっているのかも解らない。カーソルも表示されない。) >今は「UserForm_Initialize」にて「テキストボックス名.SetFocus」と記述しています。 >-------------------------------------------------------- ---- 最近、ポツポツと質問来てるので、ネタには困らないなぁ と思いつつ、質問内容と自分の経験を照らし合わせて考える。 /* * 2.先に、テキストボックスを目立たせてみる */ >また、フォームを表示したときに、あるテキストボックスに >フォーカスを移動させたいのですが、上手くいきません。 >(どこがアクティブになっているのかも解らない。カーソルも表示されない。) >今は「UserForm_Initialize」にて「テキストボックス名.SetFocus」と記述しています。 どこがアクティブだか、わからない。。。 ユーザーフォーム作成後、 テキストボックスを2つ作って、私も試してみました。 たしかに、、、わかりにくい。 サンプルを、 http://www.ken3.org/vba/lzh/vba030.lzh のtest030-book.xls内にテストのフォーム作りました。 解説と合わせて見て下さい。 一つの案として、現在入力中のテキストボックスのバックカラーを変えてみます。 テキストボックスのイベントで、 _Enterが入ってきた時の処理、 _Exitが出て行く時発生するイベントなので、 テキストボックスに入力が移ったら、 .BackColor = RGB(&H0, &HFF, &HFF) で水色に変えて、 出て行く時は、 .BackColor = RGB(&HFF, &HFF, &HFF) 元に戻してます。 Private Sub TextBox1_Enter() 'テキストボックスに入ったら色変える TextBox1.BackColor = RGB(&H0, &HFF, &HFF) End Sub Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'テキストボックスからバイバイする時は元に戻す TextBox1.BackColor = RGB(&HFF, &HFF, &HFF) End Sub Private Sub TextBox2_Enter() 'テキストボックスに入ったら色変える TextBox2.BackColor = RGB(&H0, &HFF, &HFF) End Sub Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'テキストボックスからバイバイする時は元に戻す TextBox2.BackColor = RGB(&HFF, &HFF, &HFF) End Sub 三流君さ、うっ、なんか頭イタクなってきたよオレ。 何で?動いてるよ。 じゃなくって、 10個入力項目あったら、全部いれるのこれ? なんかバカ臭くない? ギク、、、 コントロールって配列にして処理できるか、調べないとなぁ。 確かに、2つ3つだったらいいけど(2つ3つまでかなガマンできるの) テキストの数が多いとマズイなぁ。 一つの案として、イベントで背景色を変えて、入力エリアをわかりやすくしました。 その先のプログラムもわかりやすくする方法は、現在探ってます(大丈夫??) /* * 3.ファンクションキーを取る */ ファンクションキーを取る、 これはAccessでやったことあったので、 参考例を。 KeyDownのイベントで取れるので、 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If vbKeyF1 <= KeyCode And KeyCode < vbKeyF12 Then MsgBox "F" & (KeyCode - vbKeyF1 + 1) & "が押されました" End If End Sub でテストできます。 キー コードの定数(ヘルプより) 定数 値 内容 vbKeyF1 0x70 F1 キー vbKeyF2 0x71 F2 キー vbKeyF3 0x72 F3 キー vbKeyF4 0x73 F4 キー vbKeyF5 0x74 F5 キー vbKeyF6 0x75 F6 キー vbKeyF7 0x76 F7 キー vbKeyF8 0x77 F8 キー vbKeyF9 0x78 F9 キー vbKeyF10 0x79 F10 キー vbKeyF11 0x7A F11 キー vbKeyF12 0x7B F12 キー vbKeyF13 0x7C F13 キー vbKeyF14 0x7D F14 キー vbKeyF15 0x7E F15 キー vbKeyF16 0x7F F16 キー 共通の関数作ってみたけど ^^^^^^^^^^^^^^^^^^^^^^^^ Private Sub chkFKey(ByVal KeyCode As MSForms.ReturnInteger) If vbKeyF1 <= KeyCode And KeyCode < vbKeyF12 Then Select Case KeyCode Case vbKeyF1: '終了処理 'さて、フォームでもとじますか。 Unload Me '自分を落す Case vbKeyF4: 'F4 MsgBox "こんな感じでF4処理を書く" Case Else: MsgBox "F" & (KeyCode - vbKeyF1 + 1) & "が押されました" End Select End If End Sub Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Call chkFKey(KeyCode) 'チェック用の関数を呼ぶ End Sub Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Call chkFKey(KeyCode) 'チェック用の関数を呼ぶ End Sub と、各テキストボックスの _KeyDown イベントで共通の関数を呼び、 F1が押されたらフォームを閉じる(通常F1はヘルプだけど) F4はテストメッセージ、 その他のキーは、押されたキーを表示してます。 えっ、これも、テキストボックスの数入れないといけないの? あとさ、バックカラーはいいとして、 チェックボックスとかリストボックスにフォーカスあたってた時に、 F1押しても反応しないんじゃない? たしか、フォーム全体に効かす、、って言うか、 フォームの_KeyDown イベントに書いたら? う〜ん、これも改善の余地有りですね。 /* * 4.終わりの挨拶 */ 今回は、 ・Excelユーザーフォームのテキストボックスを見やすくする案 ・ファンクションキーを判断したい でした。 今回のサンプルは、 http://www.ken3.org/vba/lzh/vba030.lzh に test030-book.xlsが保存されていて、 テストフォームを2種類作ってます バックカラーを変えたり、ファンクションを押してみたり、 遊んでください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.31 2002/12/22
Write #で ””を付けた書き込み
[ページTOPへ戻る]

<Write #で ””を付けた書き込み>

こんにちは、三流プログラマーKen3です。 今回は、 テキストファイルへ ””を付けた書き込み を少し書きます。 気楽に読んでください。 /* * 1. CSVファイルで見かける、文字列を""で囲う出力をしたくて。 */ 文字列囲ってる""ってなんて言うんだっけ? またまた、三流君笑わせないでよ、えっと.... オイオイと心の中で読者は回答の 「ダブルコーテーション」 を笑いながら言ってくれたと思いつつ、 今回は、テキストファイルへ””付きでデータを出力する方法です。 ’はシングルコーテーションです。 ”が見たままのダブルコーテーション /* * 2.「ダブルコーテーション」の出力方法あれこれ */ 文字列って「ダブルコーテーション」で囲って表現してました。 A = "文字列ですよ" 見たいな感じで。 ア.””と2つ書くと、”と表現できるらしい ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Sub test031_1() Dim strMOJI As String '表示テスト用 strMOJI = """なんだかなぁ〜""" MsgBox strMOJI 'メッセージボックスでテスト表示 End Sub なんかバカっぽいけど、動きますよ。 ポイントは、””が”なので、”””と書きました。 何言ってんだか(笑) イ.キャラクタコードを指定して ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ そんな変な書き方はイヤなので(ウソ付け、よく使ってるくせに(笑))、 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 エ.Constで勝手な定数を作る ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 前の講座でConstで定数作れるとやったので、試しに使ってみる。 Sub test031_4() Const KOTEI = Chr(&H22) Dim strMOJI As String '表示テスト用 '新規作成の定数KOTEIで囲ってみた strMOJI = KOTEI & "なんだかなぁ〜" & KOTEI MsgBox strMOJI 'メッセージボックスでテスト表示 End Sub あれ?エラーだよ Const KOTEI = Chr(&H22)  ↑~~~~~~~関数のリターン値は定数に使えないんだ。 まぁ、変数にしてすぐに代入でもよかったけど、 Dim KOTEI As String KOTEI = Chr(&H22) 下記のように直しました。 Sub test031_4() Const KOTEI = """" Dim strMOJI As String '表示テスト用 '新規作成の定数KOTEIで囲ってみた strMOJI = KOTEI & "なんだかなぁ〜" & KOTEI MsgBox strMOJI 'メッセージボックスでテスト表示 End Sub 書いてて、こっちのほうが笑えるね、 Const KOTEI = """" の4つは、深く見ないと何やってるのかわからない、?だよね、、、う〜ん。 /* * 3.実際にデータを書き込んでみる */ Sub test031_5() Dim strFNAME As String 'ファイル名格納用 Dim KAKOI As String '囲い文字 KAKOI = Chr(&H22) '”を代入 'ブックと同じ位置にtest031-5.txtを作成する strFNAME = ThisWorkbook.Path & "\test031-5.txt" 'ファイル名の作成 Open strFNAME For Output As #1 'ファイル番号1で新規作成 'テストデータ書き込み、 Print #1, KAKOI & "こんな感じかぁ、なんかなぁ" & KAKOI Print #1, KAKOI & Range("A1").Value & KAKOI '決り文句A1セル文章を出力 Print #1, Now & "に作成したファイルです" Print #1, "終わりです" Close #1 '開いたら閉じようね '終了メッセージの表示 MsgBox strFNAME & "を作成しました、確認してね" End Sub まぁ、ポイントも得に無く(笑) 変数にして初期値で代入 ^^^^^^^^^^^^^^^^^^^^^^ Dim KAKOI As String '囲い文字 KAKOI = Chr(&H22) '”を代入 ConstはChr関数が使えないのでやめて、 変数宣言して、代入しました。 データの書き込み ^^^^^^^^^^^^^^^^ Print #1, KAKOI & "こんな感じかぁ、なんかなぁ" & KAKOI Print #1, KAKOI & Range("A1").Value & KAKOI '決り文句A1セル文章を出力 たんに&を使って、文字列の連結をしただけです。 実行結果(test035-5.txt) ^^^^^^^^ "こんな感じかぁ、なんかなぁ" "Alt+F11でVBAの編集画面が開きます" 2002/12/22 18:01:24に作成したファイルです 終わりです /* * 4.Write # ステートメントを使ってみたら? */ 昔、読者から Write # ステートメント を 使ってみたら? と アドバイスメールをもらったので、紹介します。 In message "はじめまして", t****@*******.co.jpさん wrote... >'データ書き込み >Print #1, KAKOI & "やっぱ三流だよね、固定はよくないよ" & KAKOI; >↓ >Write #1, "やっぱ三流だよね、固定はよくないよ" >にした方がいいような気がします。 ---- 実は、引っ張りまわしたけど、 今日は、これの解説だけしたかったんですね(オイオイ) 世の中には、自分が知らない関数が数多くあり、 Write # ステートメント もその一つで(Print#などのヘルプの関連項目には埋まっていたけど) これを使うと”””の書き方や、Chr(&h22) そんな余計なことは知らなくってもOKです。 使い方は簡単で Write #ファイル番号,文字列 です。 Sub test031_6() Dim strFNAME As String 'ファイル名格納用 'ブックと同じ位置にtest031-6.txtを作成する strFNAME = ThisWorkbook.Path & "\test031-6.txt" 'ファイル名の作成 Open strFNAME For Output As #1 'ファイル番号1で新規作成 'テストデータ書き込み、 Write #1, "こんな感じかぁ、なんかなぁ" Write #1, Range("A1").Value '決り文句A1セル文章を出力 Print #1, Now & "に作成したファイルです" Print #1, "終わりです" Close #1 '開いたら閉じようね '終了メッセージの表示 MsgBox strFNAME & "を作成しました、確認してね" End Sub ポイントのWrite # ^^^^^^^^^^^^^^^^^ Write #1, "こんな感じかぁ、なんかなぁ" Write #1, Range("A1").Value '決り文句A1セル文章を出力 Print #1, Now & "に作成したファイルです" なんだよ、PrintがWriteになっただけですね。 わかってみれば簡単、少しは知識も必要だと思ったような、思わなかったような。 /* * 4.終わりの挨拶 */ なんか今回は、野球の後から解説じゃないけど、 強引にWrite #1ステートメントに持って行きました。 ・"ダブルコーテーションの話、書き方 ・Constで関数のリターン値が使えない ・Write #だと初めから囲ってくれるよ でした。 今回のサンプルは、 http://www.ken3.org/vba/lzh/vba031.lzh に test031-book.xlsが保存されているので、 遊んでください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.32 2002/12/23
Excel UserForm_KeyDownイベント発生条件
[ページTOPへ戻る]

<Excel UserForm_KeyDownイベント発生条件>

こんにちは、三流プログラマーKen3です。 今回は、 No.30 Excel UserForm テキストボックスのイベント http://www.ken3.org/backno/backno_vba07.html#30 の続きです。 ファンクションキーを処理したくて、 UserForm_KeyDownイベントを探った結果です。 気楽に読んでください。 /* * 1. KeyDownイベントを探る。 */ テキストボックスの_KeyDownイベントに書いて、 なんとかファンクションキーが押されたことを判断してました。 今回は、フォームにもKeyDownイベントあるので、 ここに書いたら出来るんじゃないか?やったぁとヌカヨロコビシタ話です(笑) なかなか、うまく行かないね。。。。 ヘルプでKeyDownイベントの解説を見ると、 実行中のフォームで、フォームまたはそのコントロールにフォーカスがあるときに キーを押すと、KeyDown イベントが発生します。キーを押したまま離さないでいると 、KeyDown イベントと KeyPress イベントが交互に繰り返し発生します。キーを離す と KeyUp イベントが発生します。キーストロークはすべて、フォーカスがあるフォー ムまたはコントロールが受け取ります。 フォームは、コントロールが 1 つもないか、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ または表示されているすべてのコントロールが選択不可能に設定されている場合に限り、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ フォーカスを持つことができます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ あらら、 UserForm_KeyDownイベントでまとめられると思ったのに。 余談ですが、 MSDNライブラリ http://www.microsoft.com/japan/msdn/library/default.asp から、 フレーズ(語句)検索 "KeyDown" すべてを含む で探すこともできます。 さらにあまり関係無いけど、 KeyPreview プロパティ ってのが、 .NET Framework クラス ライブラリ ならあって、フォームで簡単に受け取れるみたいです。 解説 このプロパティを true に設定すると、 KeyPress 、 KeyDown 、 KeyUp の各イベント をすべてフォームが受け取ります。フォームのイベントハンドラでキーストロークの処 理が完了してから、フォーカスを持つコントロールにそのキーストロークが割り当てら れます。たとえば、 KeyPreview プロパティが true に設定され、現在選択されている コントロールが TextBox の場合は、キーストロークがフォームのイベント処理メソッド で処理された後で、押されたキーを TextBox コントロールが受け取ります。キーボード イベントをフォームでだけ処理し、そのイベントをコントロールでは受け取らないよう にする場合は、フォームの KeyPress イベントまたは KeyDown イベントの e.Handled パラメータを true に設定します。 このプロパティを使用してアプリケーションのすべてのキーストロークを処理し、 フォームでキーストロークを処理するか、キーストロークを処理するために適切な コントロールを呼び出すことができます。たとえば、アプリケーションで ファンクション キーが使用される場合は、キーストローク イベントを受け取るコントロ ールごとにコードを作成するのではなく、 フォーム レベルでキーストロークを処理します。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↑これがやりたいのに、、、  Excel97/2000のフォームにKeyPreview プロパティ無いんだよね、探したけど。  EXcel2002ならあるのかなぁ?  それとも、サービスパックを当てると治るとか、、仕様だからムリかな。 /* * 2.ホントなのか? */ ユーザーフォームに1つでもフォーカスを受け取る項目が存在すると、 UserForm_KeyDownイベント フォームのKeyDownイベントが発生しないか、テストしてみた。 今回のサンプルは、 http://www.ken3.org/vba/lzh/vba032.lzh に test032-book.xlsとdb032.mdbが保存されています。 テストのフォーム1は、ラベルだけで、コントロールにフォーカスはあたりません。 この状態で、 UserForm_KeyDownイベントが発生するかチェックしてみる テストのフォーム2は、テキストボックス在りで、 コントロールにフォーカスは当たります。 この状態で同じ関数を書き、イベントが発生するかチェックする。 テスト実行してみると、う〜ん、ホントみたいだ。。。 KeyPreview プロパティぽいのも無いし。 1つ1つフォーカスのあたるコントロールに ファンクション判断つけるしかないのかなぁ。 何かいい手は無いのかなぁ。。。 /* * 3.Access97でも試してみました */ Access97でも試してみました。 同じ圧縮ファイルの、 http://www.ken3.org/vba/lzh/vba032.lzh にtest032-book.xlsとdb032.mdbが保存されています。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If vbKeyF1 <= KeyCode And KeyCode < vbKeyF12 Then Select Case KeyCode Case vbKeyF4: 'F4 MsgBox "こんな感じでF4処理を書く" Case Else: MsgBox "F" & (KeyCode - vbKeyF1 + 1) & "が押されました" End Select End If End Sub と同じコードが入ってます。 結果は、Excelと同じで、テキストボックスが無いフォーカスあたらない フォームは、Form_KeyDownイベントが発生して、 テキストボックスありのフォーカスがほかのコントロールにあたるフォームは 反応しませんでした。。。 /* * 4.終わりの挨拶 */ なんか今回も、解決してない、 できないよの報告でした。 KeyDownイベント作りの参考、 ファンクションキーを取る参考なればうれしいけど。。。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.33 2002/12/24
FreeFile関数で空いてるファイル番号を返す方法
[ページTOPへ戻る]

<FreeFile関数で空いてるファイル番号を返す方法>

こんにちは、三流プログラマーKen3です。 今回は、 空いてるファイル番号を返す FreeFile関数 を使ってみます。 気楽に読んでください。 /* * 1. 今までの流れ */ 前回、まで、 テキストファイルの関係をいろいろとやりました。 No.27 テキストファイル処理 ファイルへの書き込み http://www.ken3.org/backno/backno_vba06.html#27 Open Close Print # No.29 テキストファイル処理 ファイルからの読み込み http://www.ken3.org/backno/backno_vba06.html#29 Line Input # Eof関数 No.31 Write #で ””を付けた書き込み http://www.ken3.org/backno/backno_vba07.html#31 Write # と来て、で今回は、 Open 〜 AS #1,Close #1,Print #1 や Write #1 と固定のファイル番号1を使っていたところを、 FreeFile関数を使って空いている番号を取得し使用するをテストしてみたいと思います ~~~~~~~~~~~~ /* * 2.FreeFile関数の使い方 */ FreeFile関数 ~~~~~~~~~~~~ 主な目的は、空いているファイル番号を問い合わせて、 三流君の好きな固定番号処理、ファイル番号を重複して使うのを防ぐかなぁ。 前回、ファイルの書きこみテストで、Writeを使用しました。 Sub test031_6() Dim strFNAME As String 'ファイル名格納用 'ブックと同じ位置にtest031-6.txtを作成する strFNAME = ThisWorkbook.Path & "\test031-6.txt" 'ファイル名の作成 Open strFNAME For Output As #1 'ファイル番号1で新規作成 'テストデータ書き込み、 Write #1, "こんな感じかぁ、なんかなぁ" Write #1, Range("A1").Value '決り文句A1セル文章を出力 Print #1, Now & "に作成したファイルです" Print #1, "終わりです" Close #1 '開いたら閉じようね '終了メッセージの表示 MsgBox strFNAME & "を作成しました、確認してね" End Sub これくらいの小さなプログラムだと、あまり問題にならないのですが(本当かおい?) 基本的には固定処理はやめたほうがいいので、 この機会にFreeFile関数を覚えて、使ってみてください。 使い方は簡単で、 ^^^^^^^^^^^^^^ Sub test033_1() Dim strFNAME As String 'ファイル名格納用 Dim nFNO As Integer 'ファイル番号 'ブックと同じ位置にtest033-1.txtを作成する strFNAME = ThisWorkbook.Path & "\test033-1.txt" 'ファイル名の作成 nFNO = FreeFile() '空いているファイル番号をもらう Open strFNAME For Output As #nFNO '受け取った番号で新規作成 'テストデータ書き込み、 Write #nFNO, "こんな感じかぁ、なんかなぁ" Write #nFNO, Range("A1").Value '決り文句A1セル文章を出力 Print #nFNO, Now & "に作成したファイルです" Print #nFNO, "終わりです" Close #nFNO '開いたら閉じようね '終了メッセージの表示 MsgBox strFNAME & "を作成しました、確認してね" End Sub '---- nFNO = FreeFile() '空いているファイル番号をもらう ~~~~~~~~~~~~~~~~~ で、OKです。 なんだぁ、1固定のとこが変数になっただけですねぇ、 *値をFreeFileで取ってきただけですね。 #1の方がわかりやすいし、 入出力ファイルの数なんて覚えてるし、1から順にふってけば、 FreeFileなんて使わなくっていいよ なんて言う人はいないと思いますが(テストプログラムなら#1でいいと思いますよ) /* * 3.固定のファイル番号が好きな人達の災難 */ いつもの架空の小話に少しお付き合いください。 頼み方の悪いA先輩が新人のB君に、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String型でID番号、 String型で氏名、 String型で格納場所ドライブ付き後ろ¥ を渡すから、 受け取った場所+ID.txtファイルを新規で作成し、 1行だけID,氏名のデータを書いたファイルを作ってほしいんだぁ。 B君は確認で先輩に、 関数 XXXX(id as string, strNAME as string, strDIR as string) で、3つ変数を受け取り たとえば、 idにA100、氏名に三流君、格納場所にC:\Temp\ と入っていたとしたら、 C:\Temp\A100.txtを作成して、 1行目に A100,三流君 でいいんですね。 先輩は、OKそれで頼むよ。(おっ、話が通じるいい後輩だ?) なんて簡単なやり取りがあったとして。 新人君は、 下記のプログラムを作成した。 Sub MakeDataFile(strID As String, strNAME As String, strDIR As String) Open strDIR & strID & ".TXT" For Output As #1 'ファイルを新規作成 Print #1, strID & "," & strNAME 'データ書き込み Close #1 '開いたら閉じようね End Sub まったくそれくらい自分で作れよなぁ、、、と思いつつ、 テストの呼ぶ側も作成し、 Sub testmain() Call MakeDataFile("A100", "三流君", ThisWorkbook.Path & "\") End Sub OK出来あがり。 早く完成したけど、先輩に報告するとまたいろいろやらされるから(爆) 17時チョット前に出来たことにして今日は帰ろう (*冗談です、マネしないでね、、) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 次の日来てみると、朝っぱらから先輩が、 お前の作ったサブルーチンでファイルは既に開かれてますでこけるんだけど、 クローズ処理とかチャントしてる? などと、言って来た。 変なクレームつけやがってテメエが間違ってんダロと思いつつ、 ~~~~~~~~~~~~~~~~~~~~~~~~ テストもOKだった新人君は、エラーの原因がわからなかった。 ほらこんな感じだよと先輩にエラー発生場所を見せられた、、、 ~~~~~~~~~~~~~~~~~~ 新人君、しばらく考えて、 先輩のメインプログラムを見て、 新人君は激怒した!! ~~~~~~~~~~~~~~~~~~~ Sub TAKO_MAIN() Dim strREC '元データOPEN Open ThisWorkbook.Path & "\名簿.TXT" For Input As #1 'データが無くなるまでループ While EOF(1) = False Line Input #1, strREC '4桁と20桁に分けてサブ関数をコール Call MakeDataFile(Left(strREC, 4), _ Mid(strREC, 5, 20), _ ThisWorkbook.Path & "\") Wend Close #1 MsgBox "ファイル作成終了" End Sub なんと、 先輩のプログラム内でファイル番号1番を使用しており、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 自分のと重なっていたのが原因だった。 先輩に報告すると、 オレの番号を直すか、お前の番号を直すかと言われ、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ まぁ置換するだけだからイイヤと 自分の番号を2番に修正した。 Ken3)どっちもどっちだけどね、仲悪いよねこいつら(笑) ^^^^^^^^^^^^^^^^^^^^^^ Sub MakeDataFile(strID As String, strNAME As String, strDIR As String) Open strDIR & strID & ".TXT" For Output As #2 'ファイルを新規作成 Print #2, strID & "," & strNAME 'データ書き込み Close #2 '開いたら閉じようね End Sub ところが、 安易な修正はさらに混乱を呼び、 今度はC先輩がオレ2番使ってんだけど、などといってきた。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~おいおい、続くの?まだ終わらせようよ *実際は、ファイルをあまり同時に使っていないので、  Closeしてれば1番使いまわしでも大丈夫なんだけど。 なんてお馬鹿な連中なんでしょうね(笑) じゃなくって、 お互いが FreeFileの関数を使って作っていれば、 ~~~~~~~~~~~~~~~~~~~~~~ リンクさせてもスムーズに行った、 苦しい無さそうであるかもの小話でした。 /* * 4.終わりの挨拶 */ 今回は、 ・FreeFile関数の使い方 ・ファイル番号が重なるとエラーがでるよ。  (Ken3とゆかいな仲間達?) でした。 今回のサンプルは、 http://www.ken3.org/vba/lzh/vba033.lzh に test033-book.xlsと名簿.txtが保存されています。 遊んでくださいね。 *小話で作ったプログラム、#1と#2のままなので、  FreeFile版に変更してみてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.34 2002/12/27
┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい
[ページTOPへ戻る]

<┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい>

こんにちは、三流プログラマーKen3です。 今回は、 ┌──────────┐ │文字列を囲ってみたい│ └──────────┘ こんな感じの文字列を作ってみたいと思います。 よく、メルマガでもボタンの説明や、 タイトルの説明でも見るよね。 まぁまぁ。 気楽に読んでください。 /* * 1. やりたいこと */ VBAで楽しく と 文字列を受け取ったら、 ┌───────┐ │VBAで楽しく│ └───────┘ と、ワクで囲まれた文字列を作ってみたいです。 前回、フォームの作り方やったので、 ( Excelフォームの作成サンプルは http://www.ken3.org/vba/excel-form.html ) フォームを使用して作ってみます。 画面イメージは、 ^^^^^^^^^^^ 変換元文字列 _______________________ ┌──┐ │変換│ のボタンを設置、 └──┘ 変換結果 _______________________ _______________________ ←複数行入力表示可能なテキストボックスを作成 _______________________ 操作イメージは ^^^^^^^^^^^^^^ 変換元文字列に好きな文字を入力後、 変換のボタンを押す。 すると、変換結果が下のテキストボックスに表示される。 これを自分でコピーして使う(笑) /* * 2.フォームの作成 */ 部品を貼って、簡単に作成します。 *ここで美的センスが問われるんだけど、まぁいいや(おいおい) コントロールの名前を変えます。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ オブジェクトおよびコントロールに名前を付ける http://www.microsoft.com/japan/developer/library/modcore/deconnamingobjectscontrols.htm を参考に頭3文字で規則的な名前を付けます。 txtMOTO 変換元の文字列を入力するテキストボックス btnCONV 変換実行ボタン txtSAKI 変換結果の表示エリア 頭をtxt,btnの3文字にします。 (名称の規則が載ってるページをあとで探そう) 変更方法は簡単で、 コントロールを選択後、オブジェクト名を変更します。 (TextBox1とか自動で付いてるので、変更します) 同様に、btnCONVとtxtSAKIも変更します。 /* * 3.MultLineのプロパティをTrueにする */ 結果の文字列は、下記のように複数行になるので、 ┌───────┐ │VBAで楽しく│ └───────┘ MultLineプロパティをTrueにします。 ^^^^^^^^ 方法は、簡単で、コントロールを指定(txtSAKI)、 プロパティの一覧から、 MultLineを探して、Trueにするだけです。 ワクを大きく取ってても、このプロパティがTrueじゃないと、 改行を判断してくれないので、注意が必要です。 /* * 4.ボタンにClickイベントを書く */ いよいよ、終盤戦、気合を入れなおして。 次は、ボタンにClickイベントを書きます。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 方法は、簡単で、 ボタンのコントロールをダブルクリックすると、 いきなり Private Sub btnCONV_Click() End Sub となり、コードを書き込めます。 簡単にテストしてみたいですよね。 Private Sub btnCONV_Click() MsgBox "test" End Sub と中に打ちこみます。(芸が無いけどね) テスト方法は、F5を押すと、フォームが実行されます。 変換のボタンを押すと、画面にtestと表示されます。 /* * 5.テキストボックスの値の参照方法、と値の代入 */ ボタンが押されたら、変換処理を行います。 さてと、あれ?三流君、txtMOTOに入力された値って、どうやって取出すの? あと、結果をtxtSAKIにいれる時は? おっと、テキストボックスの値の表現方法ですよね、 これも簡単で、 txtMOTO.Value か 省略形でそのままtxtMOTOと変数みたいに使えます。 簡単なテストを書くと、 Private Sub btnCONV_Click() txtSAKI = txtMOTO & vbCrLf & "↑の文字数は" & Len(txtMOTO) & vbCrLf & "です" MsgBox txtMOTO & "が入力されました" End Sub なんか、思ったより簡単ですよね。 txtSAKI に txtMOTO & vbCrLf & "↑の文字数は" & Len(txtMOTO) & vbCrLf & "です" を代入してます。 そのまま、txtMOTO txtSAKI で使えるます。 見なれないvbCrLfは改行の定数です。 ~~~~~~~~~~~~~~~~~~ これで改行され、値を代入すると、txtSAKIに3行文字列が表示されてます。 /* * 6.ワクを作成するプログラムを書く */ ここまでで、必要な情報がそろったので、 ┌───────┐ │VBAで楽しく│ └───────┘ のワク作成をしてみたいと思います。 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 もう、ポイントも無いぐらい、 &で文字列をつなげる処理で書きました(笑) *長く書いて、次回以降のネタを残す姑息な目的もあったりして。 さて、テストしますか。 楽しくプログラム と 入れて、変換ボタンを押す。 あれ?なんか表示が変だ。 短いプログラムでもミスるとは、、、 良く見ろ三流プログラマー、フォントがプロポーショナルだからだよ、 テキストボックスのフォントを等倍に変えてみたら。 あっ、これかぁ。 テキストボックスのフォントプロパティを変えてと、 OKみたいですね。 そんなことであわてるから三流なんだよねキット。 /* * 7.終わりの挨拶 */ 今回は、 ・テキストボックス、ボタンの配置とテキストボックスマルチライン ・ボタンにイベントを書く ・テキストボックス値の参照、代入 でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba034.lzh に test034-book.xlsが保存されています。 遊んでくださいね。 次回は今回作ったフォームの問題点とかを少しやります。 ・半角文字ABCを入れると一発で問題点がわかったりしてね 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


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

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

カスタム検索
三流君(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系バックナンバー目次へ移動]