• ベストアンサー

ACCESSのTabStopについて

ACCESSのTabStopをVBAで制御する方法についての質問です。 メインフォーム「メイン」の中に サブフォーム「サブ」を配置しています。 一時的に「サブ」の中の全てのコントロールに対して TabStopを”いいえ”に設定したいのですが、 VBAで上手くコードが書けません。 ACCESSのバージョンは2000です。 どなたか回答をお願いいたします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

以下のコードで(自身の)フォーム上のコントロールを操作できます。 Name でコントロール名 ControlType で種別 (ヘルプに詳しく載ってます) TabStop は、True/False で 必要に応じて判別、設定してみてください。   Dim ctl As Control   Dim sTmp As String   sTmp = ""   For Each ctl In Me.Controls     sTmp = ctl.Name & vbNewLine     Select Case ctl.ControlType       Case acComboBox           sTmp = sTmp & "コンボボックス" & vbNewLine       Case acListBox           sTmp = sTmp & "リストボックス" & vbNewLine       Case acTextBox           sTmp = sTmp & "テキストボックス" & vbNewLine       Case acToggleButton           sTmp = sTmp & "トグルボタン" & vbNewLine       Case acCommandButton           sTmp = sTmp & "コマンドボタン" & vbNewLine       Case Else           sTmp = sTmp & "その他" & vbNewLine     End Select     MsgBox sTmp & ctl.TabStop   Next 対サブフォームであれば、 For Each ctl In Me.Controls を For Each ctl In Me.FSUB.Form.Controls に (FSUBは、フォームに配置したサブフォーム/サブレポートの名前です)

-marvel-
質問者

お礼

回答ありがとうございました。 select case とfor each を組み合わせる方法を 参考にさせていただいて 以下の通り、やりたかったことが実現できました。 とっても助かりました。 ありがとうございました。    'Tab移動不可 sTmp = "" For Each ctrl In Me.詳細.Controls sTmp = ctrl.Name Select Case ctrl.ControlType Case acTextBox ’テキストボックスなら sTmp = ctrl.Name Me(sTmp).TabStop = False End Select Next

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

今回のようにTabStopの「はい/いいえ」の切替だけなら、以下のような方法もあります。 (コントロールの種類によって、より細かい制御を行う場合は、No.1の方のように  Select Case を使うのが正当ですが) ◆コメントのせいで行数が多くなっていますが、コード本体はほんの数行です。 Private Sub Test1() 'エラーが発生した場合は「エラー処理」に飛ばす On Error Goto エラー処理   Dim Cntl As Control, PrpVal As Boolean   '『入力値』テキストボックスが空白かどうかで、タブ移動を切り替える場合   '(TabStopプロパティへの、Len関数の演算結果の代入により、文字長が   ' 0なら「いいえ(False)」、それ以外は「はい(True)」扱いになります)   PrpVal = Len(入力値 & "")   '『サブ』サブフォーム内の全コントロールのタブ移動を切替   For Each Cntl In Me!サブ.Controls     Cntl.TabStop = PrpVal   Next 終了処理:   '念のため、明示的にメモリを解放   Set Cntl = Nothing   Exit Sub エラー処理:   Select Case Err     Case 438       'ラベルなど、TabStopプロパティを持たないコントロールへの代入に       'よるエラー →無視して処理を継続       Resume Next     Case Else       '上記以外のエラー →メッセージを表示       MsgBox Err & ":" & Error$, , Me.Name & " Test1"       Resume 終了処理   End Select End Sub ・・・ところで、本当に必要な処理は、サブフォームのコントロールのTabStop なのでしょうか。 もしも「ある条件の下では、サブフォームへのタブ移動はさせないようにしたい」 ということだとすると、サブフォーム内のコントロールのTabStopを制御しても、 解決しません。 この場合は、コントロールとしてのサブフォームのTabStopを「いいえ」(False)に 設定してやる必要があります(サブフォーム内のコントロールは切替不要です)。 ※場合によっては、サブフォームのEnabledプロパティを「いいえ」にしてやる、   という手もあります。   (但しこの場合は、予めフォーカスをサブフォーム外に出す必要あり) Private Sub Test2() On Error Goto エラー処理   サブ.TabStop = (Nz(入力値, "") = "") 終了処理:   Exit Sub エラー処理:   MsgBox Err & ":" & Error$, , Me.Name & " Test2"   Resume 終了処理 End Sub

-marvel-
質問者

