【開発事例】Excel VBAで行単位の閲覧制御を行う仕組み|社内共有Excelで「自分に必要な行だけ表示する」実装アイデア
- yuji fukami
- 3 日前
- 読了時間: 10分

社内でExcelファイルを共有していると、次のような相談を受けることがあります。
「同じExcel台帳を複数人で使っているが、一部の行だけは特定の人にだけ見せたい」「金額や利益など、全員に見せたくない情報がある」「ただし、今のExcel運用を大きく変えずに対応したい」
本来、厳密な権限管理が必要な情報であれば、Excel単体ではなく、データベースやWebシステムでユーザー認証・権限管理を行う構成が望ましいです。
ただ、実務では、
すでにExcel台帳で業務が回っている
いきなりWebシステム化するほどの予算や期間はない
まずは社内運用レベルで、簡易的に見える範囲を制御したい
というケースも多くあります。
今回は、そのような場面で検討できる Excel VBAによる行単位の閲覧制御 の実装アイデアを紹介します。
※本記事は守秘義務に配慮し、実際の物件情報・住所・氏名・ファイル名・具体的な判定条件などは掲載せず、内容を一部抽象化して紹介しています。
今回の目的
今回の仕組みの目的は、社内で共有しているExcelブックに対して、利用者ごとに表示する行を切り替えることです。
例えば、同じ台帳の中に、
全員が見てよい共通行
Aさんだけが見てよい行
Bさんだけが見てよい行
管理者だけが見てよい行
が混在している場合に、Excel VBAで表示・非表示を自動制御します。
イメージとしては、次のような仕組みです。
Excel起動時は「承認」シートだけを表示する
PCユーザー名を自動取得する
利用者がパスワードを入力する
登録情報と照合する
認証に成功した場合だけ、対象シートを表示する
各行に設定されたユーザー情報を見て、表示する行を切り替える
Excel終了時には、対象シートを再び非表示に戻す
基本構成
今回のような仕組みを作る場合、ブック内には大きく分けて次のようなシートを用意します。
シート名 | 役割 |
承認 | 起動時に表示されるログイン用シート |
パスワード管理 | PCユーザー名とパスワードを管理するシート |
台帳シート | 実際に業務で使用するデータシート |
設定シート | 必要に応じて対象シート名や管理列などを設定 |
起動直後は、基本的に 「承認」シートのみ表示します。
その他のシートはVBAで非表示にしておき、認証が成功した場合のみ表示するようにします。
利用者の識別にはPCユーザー名を使う
今回のポイントの一つは、利用者の識別に PCユーザー名 を使うことです。
Excel VBAでは、次のような方法でWindowsのユーザー名を取得できます。
Environ$("USERNAME")または、環境によっては次のように取得することもできます。
CreateObject("WScript.Network").UserNameこれにより、利用者が毎回自分の名前を入力しなくても、Excelを開いた時点でPCユーザー名を自動取得できます。
ただし、PCユーザー名だけで認証を完結させるのは弱いため、実務では別途パスワード入力を組み合わせる形にします。
つまり、
PCユーザー名 + パスワードの組み合わせで照合するイメージです。
承認シートの役割
承認シートには、次のような項目を配置します。
項目 | 内容 |
PCユーザー名 | VBAで自動取得して表示 |
パスワード | 利用者が入力 |
照合実行ボタン | パスワード照合を実行 |
ブックを開いた直後は、この承認シートだけが表示されます。
利用者はパスワードを入力し、照合ボタンを押します。
照合に成功した場合のみ、業務用の台帳シートを表示します。

パスワード管理シート
パスワード管理シートには、次のような情報を保持します。
PCユーザー名 | パスワード |
PC-A | 1111 |
PC-B | 2222 |
PC-C | 3333 |
ただし、実運用ではパスワードをそのまま平文で保存するのは望ましくありません。

