アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクセスのフォームの、フォームヘッダーに検索用テキストボックスとコンボボックスがあり、
詳細エリアにレコードソース(コントロールソース)に紐付いたテキストボックスが複数あります。

フォームヘッダーのフィルタを解除するコマンドを実行して、
フォームヘッダーのテキストボックスとコンボボックスをnullにしたいのですが、
vbaで「もしフォームヘッダーなら」ってするにはどうすればいいでしょうか?

フォームヘッダーのコントロール名も詳細エリアのコントロール名も
区別のないコントロール名でなのでコントロール名で条件分岐をすることは不可能です。

Private Sub フィルタを解除コマンド_Click()

Dim ctl As Control
For Each ctl In Me.Controls
If (ctl.ControlType = acTextBox) Or (ctl.ControlType = acComboBox) Then
'ここで、もしフォームヘッダーにコントロールがあるのならってしたい
Me.Controls(ctl.Name) = Null
End If
Next ctl

Me.Form.FilterOn = False
End Sub

このコードに付け加えてくれませんか?

Debug.Print ctl.Name
でコントロール名を取得するとフォームヘッダーも詳細もどちらのコントロール名も取得されてしまいます。

On Error Resume Next
以外でお願いします。

「もしフォームヘッダーにコントロールがある」の質問画像

A 回答 (1件)

> vbaで「もしフォームヘッダーなら」ってするにはどうすればいいでしょうか?



コントロールの「Section」プロパティを確認すればOkです。

Private Sub フィルタを解除コマンド_Click()

  Dim ctl As Control

  For Each ctl In Me.Controls
    If (ctl.ControlType = acTextBox) Or (ctl.ControlType = acComboBox) Then
      'フォーム ヘッダは「1」(『詳細』は「0」、フォームフッターは「2」)
      If (ctl.Section = 1) Then
        'Valueプロパティを使用して、直接入力できます
        '(さらに、Valueプロパティは省略可能なので「ctl = Null」でもOk)
        ctl.Value = Null
      End If
    End If
  Next ctl

  Me.Form.FilterOn = False

End Sub


なお、操作対象がフォームヘッダのみなのでしたら、ループ対象を「Me.Controls」と
する代わりに、「Me.Section(1).Controls」とした方が、ループを行うコントロールが
フォームヘッダ内のコントロールに限定される分、効率的です。
(コントロールのSectionプロパティによる分岐も不要化します)

Private Sub フィルタを解除コマンド_Click()

  Dim ctl As Control

  '「Me.Section(n)」の「n」は、上のコントロールのSectionプロパティの値と同じ
  For Each ctl In Me.Section(1).Controls
    If (ctl.ControlType = acTextBox) Or (ctl.ControlType = acComboBox) Then
      ctl.Value = Null
    End If
  Next ctl

  Me.Form.FilterOn = False
End Sub


・・・以上です。
    • good
    • 0
この回答へのお礼

For Each ctl In Me.Section(1).Controls
これにしちゃえば、無駄にループしなくていいですね。
いくつもの方法のご提示、ありがとうございます。

お礼日時:2013/01/31 21:37

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A