Accessフォームのコントロールを非表示にする方法とVBAの注意点

概要

この記事の結論
Accessフォームのコントロールを常に隠すには、デザインビューで対象を選び、「可視」を「いいえ」に設定します。条件に応じて切り替える場合はVBAのVisibleを使い、選択値の更新後とレコード移動時の両方で判定します。非表示にしても保存データは消えず、閲覧権限の制限にもならない点に注意しましょう。
Visibleとは、フォームなどのコントロールを表示するかどうかを指定するプロパティです。

この記事でわかること

  • 常時非表示は可視をいいえにする
  • 条件変更とレコード移動で再判定する
  • フォーカスとラベルも確認する
  • 画面の非表示と権限制御を区別する

この記事の主な内容

  1. 非表示と使用不可と編集ロックの違い
  2. プロパティで常に非表示にする
  3. 条件に応じてVBAで表示を切り替える
  4. 切替漏れと実行時エラーを防ぐ
  5. 帳票フォームとデータシートでの注意点
  6. 隠した値の扱いと公開前の確認
  7. よくある質問

想定読了時間:約12分~15分


非表示と使用不可と編集ロックの違い

フォームの項目を見せたくない場合はVisibleを使います。表示を残して編集だけを禁止する場合はLocked、操作対象から外す場合はEnabledが候補です。どの操作を止めたいかによって設定を選びます。[1][3][4]

設定主な役割利用例
可視 Visible画面に表示するか条件に該当しない入力欄を隠す
使用可能 Enabled利用者が操作できるか現時点で使わない操作を無効にする
編集ロック Locked内容の編集を許可するか内容を見せて変更だけを防ぐ

見せたままコピーさせたい場合

テキストボックスの内容を選択・コピーできるようにするなら、通常は使用可能を[はい]、編集ロックを[はい]にします。使用可能を[いいえ]にすると、同じ操作感にはなりません。非表示にすると、当然ながら画面から値を読むこともできなくなります。

3つの設定を使い分けるについて、Visible:見せるか、Enabled:操作できるか、Locked:編集できるかを説明した図

非表示はデータの削除や権限制御ではない

VisibleをFalseにしても、テキストボックスの値や連結先の保存データが自動的に削除されることはありません。計算や他の処理で参照する部品を、画面だけ隠す用途もあります。常に隠す項目だからといって、参照関係を調べず削除しないでください。

また、フォームで項目を隠しても、元テーブルや別フォームから読める可能性があります。機密データを利用者に見せない要件では、データソースやファイルの権限を含めて設計します。画面を簡潔にする設定としての非表示と、アクセス制限を区別しましょう。


プロパティで常に非表示にする

常に表示しない欄は、デザインビューで[可視]を[いいえ]に設定します。変更前にテキストボックスの名前を控え、どの部品を変更したか記録します。以下は「txtその他」という欄を隠す例です。[1][2]

手順操作確認すること
1フォームをデザインビューで開く業務用原本ではなくコピーで試す
2txtその他を選択するラベルではなく入力欄を選ぶ
3F4でプロパティシートを開く名前がtxtその他である
4[書式]の[可視]を[いいえ]にする非表示の設定になる
5保存しフォームビューに切り替える対象欄が見えなくなる
常に非表示にする手順について、デザインビューを開く、対象を選択、可視をいいえ、フォームビューで確認を説明した図

デザインビューで見えるのは異常ではない

非表示にしたコントロールも、設計を編集するためにデザインビューでは確認できます。利用者の操作画面でどう見えるかはフォームビューで判断してください。設定対象がフォーム全体やセクションになっていると、意図しない範囲を隠す原因になります。

ラベルや関連ボタンも確認する

入力欄と一緒に隠れる付属ラベルがある一方、独立して配置したラベルや説明文は別のコントロールです。入力欄だけ消えて見出しが残った場合は、その名前と可視設定を確認します。関連する参照ボタンなども、画面の意味が通る状態にそろえます。