お礼

回答ありがとうございます。 今回は「30246kiku」さんの方法で処理しましたが 「DexMachina」さんの 『入力値』テキストボックスが空白かどうかで、タブ移動を切り替える方法も 別の場面で使えそうです。 勉強になりました。 ありがとうございました。

関連するQ&A

  • Access2000 サブフォームのRecordSet取得法

    Access2000を用い、メインフォームを作成(F_Main)し、 サブフォームコントロール(sub_from)を配置しました。 sub_formの「ソースオブジェクト」プロパティを別フォーム(F_Sub)とし、F_Subのレコードソースにはテーブル(T_Name)を設定しました。 つまり、メインフォームに子フォームが配置された状態です。 このF_Subのテーブルのレコードを操作するため、以下のプログラムを作りましたが、「フォームF_Subが見つかりません。」というエラーになってしまいます。 Dim rs as Recordset rs = Forms![F_Sub].RecordsetClone ← エラー メインフォームのモジュールでも、サブフォームのモジュールでもどちらにこのプログラムを記述してもエラーが発生します。 メインフォーム上に配置したサブフォームのレコードセットを取得し、操作する方法をご教授下さい。 環境 Windows 2000 Professional Access 2000

  • Access VBAでメインフォームとサブフォームを印刷するには?

    現在Access VBAを使用して開発をしております。 (Accessのバージョンは2003です。) メインフォームとサブフォームから成る画面があります。 以下、フォーム内に配置されているコントロールです。 <メインフォーム> ・コンボボックス(DB非連結) ・検索ボタン ・画面印刷ボタン <サブフォーム> ・表形式フォーム(DB連結) 画面の機能としては、メインフォームの検索ボタンをクリックしたら、 メインフォームのコンボボックスで選択されているデータに 該当するデータをサブフォーム内に表示しています。 この状態で画面印刷ボタンをクリックしたら 印刷プレビュー画面を表示しています。 ●サブフォームのデータは印刷プレビューで表示されているのですが、 メインフォームのコンボボックスで選択されたデータが表示されなくて 困っております。 メインフォームのコンボボックスをサブフォーム内に配置すれば 印刷プレビューで表示できるようになるのかもしれませんが、 できればメインフォーム上に配置しておきたいのです。 何か良い方法をご存知の方、ご教授いただきたく思います。 よろしくお願いします。

  • ACCESSで条件によってサブフォームを非表示に

    Accessの初心者です。よろしくお願いします。 Accessで住所録を作っています。 メインフォームは主に本人のデータを表示し、サブフォームで家族の データを表示するようにしました。 その時、家族がいない人についてはサブフォーム自体を表示しないようにしたいと思います。 そこで下記のようにしましたがうまくいきませんでした。 (1)サブフォーム内で家族の人数をカウントする。 (2)このカウント結果をメインフォームに表示する。(メインフォーム にテキストボックスを配置し、コントロールソースをサブフォームの 人数カウントにする。)     ここまではうまくいきました。 (3)ここでメインフォームのイベントの「開くとき」に以下のように記 述しました。(メインフォームのテキストボックスにカウントという  名前をつけました。) Private Sub Form_Open(Cancel As Integer) If Me!カウント = 0 Then サブフォーム.Visible = False Else サブフォーム.Visible = True End If End Sub この記述の仕方がまずいと思うのですが、どのようにすればよいか 分りません。よろしくお願いします。

  • Access2010 帳票サブフォームで

    Access2010 SP1を使用しています。 帳票サブフォームを含むフォームを作成しています。 1.そのフォームを開いている時、VBAで実際のフォーカス(カーソルがあって直接入力できる位置)が メインフォームにあるかそれともサブフォームにあるかを判断する方法はありませんでしょうか? メインで入力中でもRequery時などで、サブフォーム内のコントロールでEnterイベントが起きてしまい、 本当はサブフォーム内でカーソルが当たって入力する時だけに実行したい処理が動いてしまうのです。 そこでサブのイベントの方にメインで入力中は実行せず、サブで入力している時のみ実行するよう IFで分岐を入れたいのですができますでしょうか? 2.フォームフッタを含む帳票サブフォームでレコードソースが0件の時、 そのフッタにあるテキストボックスへのEnter時にSelLengthやSelStart、Textプロパティが実行できません。 Enter時なのに「コントロールがフォーカスを取得していないときに、コントロールのプロパティまたはメソッドを参照することはできません」 と出てしまうのです。 0件でなければエラーが出ないのですがどうすれば出るようになるのでしょうか?

  • access サブフォーム間の連動について

    Access2013について メイン親単票フォーム上に連動する二つのサブフォームを配置させました。 内一つは帳票、もう一つは単票にし、帳票からレコードを選択するとデータ詳細が単票側が連動するまで至りましたが、ここでサブフォーム帳票を並べ替えや抽出を実行すると、サブフォーム間の連動が出来なくなり、解決に困っております。 解決方法をご存知の方、お力添え願います。 親フォームに VBA Private Sub Form_Open(Cancel As Integer) Set Me.SubForm2.Form.Recordset = Me.SubForm1.Form.Recordset End Sub 抽出方法としては帳票サブフォーム上からとメインフォーム上からの実行までを試しておりますが、いずれも抽出後にサブフォーム間の連動が出来なくなってしまう状況です。 お力添え、宜しくお願いいたします。

  • ACCESS2000のメインフォームサブフォーム間の移動

    Access2000でメインフォームの中に詳細を確認/入力するためのサブフォームを作成しています。 メインフォームの中のコントロールを最後まで入力(enterで移動)していくと、メインフォームの最後のコントロールの次はサブフォームの最初のコントロールに移動します。(これは普通ですよね?) サブフォームはデータの詳細によっては1レコードで終わるものもありますし、複数レコードにわたるものもあります。 サブフォームの入力が終了したときに、キー操作でメインフォームの次のレコードの頭のコントロールに移動する事はできますか? マクロをAccessの方から設定するくらいならできるのですが、自分でSQLをうんぬんする知識はありません。 よい方法があったら教えてください。

  • ACCESS勉強中です。

    ACCESS勉強中です。関数について教えてください。 現在,サブフォームの「期日」の最新レコード(最終行)の値をピックアップしてメインフォームに表示させるようにしています。 やり方は,サブフォームのヘッダーにテキストボックスを配置してそれを コントロールソース=Last([期日]) 可視 いいえ 名前 最新期日 と設定したうえ,メインフォームにもテキストボックスを配置して コントロールソース=[サブフォームコントロール名].Form![最新期日] と設定しています。 以上により,メインフォーム上に,最新の期日をピックアップして,表示させることができているのですが,これから行おうと考えているのは,最新の期日の一つ前の期日も同じように,ピックアップしてメインフォーム上にピックアップして表示させることです。 本屋やネットで探してみましたが,なかなかやり方が見つかりません。そもそも関数でできるものなのかもいまいち分かりません…。 勉強不足のためわかりやすく質問することができていないかもしれませんが,どなたか教えていただければ幸いです。 よろしくお願いいたします。

  • アクセスのメインフォームのみRequeryしたい

    アクセスでフォームを作製しています。 シンプルに「メインフォームの中にサブフォームがある」形で作製し各フォームにはクエリをレコードソースとして指定しています。検索したいデータのコードを入力してそのデータを表示させる・・・という一般的なフォームなのですが、メインフォームのみRequeryさせたいのですができますか? [Forms].[メインフォーム].requery とするとサブフォームまで再計算されてしまいますが、ここでサブフォームは再計算させないで、メインフォームだけ再計算させたいのです。宜しくお願いします。

  • accessのメインフォーム内に、別のメーンサブを配置できないか

    access2003アカデミック版利用者です。accessのメインサブフォームを利用中に、しばしば、別のフォームや、テーブルを参照したいことがあります。accessのメインフォーム内に、別のメーンサブフォームを配置する方法を教えてください。(知人に教わったのですが、残念ながら忘れました)

  • ACCESS 合計の更新

    Accessにて、メイン・サブ形式のフォームがあります。 サブフォームには、取引のデータを入力するように設定しています。 ●サブフォーム  日付 重量 ・・・  メインのフォームには、サブフォームの合計の重量を表示させています。 サブフォームにて、重量を入力したときに、合計を更新させたいのですが、 次のレコードに移るなどしないと更新されませんよね? そこで、次のマクロを試してみたのですがうまくいきませんでした。 マクロにて、コントロールの更新後に  ・再クエリ  ・最後のレコードに移動(サブフォームを指定)  ・コントロールの移動 結果は、サブフォームが開いていませんというエラーが表示されます。 重量の間違いをなくすためにも、重量を入力または、更新したときに、 合計の重量も更新したいので、どなたかご教授願います。