top of page

​タグ一覧

配列処理(73)

階層化フォーム(33)

ファイル操作(28)

開発事例(25)

シート・セル操作(20)

図形操作(15)

講座実施報告(12)

設計思想(11)

ユーザーフォーム(10)

コード自動生成(10)

数学(8)

文字列操作(8)

開発効率化(6)

GAS(5)

アニメーション(5)

技術解説(4)

イミディエイトウィンドウ(4)

Googleスプレッドシート(4)

副業(4)

クリップボード(4)

条件付き書式(4)

その他(4)

Webアプリ(4)

OneDrive(3)

イベントプロシージャ(3)

ココナラ(3)

小説(3)

HTML(3)

JavaScript(3)

Enum(2)

PDF(2)

フリーランス(2)

リスキリング(2)

Outlook(2)

介護(2)

Discord(2)

シフト表(2)

LookerStudio(2)

日報(2)

カレンダー(2)

公開ツール(2)

罫線(2)

パズル(2)

小ネタ(2)

コード解説(2)

クラスモジュール(2)

Antigravity(2)

デスクトップアプリ(2)

ステータスバー(1)

コード解析(1)

バックアップ(1)

可変長引数配列(1)

ブック処理(1)

スクレイピング(1)

スプレッドシート(1)

coconala(1)

リボン登録マクロ(1)

QRコード(1)

実行予約(1)

給与計算(1)

VBA不使用(1)

リボン(1)

超勉強会(1)

スピログラフ(1)

図名描写(1)

連想配列(1)

溶接ロボット(1)

保育士(1)

楽天市場(1)

経理(1)

医療(1)

文書作成(1)

発注書(1)

ショートカット(1)

WebAPI(1)

色操作(1)

スーパー開発ショートカット(1)

ライブラリ処理(1)

放課後等デイサービス(1)

児童福祉支援(1)

学校(1)

UI(1)

CAD(1)

カーソル操作(1)

チェックボックス(1)

PowerShell(1)

python(1)

【開発事例】Excel VBAで行単位の閲覧制御を行う仕組み|社内共有Excelで「自分に必要な行だけ表示する」実装アイデア

社内のExcel VBA構築例を示す図。問題点、起動時、利用者確認、行の表示制御、終了時の各ステップが説明。緑背景でできることリスト。

社内でExcelファイルを共有していると、次のような相談を受けることがあります。


「同じExcel台帳を複数人で使っているが、一部の行だけは特定の人にだけ見せたい」「金額や利益など、全員に見せたくない情報がある」「ただし、今のExcel運用を大きく変えずに対応したい」


本来、厳密な権限管理が必要な情報であれば、Excel単体ではなく、データベースやWebシステムでユーザー認証・権限管理を行う構成が望ましいです。

ただ、実務では、


  • すでにExcel台帳で業務が回っている

  • いきなりWebシステム化するほどの予算や期間はない

  • まずは社内運用レベルで、簡易的に見える範囲を制御したい


というケースも多くあります。

今回は、そのような場面で検討できる Excel VBAによる行単位の閲覧制御 の実装アイデアを紹介します。


※本記事は守秘義務に配慮し、実際の物件情報・住所・氏名・ファイル名・具体的な判定条件などは掲載せず、内容を一部抽象化して紹介しています。

今回の目的


今回の仕組みの目的は、社内で共有しているExcelブックに対して、利用者ごとに表示する行を切り替えることです。


例えば、同じ台帳の中に、

  • 全員が見てよい共通行

  • Aさんだけが見てよい行

  • Bさんだけが見てよい行

  • 管理者だけが見てよい行

が混在している場合に、Excel VBAで表示・非表示を自動制御します。


イメージとしては、次のような仕組みです。

  1. Excel起動時は「承認」シートだけを表示する

  2. PCユーザー名を自動取得する

  3. 利用者がパスワードを入力する

  4. 登録情報と照合する

  5. 認証に成功した場合だけ、対象シートを表示する

  6. 各行に設定されたユーザー情報を見て、表示する行を切り替える

  7. Excel終了時には、対象シートを再び非表示に戻す


基本構成

今回のような仕組みを作る場合、ブック内には大きく分けて次のようなシートを用意します。

シート名

役割

承認

起動時に表示されるログイン用シート

パスワード管理

PCユーザー名とパスワードを管理するシート

台帳シート

実際に業務で使用するデータシート

設定シート

必要に応じて対象シート名や管理列などを設定

起動直後は、基本的に 「承認」シートのみ表示します。


その他のシートはVBAで非表示にしておき、認証が成功した場合のみ表示するようにします。


利用者の識別にはPCユーザー名を使う

今回のポイントの一つは、利用者の識別に PCユーザー名 を使うことです。

Excel VBAでは、次のような方法でWindowsのユーザー名を取得できます。

Environ$("USERNAME")

または、環境によっては次のように取得することもできます。

CreateObject("WScript.Network").UserName

これにより、利用者が毎回自分の名前を入力しなくても、Excelを開いた時点でPCユーザー名を自動取得できます。


ただし、PCユーザー名だけで認証を完結させるのは弱いため、実務では別途パスワード入力を組み合わせる形にします。


つまり、