非表示にしても、周囲の部品が自動で詰まるとは限りません。空白が大きく残る場合は、入力欄の配置やセクション構成を見直します。多数の項目を条件で切り替える画面では、タブや別画面へ分ける方が分かりやすい場合もあります。


条件に応じてVBAで表示を切り替える

「区分がその他のときだけ補足欄を出す」場合は、選択値に応じてVisibleを変更します。選択した直後だけでなく、フォームを開いたときやレコードを移動したときにも表示を合わせる必要があります。[1][6][7]

サンプルの前提をそろえる

単票の連結フォームに、次の部品を用意します。cbo区分の値は数値IDとし、「その他」のIDを4にします。画面に表示される「その他」という文字と、実際に保存される4を混同しないでください。実際の区分マスターが異なる場合は条件を変更します。

コントロール名種類と役割設定の前提
cbo区分区分を選ぶコンボボックス常に表示・使用可能。保存値4がその他
txtその他補足を入力するテキストボックス必要に応じて表示する
lblその他独立した説明ラベルtxtその他と同じ条件で表示
条件による表示切替について、区分を選択、条件を判定、その他のとき表示を説明した図

表示処理を1か所にまとめる

フォームの[レコード移動時]とcbo区分の[更新後処理]を[イベント プロシージャ]に設定し、フォームのモジュールへ以下を記述します。すでに同名イベントがある場合は、新しいイベントを重ねて作らず、既存処理へ共通処理の呼び出しを組み込みます。

Private Sub UpdateOtherVisibility()
    Dim showOther As Boolean
    Dim activeCtl As Control
    showOther = (Nz(Me!cbo区分.Value, 0) = 4)

    If Not showOther Then
        ‘ 初期表示時はActiveControlを取得できない場合がある
        On Error Resume Next
        Set activeCtl = Me.ActiveControl
        On Error GoTo 0
        If Not activeCtl Is Nothing Then
            If activeCtl.Name = “txtその他” Then
                Me!cbo区分.SetFocus
            End If
        End If
    End If

    Me!txtその他.Visible = showOther
    Me!lblその他.Visible = showOther
End Sub

Private Sub Form_Current()
    UpdateOtherVisibility
End Sub

Private Sub cbo区分_AfterUpdate()
    UpdateOtherVisibility
End Sub

Nzは未選択のNullを0として判定するために使っています。この例では0を「その他以外」と扱います。On Error Resume Nextの範囲は、初期表示時のActiveControl取得だけに限定しました。非表示処理全体のエラーを無視するコードにはしていません。

表示条件を再判定する場面について、選択変更:AfterUpdate、レコード移動:Current、共通処理:表示を同期を説明した図

プログラムから選択値を変える場合

VBAでcbo区分の値を代入しても、そのコントロールのAfterUpdateが自動実行されるとは限りません。プログラムで値を変更する経路がある場合は、代入後にUpdateOtherVisibilityを明示的に呼びます。クリックで変える経路だけをテストしないことが重要です。[7]


切替漏れと実行時エラーを防ぐ

表示が前のレコードのまま残る場合は、Currentで再判定しているかを確認します。選択肢を変更した直後は正しくても、フォームを開き直すと違う状態になる場合は、初期表示やデータ読込の順序も見直します。

入力中のコントロールを先に非表示にしない

フォーカスとは、キーボード入力を受け取る位置です。フォーカスがあるコントロールに対してVisibleをFalseにすると、エラーになります。先に表示中かつ使用可能な別コントロールへSetFocusで移動し、その後で隠します。[8]

先ほどの例では、txtその他にフォーカスがある場合だけcbo区分へ移しています。移動先まで非表示・使用不可にすると、この回避策は機能しません。別の部品名へ置き換える場合は、移動先を常に操作可能にする前提も引き継いでください。