簡易的な社内運用であっても、可能であれば、
パスワード管理シートをVeryHiddenにする
シート保護をかける
ブック構造を保護する
VBAプロジェクトにもパスワードを設定する
パスワードをそのまま保存せず、ハッシュ化して比較する
といった対策を検討します。
ただし、Excel VBA上でのハッシュ化や保護も、厳密なセキュリティとは言い切れません。あくまで「通常利用者が簡単には見られないようにする」ための対策として考える必要があります。
行単位の表示制御の考え方
台帳シート側には、右端などに管理用の列を追加します。
例えば、次のような列です。
閲覧対象PCユーザー名各行に対して、この列に表示対象となるPCユーザー名を登録します。
行 | 閲覧対象PCユーザー名 | 表示ルール |
1行目 | 空白 | 全員に表示 |
2行目 | PC-A | PC-Aだけ表示 |
3行目 | PC-B | PC-Bだけ表示 |
4行目 | PC-C | PC-Cだけ表示 |
基本ルールはシンプルです。
管理列の値 | 表示 |
空白 | 全員に表示 |
自分のPCユーザー名と一致 | 表示 |
他のPCユーザー名 | 非表示 |
このルールにより、共通行と個人用行を同じ台帳内に混在させることができます。

自分専用の行として登録する処理
さらに、対象シート上に次のような「選択行を自分専用にする」ボタンを配置することもできます。

利用者が任意の行を選択してこのボタンを押すと、選択行の管理列に現在のPCユーザー名を自動入力します。
これにより、その行は次回以降、そのPCユーザーだけに表示される行として扱われます。
軽いサンプルイメージとしては、次のような処理です。
実際の開発では、管理列番号を固定値にせず、見出し名から列番号を取得したり、設定シートで管理したりすると、後から列構成が変わっても対応しやすくなります。
表示制御処理のイメージ
行の表示制御では、対象シートの各行を確認し、管理列の値に応じて行の表示・非表示を切り替えます。
考え方としては、次のような処理です。
このように、行ごとの管理列を見て、現在の利用者に表示してよい行だけを表示します。
起動時と終了時のイベント制御
この仕組みでは、Excelのイベント処理が重要になります。
特に使うのは次のイベントです。
イベント | 役割 |
Workbook_Open | 起動時に承認シートのみ表示する |
ボタンクリック | パスワード照合と対象シート表示 |
Workbook_BeforeClose | 終了時に対象シートを非表示に戻す |
Worksheet_Activate | 必要に応じて、シート切替時に行表示を再制御する |
起動時には、まず承認シートのみを表示します。終了時にも同じような設定を施しますが、こちらは保険の処理となります。
終了時には、対象シートを再び非表示に戻します。
このようにしておくことで、次回ブックを開いたときにも、最初から承認シートだけが表示された状態で開始できます。
ちなみに、「S_承認シートのみ表示」プロシージャではWorksheetオブジェクトの参照に「Worksheets」プロパティを利用していますが、この場合シート名を変更されるとマクロは動かなくなるので、より強固に実装するために下記の様に各シートのコード名をプロジェクトエクスプローラーで変更し、