PCユーザー名 + パスワード

の組み合わせで照合するイメージです。


承認シートの役割

承認シートには、次のような項目を配置します。

項目

内容

PCユーザー名

VBAで自動取得して表示

パスワード

利用者が入力

照合実行ボタン

パスワード照合を実行

ブックを開いた直後は、この承認シートだけが表示されます。

利用者はパスワードを入力し、照合ボタンを押します。

照合に成功した場合のみ、業務用の台帳シートを表示します。


Excelシートのスクリーンショット。PCユーザー名とパスワード入力欄あり。手順が右に説明され、背景は白。

パスワード管理シート

パスワード管理シートには、次のような情報を保持します。

PCユーザー名

パスワード

PC-A

1111

PC-B

2222

PC-C

3333

ただし、実運用ではパスワードをそのまま平文で保存するのは望ましくありません。

スプレッドシートにPCユーザー名とパスワードの表があり、PC1は1111、PC2は1234、PC3は2222と記載されています。

簡易的な社内運用であっても、可能であれば、

  • パスワード管理シートを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ユーザー名

非表示

このルールにより、共通行と個人用行を同じ台帳内に混在させることができます。

Excelシートに、台帳、件名、情報1~4、PCユーザー名の列があり、1~5の行が空欄。ユーザー名にはPC1とPC2が記載。

自分専用の行として登録する処理

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

Excelシートのスクリーンショット。列には「件名」や「情報」があり、「PCユーザー名」にはPC1、PC2。タイトルは「台帳」。

利用者が任意の行を選択してこのボタンを押すと、選択行の管理列に現在のPCユーザー名を自動入力します。

これにより、その行は次回以降、そのPCユーザーだけに表示される行として扱われます。

軽いサンプルイメージとしては、次のような処理です。

実際の開発では、管理列番号を固定値にせず、見出し名から列番号を取得したり、設定シートで管理したりすると、後から列構成が変わっても対応しやすくなります。


表示制御処理のイメージ

行の表示制御では、対象シートの各行を確認し、管理列の値に応じて行の表示・非表示を切り替えます。

考え方としては、次のような処理です。

このように、行ごとの管理列を見て、現在の利用者に表示してよい行だけを表示します。


起動時と終了時のイベント制御

この仕組みでは、Excelのイベント処理が重要になります。

特に使うのは次のイベントです。

イベント

役割

Workbook_Open

起動時に承認シートのみ表示する

ボタンクリック

パスワード照合と対象シート表示

Workbook_BeforeClose

終了時に対象シートを非表示に戻す

Worksheet_Activate

必要に応じて、シート切替時に行表示を再制御する

起動時には、まず承認シートのみを表示します。終了時にも同じような設定を施しますが、こちらは保険の処理となります。


終了時には、対象シートを再び非表示に戻します。

このようにしておくことで、次回ブックを開いたときにも、最初から承認シートだけが表示された状態で開始できます。



ちなみに、「S_承認シートのみ表示」プロシージャではWorksheetオブジェクトの参照に「Worksheets」プロパティを利用していますが、この場合シート名を変更されるとマクロは動かなくなるので、より強固に実装するために下記の様に各シートのコード名をプロジェクトエクスプローラーで変更し、

Excelのオブジェクトエクスプローラーにシート名「承認」「台帳」「パスワード管理」「設定」と「ThisWorkbook」が表示されています。

次のように記述したほうが良いです。上記コードは「教材」としての説明用ですが、実際の開発ではこちらの記述方法を使用するのが正攻法です。


VeryHiddenを使ったシート非表示

Excelには通常の「非表示」と、VBAから設定する xlSheetVeryHidden があります。

通常の非表示であれば、Excelの画面操作から再表示できます。


一方、VeryHiddenにしたシートは、通常のExcel操作からは再表示できません。

Worksheets("台帳").Visible = xlSheetVeryHidden

再表示するときは、VBAで次のようにします。

Worksheets("台帳").Visible = xlSheetVisible

この仕組みにより、承認前の利用者が通常操作で対象シートを表示することを防ぎやすくなります。

ただし、VBAに詳しい人であれば解除できる可能性もあるため、過信は禁物です。


シート保護・ブック保護も併用する

今回のような仕組みでは、行の非表示だけでなく、シート保護も重要です。

例えば、次のような操作を防ぎたい場合があります。

  • 管理列を勝手に編集される

  • 非表示行を手動で再表示される

  • 管理用の列を削除される

  • パスワード管理シートを編集される

  • シート構成を変更される

そのため、以下のような保護を組み合わせます。


1. ワークシート保護

Worksheets("台帳").Protect Password:="password", UserInterfaceOnly:=True

UserInterfaceOnly:=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を活かしながら、社内運用を少し改善したい」という場面では、今回のような仕組みも有効な選択肢になります。

Excel VBAによる業務自動化・ツール開発をご検討の方へ

​"脱Excel"の前に、現状のExcelの潜在能力を120%発揮してみませんか?

softex-celwareロゴ 透過 横長.png

​インボイス登録番号:T5810983887134

  • Facebook
  • Twitter
  • YouTube

©2023 softex-celware。Wix.com で作成されました。

bottom of page