• ベストアンサー

TextBoxのプログラムについて

氏名:Text1 に氏名を入力しデータベースを検索 (1)Text1に入力がない場合、エラーメッセージを表示し再入力 入力されていた場合 (2)データがあった場合には、顧客コード:Text2は入力不可 (3)データがない場合に、顧客コード:Text2は入力可 という風にしたいとします。 1.[Enter]を押されたら、Text2が入力可ならText2へ 不可ならText3へ 2.[TabIndex]はText1:1 Text2:2 Text3:3になっているとし 3.マウスで項目移動できる 4.終了ボタンで終了することができる という操作をしたい場合に、どのイベントにどういう内容をコーディングしたらいいのでしょう? 他の質問に答えていて、ちょっと不安になりました。 皆さんの方法を教えてください。 できれば、Text1でコーディングするすべてのイベントについて知りたいのです。 また、こういう仕様の方がよいというアドバイスでも結構です。 特に入力チェックのタイミングを教えて頂ければと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

VBをインストールしてしまった・・・ 最近プログラミングをしていないので、練習がてらにやってみたくなったので・・・ 例で挙げていたコントロールは、TABSTOPを無視する完全なバグコントロールが無かったし、プチバグ持ちのコマンドボタンも一つなので、フックする必要は無いですね^^ ※※※※重要:全てのTABSTOP=FALSE※※※※ 構成 Form1 ├Text1 ├Text2 ├Text3 └CommandButton1 Option Explicit Option Compare Text 'フォーカスインデックス Private Enum FCS_ID   FCS_TEXT1   FCS_TEXT2   FCS_TEXT3   FCS_CMD_CLOSE End Enum    Private fNow As FCS_ID '現在アクティブフォーカスを位置を表す、フォーカスインデックス Private fMem As FCS_ID '直前の有効なフォーカスを位置を表す、フォーカスインデックス 'テキスト1が変更されら、TAGを消す(TAGに値が入っているときは、チェックロジックを抜ける) Private Sub Text1_Change()   Text1.Tag = "" End Sub Private Sub Text1_GotFocus()   fNow = FCS_TEXT1   Call chkFocus End Sub Private Sub Text2_GotFocus()   fNow = FCS_TEXT2   Call chkFocus End Sub Private Sub Text3_GotFocus()   fNow = FCS_TEXT3   Call chkFocus End Sub Private Sub Command1_GotFocus()   fNow = FCS_CMD_CLOSE   Call chkFocus End Sub Private Sub Command1_Click()   Unload Me End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)   'タブキー入力なら   If KeyCode = vbKeyTab Then     'SHIFTキーを押した状態?     If (Shift And vbShiftMask) = 0 Then       'SHIFTを押していないなら、リターンキーの処理にしてしまう       KeyCode = vbKeyReturn     End If   End If   Select Case KeyCode     Case vbKeyReturn       'フォーカス移動:次       Call nextFocus(True)     Case vbKeyTab       'フォーカス移動:前       Call nextFocus(False)   End Select End Sub 'BEEP音制御 Private Sub Form_KeyPress(KeyAscii As Integer)   Select Case KeyAscii     Case vbKeyReturn, vbKeyTab, vbKeyEscape       KeyAscii = 0   End Select End Sub '初期設定(お好みで変更) Private Sub Form_Load()   Dim ctlWk  As Control      With Me     For Each ctlWk In .Controls       If TypeOf ctlWk Is TextBox Then         ctlWk.Text = ""         ctlWk.Tag = ""         ctlWk.BackColor = vbWhite         ctlWk.ForeColor = vbBlack       End If     Next ctlWk          .Command1.Caption = "閉じる"     .KeyPreview = True     .Show          Call Focus_Set(FCS_TEXT1)   End With End Sub '指定インデックスのコントロールにフォーカスを当てる 'コントロールを増やしたら、忘れずに Private Sub Focus_Set(inFcsId As FCS_ID)   Dim fWk   As FCS_ID   Dim ctlWk  As Control      'ワークにセット   fWk = inFcsId      'フォーカスインデックス範囲外のインデックスにならないように制御   If fWk < FCS_TEXT1 Then     fWk = FCS_TEXT1   ElseIf fWk > FCS_CMD_CLOSE Then     fWk = FCS_CMD_CLOSE   End If      'フォーカスを当てる   Select Case fWk     Case FCS_TEXT1:   Set ctlWk = Text1     Case FCS_TEXT2:   Set ctlWk = Text2     Case FCS_TEXT3:   Set ctlWk = Text3     Case FCS_CMD_CLOSE: Set ctlWk = Command1   End Select   ctlWk.SetFocus      '処理をOSに渡すことによりチェックロジックが走る   '本当はフォーカスが当たってはいけない位置を指定した場合、チェックロジックにより、   'アクティブなフォーカスが、適正な位置に配置されている   DoEvents      'チェックが走った後の現在のフォーカスを記憶   fMem = fNow End Sub '現在アクティブな位置のフォーカスによって、チェックする個所を限定する Private Sub chkFocus()   Select Case fNow     '現在テキスト2がアクティブなら     Case FCS_TEXT2       'テキスト1をチェック       If Not chkText1 Then         'エラーならフォーカスを戻す         Call Focus_Set(fMem)       End If   End Select      '現在アクティブなフォーカス位置を記憶   DoEvents   fMem = fNow      'アクティブなコントロールを選択状態   On Error Resume Next   With Me.ActiveControl     .SelStart = 0     .SelLength = Len(.Text)   End With   On Error GoTo 0 End Sub 'テキスト1のチェックロジック 'サンプルではテキスト1は「A」か「B」のみTRUE Private Function chkText1() As Boolean   chkText1 = True   If Text1.Tag <> "" Then     Exit Function   End If   Select Case Text1.Text     Case "A", "B"       '正常       Text1.Tag = "OK"       Text2.BackColor = Text1.BackColor       Text2.ForeColor = Text1.ForeColor     Case Else       'NG       'テキスト1の入力チェックがだめならフォーカスを戻す       Text1.Tag = ""       chkText1 = False       Text2.BackColor = vbInactiveBorder       Text2.ForeColor = vbGrayText   End Select End Function '次の使用可能なフォーカス位置を得る Private Sub nextFocus(inMode As Boolean)   Dim fWk As FCS_ID      fWk = fMem   Do     '次のフォーカスインデックスを算出     If inMode Then       fWk = fWk + 1     Else       fWk = fWk - 1     End If          '対象となるコントロールにフォーカスを当ててよいかチェック     Select Case fWk       Case FCS_TEXT2         '正常ならループを抜ける         If chkText1 Then           Exit Do         End If       Case Else         Exit Do     End Select   Loop   'フォーカスを当てる   Call Focus_Set(fWk) End Sub