次のように記述したほうが良いです。上記コードは「教材」としての説明用ですが、実際の開発ではこちらの記述方法を使用するのが正攻法です。
VeryHiddenを使ったシート非表示
Excelには通常の「非表示」と、VBAから設定する xlSheetVeryHidden があります。
通常の非表示であれば、Excelの画面操作から再表示できます。
一方、VeryHiddenにしたシートは、通常のExcel操作からは再表示できません。
Worksheets("台帳").Visible = xlSheetVeryHidden再表示するときは、VBAで次のようにします。
Worksheets("台帳").Visible = xlSheetVisibleこの仕組みにより、承認前の利用者が通常操作で対象シートを表示することを防ぎやすくなります。
ただし、VBAに詳しい人であれば解除できる可能性もあるため、過信は禁物です。
シート保護・ブック保護も併用する
今回のような仕組みでは、行の非表示だけでなく、シート保護も重要です。
例えば、次のような操作を防ぎたい場合があります。
管理列を勝手に編集される
非表示行を手動で再表示される
管理用の列を削除される
パスワード管理シートを編集される
シート構成を変更される
そのため、以下のような保護を組み合わせます。
1. ワークシート保護
Worksheets("台帳").Protect Password:="password", UserInterfaceOnly:=TrueUserInterfaceOnly:=True を指定すると、利用者の手動操作は制限しつつ、VBAからの編集は可能にできます。
ただし、この設定はブックを開き直すと保持されないため、Workbook_Open時に毎回設定し直す必要があります。
2. ブック構造の保護
ThisWorkbook.Protect Password:="password", Structure:=Trueこれにより、シートの追加・削除・移動・再表示などを制限できます。
3. VBAプロジェクトの保護
VBAエディタ側で、VBAプロジェクトにパスワードを設定します。
これにより、通常利用者が簡単にコードを閲覧・編集することを防ぎやすくなります。
ただし、VBAプロジェクトの保護も絶対的なものではありません。
実装時に注意すべき点
この仕組みを実装する際には、いくつか注意点があります。
1. Excel VBAは厳密なセキュリティ用途には向かない
Excel VBAによる制御は、あくまで社内運用向けの簡易的な閲覧制御です。
本当に厳密なアクセス制御が必要な場合は、Excelではなく、Webシステムやデータベース側でユーザー認証・権限管理を行うべきです。
特に、以下のような情報を扱う場合は注意が必要です。
個人情報
機密性の高い金額情報
契約情報
人事評価情報
法的・会計的に重要な情報
Excel上で隠すだけでは、完全な情報保護にはなりません。
2. マクロを無効にされた場合の挙動を考える
この仕組みはVBAによって表示制御を行うため、マクロが無効化されると制御が動きません。
そのため、ブック保存時には、
承認シートのみ表示
その他シートはVeryHidden
ブック構造を保護
という状態に戻しておくことが重要です。
これにより、マクロが無効の状態で開かれても、対象シートが最初から見えてしまうリスクを下げることができます。
3. 管理列は利用者に見えない位置に配置する
行ごとの閲覧対象PCユーザー名を管理する列は、通常の業務列とは分けて、右端などに配置するのが実務的です。
さらに、
管理列を非表示にする
シート保護で編集不可にする
VBAからのみ更新する
見出し名で列を特定する
といった工夫を行うと、誤操作を防ぎやすくなります。
4. 管理者用の例外処理を用意する
実運用では、管理者だけはすべての行を見たいケースがあります。
その場合は、パスワード管理シート側に権限列を追加します。
例:
PCユーザー名 | パスワード | 権限 |
PC-A | 1111 | 一般 |
PC-B | 2222 | 一般 |
PC-ADMIN | 9999 | 管理者 |
権限が「管理者」の場合は、すべての行を表示するようにします。
このようにしておくと、一般利用者と管理者で表示ルールを分けられます。
この仕組みでできること
このような構成にすると、既存のExcel台帳を活かしながら、次のような運用が可能になります。
自分に関係する行だけを表示する
他の利用者用の行を非表示にする
空白行は全員共通の行として表示する
管理者だけ全行を確認する
特定行を自分専用として登録する
起動時・終了時に自動で表示状態を初期化する
誤操作防止のためにシート保護を組み合わせる
Excelのまま運用を続けたいが、少しだけ閲覧範囲を制御したい、という場面では現実的な選択肢になります。
ただし「完全なセキュリティ」ではない
最後に重要な点として、Excel VBAでの閲覧制御は、完全なセキュリティ対策ではありません。
VeryHidden、シート保護、ブック保護、VBAプロジェクト保護を組み合わせても、Excelファイル自体を解析できる利用者や、VBAに詳しい利用者に対して完全に情報を隠すことは難しいです。
そのため、この仕組みは、
通常の社内利用者が、通常操作では見られないようにするための簡易的な閲覧制御として考えるのが適切です。
厳密な権限管理が必要な場合は、
Access
SQL Server
MySQL
PostgreSQL
Googleスプレッドシート + Apps Script
Webアプリ + データベース
クラウドサービス上でのログイン認証
など、データ側で権限管理できる構成を検討する必要があります。
もちろんExcelよりコストは増大しますが、セキュリティの要求面を考慮してソリューションを選ぶ必要があります。
まとめ
今回は、Excel VBAで行単位の閲覧制御を行う仕組みについて紹介しました。
ポイントは次の通りです。
起動時は承認シートのみ表示する
PCユーザー名を自動取得する
パスワード照合で利用者を確認する
各行に閲覧対象PCユーザー名を持たせる
自分のPCユーザー名と一致する行だけ表示する
空白行は全員に表示する
終了時には対象シートを再び非表示に戻す
VeryHidden、シート保護、ブック保護を組み合わせる
ただし、Excel VBAでは完全なセキュリティにはならない
Excel VBAは、単なる作業自動化だけでなく、既存のExcel運用に合わせた簡易的な業務制御にも活用できます。
もちろん、セキュリティ面の限界は理解しておく必要がありますが、「今あるExcelを活かしながら、社内運用を少し改善したい」という場面では、今回のような仕組みも有効な選択肢になります。



