VBA コピーペースト(コピペ)を禁止する方法 - Excel
VBAでコピー&ペーストを禁止する方法です。
社内ツールとして利用価値が高い Excel ですが、その分利用される方の経験と年代も様々ですね。年配の方や、普段あまりパソコンを利用しない方などが間違ってコピペして、他の人が記入した欄が消えてしまった・・・なんて声もしばしば聞かれます。そうなると、コピペを禁止するよう制御できないかと考えたりするのが管理者の方のお仕事だったりしますね。
ここでは VBAでコピペを禁止する方法 を紹介します。
コピペの禁止方法
まず、制御するに辺り、以下のことを考慮しなければなりません。
- Ctrl + C と Ctrl + V の制御
- 右クリックでのコピー & 貼り付け の制御
- メニューバーでのコピー & 貼り付け の制御
これを踏まえてコーディングしてみましょう。
サンプルソース
それでは、サンプルソースを見ながら解説していきます。
Option Explicit
'**
' オープン
'**
Public Sub Auto_Open()
' コピペの制御
Call CopyPasteCommandControl(False)
End Sub
'**
' クローズ
'**
Public Sub Auto_Close()
' コピペの制御
Call CopyPasteCommandControl(True)
End Sub
'**
' コピー&ペーストの制御
' 引数 true:利用可, false: 利用不可
'**
Public Sub CopyPasteCommandControl(Enabled As Boolean)
Dim Cmd As Variant
Dim CmdNames As Variant
CmdNames = Array("Worksheet Menu Bar", "Cell", "Column", "Row")
'ショートカット制御
If Enabled = False Then
Application.OnKey "^c", ""
Application.OnKey "^v", ""
Application.OnKey "^x", ""
Else
Application.OnKey "^c"
Application.OnKey "^v"
Application.OnKey "^x"
End If
'コマンドボタン制御
For Each Cmd In CmdNames
If Cmd = "Worksheet Menu Bar" Then
With Application.CommandBars(Cmd).Controls(2)
.Controls(3).Enabled = Enabled
.Controls(4).Enabled = Enabled
.Controls(5).Enabled = Enabled
End With
Else
With Application.CommandBars(Cmd)
.FindControl(, 19).Enabled = Enabled 'Copy
.FindControl(, 22).Enabled = Enabled 'Paste
.FindControl(, 21).Enabled = Enabled 'Cut
End With
End If
Next Cmd
End Sub
まず、標準モジュールを作成して、Auto_Open() 関数を作ります。
Auto_Open() は、Excel を開いたときに自動で実行されるコマンドです。
次に、先ほどの制御を組み込みます。
Application.OnKey を使って、ショートカットキーを制御します。
そして、Application.CommandBars 配列から該当のコマンドを探し出し制御します。
実行してみると、コピペができなくなっていることがわかると思います。
しかしながらこの方法だけですと、Office 2007以降の Excel では他の Excel やテキストなどでコピーされた情報が、右クリックやリボンの貼り付けボタンから張り付いてしまいます。厳密な制御を入れようとすると、Windows API を利用してクリップボードの値を判断することになりそうですね。
「VBA コピーされたセル範囲を取得する方法」のページでは、コピーされたセル範囲を取得する方法を紹介しています。また、「VBA リボンを非表示にする方法」のページでは、VBAでリボンを非表示にする方法をご紹介しています。
完全なコピペ禁止の参考になるかと思います。
完全なコピペの禁止の方法については、またの機会にご紹介いたします。
追記
「VBA 貼り付け(ペースト)を禁止する方法」について掲載しました。参考にしてみてくださいね。
おつかれさまでした。