Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : その他)
VBAが作動するブックの指定
投稿日時: 21/03/05 19:47:01
投稿者: てへい

VBA初心者です。
あるブックでDeleteキーを使った削除を行わせない様に、
以下のVBAを記載しました。
 
Sub Auto_Open()
    'Deleteキーを押したときに、特定の関数を実行
    Application.OnKey "{DEL}", "PressDelKey"
End Sub
 
Sub Auto_Close()
    'Deleteキーを押した際の関数実行を中止
    Application.OnKey "{DEL}"
End Sub
 
Private Sub PressDelKey()
MsgBox "Deleteキーによる削除は無効です。"
                 
End Sub
これで問題なく実行されるのですが、このブックを開いたまま別のブックを開いた場合、
同じようにDeleteキーが使えません。
VBAは記載したブック内で動くと思っていたのですが・・。
記載した場所は、当該ブックのmodule1 というところです。
 
解決方法があればご教授下さい。
 
Windows10 EXCELはoffice365 ですので最新版だと思います。

回答
投稿日時: 21/03/05 20:51:29
投稿者: WinArrow
投稿者のウェブサイトに移動

この機能をアドインブックに組み込む方法があります。
勿論、アドインブックで、他ブックを制御すことになります。
 
私見ですが、
DELETEキーが使えないと、困ることもあるのでは?

回答
投稿日時: 21/03/05 22:40:01
投稿者: simple

質問を読み違えていたようです。(その妥当性は置くとして)
当該ブック以外では普通に Deleteを使いたいわけですね。
 
それなら、マクロを登録したブックの ThisWorkbookモジュールに

Private Sub Workbook_Deactivate()
    Application.OnKey "{DEL}"
End Sub
とし、
Private Sub Workbook_Activate()
    Application.OnKey "{DEL}", "PressDelKey"
End Sub
とすれば良いのではないですか?
 
なお、Auto_OpenやAuto_Closeではなく、
Workbook_Open()や、Workbook_BeforeCloseを使ったほうが良いと思います。
一世代前のものですから、それらを使う必然性はないと思います。

回答
投稿日時: 21/03/06 07:45:49
投稿者: WinArrow
投稿者のウェブサイトに移動

私も質問を読み違えていました。
 
私のレスは、無視してください。

投稿日時: 21/03/06 13:55:06
投稿者: てへい

simple様
 
回答ありがとうございました。
記載する場所等も教えて頂き、思った通りの挙動になりました。
 
また、Workbook_Open()や、Workbook_BeforeCloseについても教えて頂きありがとうございます。
勉強になりました。
 
Deleteキーを使わせたくないというのは、
複数人で一つのブックを共有して、ある事柄の追加事項を、もともと入力のあるセルに書き加えているブックがございまして、
このブック内のセルが空白やアルファベットの1文字だけになっていることがあります。
(多分、何かの操作ミスで削除されたか、つい触ってしまったキーによって内容が置き換えられてしまっているのだと思います。)
 
シートの保護をかけて、入力時に毎回解除・保護をすれば事足りるのですが、頻回にその表の書き換えが行われるので、その作業が面倒だと考えました。(他の人がきちんとやって下さるのかも不明ですし)
 
これを防止するために、入力規則で「2文字以上」というのを設定してみたのですが、
「Deleteキー」で削除した場合のみ、入力規則に引っかからず削除することができる状態でした。
ですので、「Deleteキーを使わせない」というVBAについて質問させて頂きました。
 
「追記を続けるシートで、うっかりセルを削除させない」方法のアイデアが別にあれば教えて頂けると幸いです。
 
本当にありがとうございました。

回答
投稿日時: 21/03/06 14:55:33
投稿者: WinArrow
投稿者のウェブサイトに移動

DELETE
だけに焦点を絞っているようですが、
似たような操作は、まだありませんか?
 
例えば、
入力規則もどこかのセルをコピペで簡単に壊れてしまいます。
[Ctrl]+[A]でセル範囲を選択しておいてクリア
行、または列を削除、または移動
シートを削除
 
 
誤って操作したら、
「上書きせずに終了」が最も被害がすくないように思いますが・・・
 

投稿日時: 21/03/07 00:06:01
投稿者: てへい

 WinArrow様
 
返信ありがとうございます。
はい、おっしゃる通り色々なパターンで思わぬ改変があるとは思います。
 
但し多分、うっかりセルの内容を消してしまっている人達は(自分もやってるかも)、
気づいていないので上書きしないというのは中々難しいかと思います。
 
他に良いアイデアがあれば良いのですが・・。

回答
投稿日時: 21/03/07 07:05:51
投稿者: simple

すべての穴を塞ぐことはできないでしょうね。
例えば、Backspaceキーはdeleteキーとは異なりますが、
同様の消去機能を持ちます。
 
データの誤入力を防止するための方策として以下が考えられます。
 
(1)
入力要求(入力許可)領域とそうでないところを区分し、
前者はロックをはずし、後者はロックしてシート保護します。
これは最も基本的なものですね。
(2)
入力要求(入力許可)領域にはすべて、「入力規則」がかかっているんですか?
・「入力規則」に関して、消去を抑止することは無理です。
  いったん入力したものの、入力自体を取り消すことは自然なことですから。
  もしこれを抑止するなら、未入力に警告が出ることを意味します。無理です。
・一文字だけの入力は入力規則で抑止できているはず。何が論点なのでしょう。
・入力規則以外のところについては、基本的には入力者の注意能力に委ねるしか
  無いのではないかと思います。
(3)
このほか、外形的な基準があって、こうあるべきという箇所があれば、
閉じる前にそれをマクロでチェックして警告を出す、という仕組みは
取れるかもしれません。
 
こういった話は、技術でカバーしようとしても必ず抜けは発生するわけで、
余り厳密に考えて、"独り相撲"にならないよう注意する必要があります。
 
結局は、ユーザーとのコミュニケーションをよく図り、注意喚起を促し、
彼らのスキルアップを支援するという基本が、最大の効果をもたらすように思います。
(難しいことではありますが)

回答
投稿日時: 21/03/07 09:07:21
投稿者: WinArrow
投稿者のウェブサイトに移動

本件は、オペレータの誤操作をできるだけ阻止しようとする取り組みと思います。
これを追求するには、大げさにいうと、Excelの全ての機能を熟知する必要があります。
Excelの機能を勉強するには役立ちますが、
追求すれば、追及するほど「蟻地獄」にはまってしまう恐れがあります。
と経験者は語る。

投稿日時: 21/03/08 10:38:40
投稿者: てへい

Simple様、WinArrow様
 
返信ありがとうございます。
はい、今回はオペーレーターの誤操作による思いがけない削除を抑制したいということでした。
 
お二人の仰るとおり、完璧を目指すのはかなり大変そうですので、やり過ぎたら
「独り相撲」になったり、「蟻地獄」にはまったりというご指摘が非常に参考になりました(笑)
 
色々とご教授頂き本当にありがとうございました。 Very Happy