初めて自分の家と他人の家が違う、と意識した時

ACCESSのTabStopをVBAで制御する方法についての質問です。

メインフォーム「メイン」の中に
サブフォーム「サブ」を配置しています。
一時的に「サブ」の中の全てのコントロールに対して
TabStopを”いいえ”に設定したいのですが、
VBAで上手くコードが書けません。

ACCESSのバージョンは2000です。
どなたか回答をお願いいたします。

A 回答 (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は、フォームに配置したサブフォーム/サブレポートの名前です)
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
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

お礼日時:2009/01/27 19:55

今回のように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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/27 20:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す