フォーカスとラベルを確認について、入力位置を別の欄へ、入力欄を非表示、独立ラベルも同期を説明した図
症状確認する点対応の方向性
変更後は正しいが移動後は違うForm_Current移動時にも共通処理を呼ぶ
未選択時に判定が合わないNullの扱い未選択時の表示仕様を決める
非表示にする行でエラーフォーカス先に別の使用可能な欄へ移す
ラベルだけが残る独立ラベルのVisible名前を確認して同じ条件で同期
VBAで値を変えると更新されない処理の呼出経路代入後に表示更新を呼ぶ
他の操作後に再表示される別イベントの設定Visibleを書き換える箇所を調査

コードが実行されないときは設定を確認する

イベント欄が空のままでは、コードを書いただけで期待するタイミングに呼ばれないことがあります。また、信頼されていないファイルではコードの実行が制限される場合があります。出所を確認できるファイルについて、組織の運用に沿って信頼設定を確認します。

表示条件が複雑なAccessフォームの改修が必要な場合は

まずは本記事の手順をコピー上で試し、設定と保存先を確認してください。既存VBAや複数の画面、外部データへの影響が分からない場合は、変更範囲を調査してから改修する方法が適しています。

Accessの教科書ではAccessの開発・保守・改修やSQL Serverとの連携を扱っています。ご相談時には、発生する画面、操作手順、エラー内容、利用環境を整理すると状況を共有しやすくなります。


帳票フォームとデータシートでの注意点

単票フォームで動くコードを、そのまま一覧画面へ適用すると意図が変わることがあります。帳票フォームは同じコントロールを複数レコード分繰り返して表示します。Visibleを変更すると、同じ欄の全行へ影響し、特定行だけの非表示にはなりません。

行ごとの表示は画面の設計を見直す

「その他の行だけ補足を見せたい」場合は、一覧では結果を演算式で空欄にし、詳細入力は単票フォームで行うなどの構成が考えられます。演算式で表示を空欄にしても、元データの削除や権限制御にはなりません。編集可能な入力欄を行ごとに隠す要件とは区別します。

条件付き書式は、条件に応じて色などを変える用途で検討できます。ただし、Visibleによる完全な非表示と同じ機能ではありません。文字と背景を同じ色にして見えなくする方法は、コピーや別表示で読める可能性があり、秘密情報の保護には使えません。

表示形式による違いについて、単票:現在の画面に適用、帳票:同じ欄の全行に適用、データシート:ColumnHiddenを説明した図

データシートの列はColumnHiddenで制御する

フォームビューでVisibleをFalseにしても、対応するデータシートの列が同じように隠れるわけではありません。データシートではColumnHiddenを使います。次の例は、データシート表示の対象フォームにあるtxtその他の列を隠す場合です。[5]

Me!txtその他.ColumnHidden = True

表示形式によって使う設定が違うため、単票・帳票・データシートのどの画面で見せないのかを仕様に書きます。利用者がビューを切り替えられる場合は、切替後の状態も確認してください。


隠した値の扱いと公開前の確認

その他欄へ文字を入力した後に区分を変更しても、VisibleをFalseにしただけでは値は残ります。再びその他へ戻したときに復元したいなら保持が適しています。一方、区分変更後に不要な補足を集計や帳票へ出したくないなら、保存・表示条件を別途決めます。

扱い向いている場合注意点
値を保持する選択を戻したとき再入力を減らしたい帳票や集計で対象条件を適用
確認して消去する非該当の値を残してはいけない保存データの更新として設計
入力を止めて修正を促す区分と補足の整合が必須利用者が直せる案内を用意
隠した値の扱いを決めるについて、保持:再表示に備える、消去:確認して処理、集計:対象条件を指定を説明した図

必須条件と矛盾しないようにする