taisuke555
質問者

お礼

回答ありがとうございます。 早速試してみました。 Text1にa,b以外を入れて、マウスでText3に移動したとき、Text2は見た目(あくまで見た目)が 変化しないのですが、この部分は、コーディングでなんとかなるのでしょうか? それ以外は、バッチリでした。 参考にさせて頂きます。 今回は、良い悪いは別にして、いろいろな人にどのようにコーディングしているか聞きたかったのですが、 この後、何人の人が答えてくれるか... まだ締めずに、回答を待ちますのでポイントの方はもう少しお待ちください。

その他の回答 (5)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

色を変えたのはおまけ機能のつもりでしたので、、、 こだわるのであれば Private Sub Text1_LostFocus()   Call chkText1 End Sub を加えるだけでいいのでは? ただ締め切りさえしてくれるのであれば、ポイントはどうでもいいです。

taisuke555
質問者

お礼

お礼が遅くなってすみません。 ちょっと、実行してみただけでしたので・・・ これ以上待っても、新しい回答はなさそうなので、この辺で締め切らせていただきます。 ありがとうございました。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.5

再びmaruru01です。 どのタイミングでデータベースの検索を行うかということではないでしょうか。 Text1に入力して、確定後にエンターキーを押すと、そこでデータベース検索(もちろんその前にText1の未入力チェックがありますが)して、あればText2を使用不可にしてText3へ、なければText2へという動作でしょうか。 マウス移動も対応するなら、やっぱり検索ボタンをつけるのがいいでしょう。 つまりText1入力後エンターキーを押すと、検索ボタンにフォーカスを移し、さらにエンターキーを押して(つまりボタンをクリックして)検索し、その結果によってそれぞれのテキストボックスへ移動する処理をします。 これなら、マウスで検索ボタンを押しても、その後に移動してくれます。 ちなみに、エンターキーをTabキーのように使用するというのであれば、以下のHPが参考になると思います。 http://www.interq.or.jp/www-user/komurak/enter/sample.html テキストボックス間の移動の場合は、私ならKeyDownイベント+keybd_eventAPIにしますが。

