Office系Q&Aサイトを見ているとたまに出てくるのがこの質問。
“VBAで○○を禁止(制御)したい!”
特に業務ではこういった要望が出てくることも多いのだろうと思います。
たしかに、マクロを使うとアプリケーションの機能を制限することができます。
たとえば、ExcelファイルのThisWorkbookに下記コードを設定すると、
Option Explicit Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub
そのファイルではシート上で右クリックしてもメニューが表示されなくなり、たとえばリボンをカスタマイズして下記コードを設定すると、そのファイルでは上書き保存コマンドが無効になります。
<?xml version="1.0" encoding="utf-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <commands> <command idMso="FileSave" enabled="false" /> </commands> </customUI>
このように、コードを色々書くことでアプリケーションの機能を制御し、ユーザーの操作を限定させることはできます。
・・・が、この手の「○○禁止系」の処理は非常に大変です。
というのも、制御対象の項目が多い(右クリックメニュー、リボン、ツールバー(メニューバー)、ショートカットキー…etc)上、マクロで他ファイルから操作されたらどうするのか?、OOXMLファイル内のXMLを直接書き換えられたらどうするのか??・・・というように、起こり得る事態を考え出したらキリがなく、それらすべてに対応しようとすると、その分だけコストが掛かってしまうからです。
それならば、いっそのこと、
- ユーザーにファイルを弄られたくない。 → 保護機能でファイルを保護する、PDFファイルにして編集しづらくする。
- でも部分的にユーザーからの入力を受け付けたい。 → ファイルに制限を掛けて一部以外はファイルを保護する。
上記のようにVBAで何とかするのを止めて、標準機能である保護機能や制限機能で対応した方が、余分な手間が掛からないのではないかと思います。
メンテナンスの面を考えても、API等を駆使した凝ったコードで制限するより遥かに簡単で楽にファイルの面倒をみることができます。
(特に業務においては容易にメンテナンスできるようにしておいた方が、要らぬトラブルを起こさずに済みます。)
というわけで、
“VBAで○○を禁止(制御)したい!”
・・・と思う前に、まずはアプリケーションの保護や制限といった標準機能で何とかできないかを考えてはどうか?という私見をごちゃごちゃと書いてみました。
この記事へのコメントはありません。