その他の場合だけ入力必須なら、補足欄を常時必須にする設定では整合しません。区分に応じて入力条件を確認する必要があります。下の例はフォームの更新前処理に追加する条件です。既存のForm_BeforeUpdateがある場合は、その中へ統合します。[9]

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Nz(Me!cbo区分.Value, 0) = 4 Then
        If Len(Trim(Nz(Me!txtその他.Value, “”))) = 0 Then
            Cancel = True
            UpdateOtherVisibility
            MsgBox “その他の内容を入力してください。”, vbExclamation
            Me!txtその他.SetFocus
        End If
    End If
End Sub

このチェックは当該フォームから保存する経路を対象にしています。他の画面やインポートも含めて守るべき条件なら、テーブルや接続先DB側の制約も検討します。画面の表示条件だけでデータ整合性を保証しないことが大切です。

表示の往復とレコード移動を試す

未選択で開く、その他を選ぶ、文字を入力する、別の区分へ戻す、再びその他へ戻す、別レコードへ移動する、開き直す、という順で確認します。表示状態と値の保持が仕様どおりかをそれぞれ見ます。条件を片方向へ変えるテストだけでは、切替漏れを見落とします。

公開前の切替チェックについて、未選択から開始、条件を往復して変更、前後のレコードへ移動、保存と再表示を説明した図

非表示にする項目が増えた場合は、Visibleを書き換える処理を分散させず、表示条件を共通処理へまとめます。どの条件で何を表示するかが追える状態を保つと、将来の区分追加や画面変更にも対応しやすくなります。


よくある質問

削除されません。Visibleは表示の設定です。値を消す必要がある場合は、利用者確認や保存処理を含めて別に設計します。

入力欄と独立したラベルなど、別コントロールになっている可能性があります。対象の名前を確認し、同じ表示条件で切り替えます。

選択肢のAfterUpdateだけで判定し、Form_Currentで再判定していない可能性があります。共通処理を両方から呼ぶ設計を確認してください。

Visibleの変更は同じコントロールの全行へ作用します。行ごとの表示が必要なら、一覧と詳細を分けるなど別の構成を検討します。

対象にフォーカスがあることが代表的な原因です。表示中で使用可能な別のコントロールへ移動してから非表示にします。

十分ではありません。別の画面やデータソースへ直接アクセスできる可能性があります。データベースやファイルの権限も設計してください。

表示条件が複雑なAccessフォームの改修が必要な場合は

まずは本記事の手順をコピー上で試し、設定と保存先を確認してください。既存VBAや複数の画面、外部データへの影響が分からない場合は、変更範囲を調査してから改修する方法が適しています。

Accessの教科書ではAccessの開発・保守・改修やSQL Serverとの連携を扱っています。ご相談時には、発生する画面、操作手順、エラー内容、利用環境を整理すると状況を共有しやすくなります。


参考情報

[1] Visible
https://learn.microsoft.com/en-us/office/vba/api/access.textbox.visible

[2] 可視プロパティ
https://support.microsoft.com/en-us/access/visible-property

[3] Locked
https://learn.microsoft.com/en-us/office/vba/api/access.textbox.locked

[4] Enabled
https://learn.microsoft.com/en-us/office/vba/api/access.textbox.enabled

[5] ColumnHidden
https://learn.microsoft.com/en-us/office/vba/api/access.textbox.columnhidden

[6] Current
https://learn.microsoft.com/en-us/office/vba/api/access.form.current

[7] AfterUpdate
https://learn.microsoft.com/en-us/office/vba/api/access.combobox.afterupdate-event

[8] SetFocus
https://learn.microsoft.com/en-us/office/vba/api/access.textbox.setfocus

[9] BeforeUpdate
https://learn.microsoft.com/en-us/office/vba/api/access.form.beforeupdate-event

[12] 条件付き書式
https://support.microsoft.com/en-us/access/copy-the-conditional-formatting-of-a-control

関連記事

Accessの入力規則でテーブルのデータを制限する方法

Accessのデータ入力用フォームの作成方法と保存の基本

Accessフォームにテキストボックスを配置する方法と連結の違い

Accessフォームの作成方法と用途に合う画面の選び方

TOP