- ベストアンサー
ACCESSのTabStopについて
ACCESSのTabStopをVBAで制御する方法についての質問です。 メインフォーム「メイン」の中に サブフォーム「サブ」を配置しています。 一時的に「サブ」の中の全てのコントロールに対して TabStopを”いいえ”に設定したいのですが、 VBAで上手くコードが書けません。 ACCESSのバージョンは2000です。 どなたか回答をお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
以下のコードで(自身の)フォーム上のコントロールを操作できます。 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は、フォームに配置したサブフォーム/サブレポートの名前です)
その他の回答 (1)
- DexMachina
- ベストアンサー率73% (1287/1744)
今回のように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
お礼
回答ありがとうございます。 今回は「30246kiku」さんの方法で処理しましたが 「DexMachina」さんの 『入力値』テキストボックスが空白かどうかで、タブ移動を切り替える方法も 別の場面で使えそうです。 勉強になりました。 ありがとうございました。
お礼
回答ありがとうございました。 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