参考URL:
http://www.interq.or.jp/www-user/komurak/enter/sample.html
taisuke555
質問者

お礼

お礼が遅くなってすみません。 検索ボタンの件は参考にさせていただきます。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.4

こんにちは。maruru01です。 1.の条件なら、Text1のKeyDownイベントでKeyCodeを調べて、エンターキーなら、処理ルーチンを行うようにすればいいのではないでしょうか。 LostFocusイベントに書くと、終了出来ない場合が生じます。 ところで、Text1で判定を行う前は、Text2はどういう状態なのでしょうか。 各場合でのText1~3の使用可/不可の仕様によって、書き方は異なると思うのですが。 あと、No3.の人の言うように、データベース検索などは、検索ボタンを作る方がいいと思いますよ。

taisuke555
質問者

補足

回答ありがとうございます。 >1.の条件なら、Text1のKeyDownイベントでKeyCodeを調べて、エンターキーなら、処理ルーチンを行うようにすればいいのではないでしょうか。 マウスで移動された場合、別にコーディングするという事でしょうか? もう少し、具体的にアドバイス頂けるとありがたいのですが・・・ >データベース検索などは、検索ボタンを作る方がいいと思いますよ。 やはり今はそういう方が良いのでしょうか? 私はMS-DOSの頃の人間なのでマウスの使用と言うのがあまり好きでなく、 [Enter]で処理するプログラムは必須なのです。 ファンクションキーに割り付けたりもしますが、顧客を何人も登録するのに、いちいちファンクション押すのも面倒で・・・ 私の理想としては、[Enter]で最後の登録までいけるのが前提で、 私以外の人が使うために、マウス操作の処理やタブの処理等付け加えている状況です。 maruru01さんは、経験者ということですが、実際に会社相手にプログラミングすることがありますか? もしあれば、このごろの利用者向けのアドバイス等あったら教えてください。 別の質問になってしまうので、新しく質問した方がよいでしょうか?

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

ご質問者も回答を入れておられるのではないかと思う質問で、LostFocusイベントで解答して、不十分を指摘された者ですが、根本として (1)入力フィールドを入力後、コマンドボタンを押させ コマンドボタンのクリックイベントで複数項目の関連チェックする。 (2)テキストボックス等入力完了後、今後入力予定のコントロール(例テキストボックス)まで入力の可不可を制御する。 (3)入力が後の方のコントロールの入力後に、前に入力済みの項目と関連チェックをする。 本件は(2)だと思いますが(1)が一番簡単で安定性があると思いますが、SE根性が許さない?

taisuke555
質問者

お礼

回答ありがうとうございます。 SE根性というよりも「簡単なプログラムでできるに越したことはない。」というだけです。 私は自営業を営んでおりまして、できるだけ金をかけずにをモットーにしています。 プログラムを作ることだけが私の仕事ではないので、プログラムだけを作っているわけにはいきません。 ですから、プログラムを作るのも仕様書をばっちり作って・・・というわけにもいかず (ただ、めんどうなだけですが・・・) そんな訳でプログラムをつくりだしてから、項目が足りなかったり、処理を追加したり という事が頻繁に起きます。(なおさら、仕様を固めてからの方が良いのでしょうが) そこで、項目が増えたり、処理が追加されてもメンテナンスが楽なように プログラムを簡潔にしておきたいのです。 今回質問したものは、自分なりに作成し、正常に動いているのですが、 皆さんは、どんな仕様にして、どのようにコーディングするのか参考にしたかったのです。 ですから、良い悪いは別にして、いろいろな意見を聞きたいと思いました。 しかし、ここの質問は、回転が速く、質問してもすぐ画面から消え去ってしまって、 後は、回答を下さった方に補足なりで答えていただくのみで、新しい意見はあまり望めませんよね? そういう場合は、何度も質問した方がよいのでしょうか? もうしばらく締め切りませんので、いろいろな方の意見が入ればと思います。

回答No.1

はじめまして。 VBは初心者ですが、私だったら、次のようにすると思います。 >(1)Text1に入力がない場合、エラーメッセージを表示し再入力 入力されていた場合 >(2)データがあった場合には、顧客コード:Text2は入力不可 >(3)データがない場合に、顧客コード:Text2は入力可 text1のLostFocusイベントにif文で書いてみたらどうでしょうか。 私だったら、次のように書きます。 if me.text1.text = "" then msgbox "○○○" me.text1.setfocus else データを見つけるコード if でーたがあった場合 then me.text2.enabled = true else me.text2.setfocus end if >終了ボタンで終了することができる これは、フォームの×ボタンをクリックして終了させたいということですよね? 私だったら、次のように書きます。 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) end End Sub

taisuke555
質問者

お礼

早速の回答ありがとうございます。 この方法だと、マウスで動くときに、強制的にtext2にいってしまいますよね? 私はMS-DOS時代の人間なので、入力は項目順にと思うのですが、 WINDOWSはマウスで動かす人が多いので困ります。 その辺はどのように考えるか、もしよければ教えてください。

関連するQ&A

  • リストボックスから選択したデーターの一つだけを取得する

    VB5.0を使っています。 WIN2000です。 MDBとVBを使っています。 まず、顧客ID・顧客氏名・電話番号  この3つが1つのデータとして横並びの文字列で、リストボックスに表示されてゆきます。 リストボックスに表示したデータを選択し、その選択したデータの”顧客ID”だけを取り出して同じフォーム内のテキストボックスにいったん出し、そこから別のフォームに飛んでその”顧客ID”を元にデータの詳細を出す、といったものを作っていますが、 今のわたしの書いてるコードだけでは、何番の顧客IDを出しても、 別のフォーム(契約入力)に行くときには同じ1番の人のデータ詳細しか出ません。 「リストボックスから選択したデーターの一つだけを取得する」 には、どのようなコードを書けばいいか、教えていただけないでしょうか・・。 リストボックス(List1)から選択してテキストボックス(Text5)に取得する際にはすでに”顧客ID”だけを取り出したいのです。 今のコードでは、顧客ID・顧客氏名・電話番号 とすべてテキストボックス(Text5)にでてきてしまいます。 Private Sub cmnd2_Click()’選択ボタンclickでリストボックスのデータを取得。 Dim ListIndex As Integer Dim SelectedIndex As Integer Text5.Text = List1.List(List1.ListIndex)'→ここでリストボックスからデータを取得しています。 End Sub

  • Textboxの制御について

    現在年月日をmdbに格納するために Format(Text1(0), "0000") & Format(Text1(1), "00") & Format(Text1(2), "00") とプログラムしているのですが、このままだとインデックス(0)、(1)は空白の場合データがつめられて格納されてしまいます。 そこでIf Text1(0) = "" Then Text1(0).Text = "0000" End If If Text1(1) = "" Then Text1(1).Text = "00" End If と制御しているのですがこれだとTextBoxに0が表示され不具合がでてきてしまうのです、、、 これを防ぐにはどのようなプログラムをくむべきでしょうか、、、

  • access2000での重複不可項目の入力

    access2000,WIN98SEの環境です。 顧客コード・・・テキスト型、主キー、重複不可 顧客名・・・テキスト型 住所・・・テキスト型 というテーブルを作成し、そこへ登録するフォームを作成しています。 顧客コードは修正時は入力不可としており、追加というボタンを押すとそこへ移動できるようにしています。 追加時に顧客コードで既に登録してあるコードを入れると、Dcount関数を用いて重複レコードがあった時はエラーメッセージを出しています。 その後、カーソルは顧客コードの末尾に移り(100|という感じです)、backspaceキーで100を消して再度入れ直そうとすると再び重複エラーのメッセージが出てしまいます。 Escキーを押すと、コード自体がシロ抜きになり入力することができるのはわかったのですが、Escキーを押すという行為をVBAで現すことはできるのでしょうか? よろしくお願い致します。なお、マクロは使用しておらずVBAでのコーディングで処理をしています。

  • データ更新後にDlookupによるデータ表示

    困っています。フォームで、フィールド[氏名コード]に入力したら、マスターテーブル「名前表」(フィールド名:[名前コード],[名前])を参照して、テキストボックス[氏名]に名前を表示するようにしたいと思います。テキスト[氏名]のデータプロパティに =Dlookup([名前],[名前表],[氏名コード]=[名前コード])としたら、最初は、うまく表示されますが、2回目にデータ更新したら、すぐに更新後のデータが表示されません。一度、フォームを閉じて、また開いたら更新後のデータが表示されますが・・・・更新後のイベントなど使って、すぐ表示されるようにできないでしょうか?よろしくお願い致します。

  • 【Excel VBA】UserForm上のTextBoxについて

    UserForm上にTextBoxを配置し テキストを入力後Enterを押すことで中身を判定するロジックをKeyUp関数内に設けているのですが、 たまにEnterが反応しないことがあります。 その他のキー入力は入りますし、 Enter自体も一旦他のウィンドウをアクティブにしてから 再度UserFormをアクティブに戻して入力すると反応します。 Enterが押されるまでは以下のコードにより関数を抜けています。 If KeyCode.Value <> vbKeyReturn Or TextBox1.Value = "" Then Exit Sub 再現性もないので何が原因なのか判りません。 よろしくお願いいたします。

  • テキストボックスでの行の認識

    テキストボックスで2行以上入力不可にしたいんですが、方法が分かりません。 単に改行を含むのならEnterキーの2回目を押せなくすればいいのですが、テキストボックスって端までいくと自動的に2行になりますよね。この場合は改行コードが入ってないんです。だから単純にEnterキーの制御だけでは出来ないんです。 なにか良き方法が有れば教えていただけないでしょうか?

  • ACCESSについて質問させてください。

    ACCESSの勉強中の者です。 現在,基礎的なデータベースファイルを作成し「顧客マスター」というフォーム上に「顧客番号」,「顧客氏名漢字」,「顧客氏名ふりがな」,「顧客職業」というテキストボックス等を配置しています。 このフォーム上に新たに「顧客氏名」というコンボボックスを配置して,「顧客氏名漢字」,「顧客氏名ふりがな」に入力済みのデータからコンボボックスのデータを選択できるようにしたいと思っています(※例えば,テキストボックス「顧客氏名漢字」欄に「山田太郎」,テキストボックス「顧客氏名ふりがな」欄に「ヤマダタロウ」と入力されているのであれば,コンボボックス「顧客氏名」欄には「山田太郎」,「ヤマダタロウ」から選択させる。)。 コンボボックスのプロパティのコントロールソース(又は値集合ソース,値集合タイプ)の記述でなんとかできるものでしょうか?それともVBAが必要なのでしょうか? 方法があるのであれば,その方法は問いませんのでどなたかご教示いただければと思います。 よろしくお願いいたします。

  • TextBoxの入力・表示の判別方法

    VBAでTextBoxを入力・表示用兼用にしたProgを作っています。 表示の場合は、TextBox.Textへデータをセットしています。 TextBoxの値が変化した場合は、Changeイベントが発生しますが、 TextBox_change()の処理において、 イベントがキーボード入力で発生したものか、Progの内部セットで発生したものかを判別するのに苦労しています。 適切な判別方法の教えて頂きたくよろしくお願いします。

  • Excel VBAで教えてください。

    Excel VBAで教えてください。 テキストデータをExcelで読み込んだ後、Sheet1に以下のデータが入っており、 A列 B列   C列 氏名 開始日(yyyy/mm/dd) 終了(yyyy/mm/dd) テキストボックスに開始日(yyyy/mm/dd)、終了日(yyyy/mm/dd)、を入力し、入力した開始日から終了日のデータ検索し、A列からのデータをコピーし、Sheet2に貼り付けしたい。 テキストデータをExcelで読み込むコードはできたのですが、その後の処理ができずに困っています。 ユーザーフォームに入力するコードも教えてください。

  • テキストボックスの入力可/不可を切り替えた場合のリターンキーでの移動について

    VB6でマスタメンテ系のプログラムを作っています。 あるテキストボックスの内容によって、その次のテキストボックスの 入力可/不可を切り替えているのですが、1つ目のテキストボックス に値を入力してリターンキーで移動すると、次のテキストボックスが 入力可であっても、タブはそれを飛ばしてその次の項目に位置づいて しまいます。1つ目のテキストボックスに入力した後、イベントを 拾って、SetFocusか何かしてやらないといけないのでしょうか? 2つ目のテキストボックスに位置付ける方法があれば、アドバイス いただければと思います。よろしくお願いします。

専門家に質問してみよう