dポイントプレゼントキャンペーン実施中!

DELETEキーを拾うため、SheetのOpenイベントに
Application.onkeyにて"DELETE"キーと呼び出し関数を
指定しています。

標準モジュールにて、呼び出し先関数を定義して
普通に処理出来ているのですが・・・・・

まったく関係の無いほかのエクセルファイルを開き
DELETEキーを押下しても、同じ関数が呼び出されて
しまいます。
(同じExcel.exeのMDIの一つとして起動されてしまった場合)

困った事に、シートのある特定の状態を見ている為
現状エラーメッセージボックスが表示されてしまいます。

回避方法は幾らでもあるのですが。
Googleで検索しても、OnError で処理していたり
まったく何も考えてなかったり。
具体的な対応策が見つかりません。

現状シート名にて判断しようと考えておりますが
かなりの数がある&シート名に制約が生まれる
のでやりたくないんです。

何か一般的な回避策がありましたら教えて頂け
無いでしょうか。

A 回答 (2件)

先ほど回答を投稿したのですが反映されてないので、再投稿。


 
ThisWorkbookモジュールに全て(OnKeyで実行のマクロ以外)のコードを置いて。。

( Sheet2 でのみで動作させる場合)
 
'------------------------------------------------
Private Sub Workbook_Activate()
  If ActiveSheet.Name = "Sheet2" Then
    Sheets("Sheet2じゃないシート").Activate
    Sheets("Sheet2").Activate
  End If
End Sub
'-----------------------------------------------

Private Sub Workbook_Deactivate()
   '▲OnKey解除▲
End Sub
'-----------------------------------------------

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  If Sh.Name = "Sheet2" Then
     '●OnKey セット●
  End If
End Sub
'---------------------------------------------

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
  If Sh.Name = "Sheet2" Then
     '▲OnKey解除▲
  End If
End Sub
'-------------------------------------------------

外しましたらご容赦!
 
    • good
    • 0
この回答へのお礼

ご返答有難う御座います。

シートのActive、DeActiveを拾ってOnKeyの設定を
行わないと、新たなシートでDELキーが有効になりません
でした。

下記のように対応しました。
-------------------------------------------------
'ThisWorkBook
Private Sub Workbook_Activate()
 ●OnKey セット●
End Sub

Private Sub Workbook_Deactivate()
 ●OnKey 解除●
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 ●OnKey 解除●
End Sub

'標準モジュール
Sub DELキーイベント関数()
If ActiveWorkbook Is ThisWorkbook Then
DELETE処理・・・・・
End If
End Sub
-------------------------------------------------
上記対応により、問題なく処理する事が出来ました。

大変有難う御座いました。

お礼日時:2008/10/01 20:38

こんにちは。



> SheetのOpenイベント
> 現状シート名にて判断しようと考えておりますが

Sheet には Open イベントはありません。Workbook_Open のことかな?
下記は、とりあえず Auto_Open にしましたが、ご都合で読み替えて下さい。

Sub Auto_Open()
  Application.OnKey "{DELETE}", ThisWorkbook.Name & "!SampleProc"
End Sub

Sub Auto_Close()
  Application.OnKey "{DELETE}"
End Sub

' // 標準モジュール
Sub SampleProc()
  If ActiveWorkbook Is ThisWorkbook Then
    MsgBox "コールされました"
  End If
End Sub

> OnError で処理していたり
> まったく何も考えてなかったり。
> 具体的な対応策が見つかりません。

どのような時に、どのようなエラーが発生するかを理解した上で施す、
最小限の On Error トラップは有効な方法だと思います。

これが、具体的ではないとするのであれば、どのような方法を望んでいる
のかもっと説明した方が良いのでは?
    • good
    • 0
この回答へのお礼

早速のご返答有難う御座います。

記載内容の不備、申し訳御座いません。
当方がExcelVBAをわかっていない状況で
質問させて頂きました。実際の担当は、当方の部下が行って
おり、ヒアリングにて記載させて頂きました。

当方が聞きたかった事は、KenKen_SPさんの記載通りの内容
となります。
大変参考となりました、有難うございます。

ただ、この対応ですと、関係の無いエクセルファイル上での
DELキーが無効となってしまいました。

次にご返答いただいているonlyromさんと合わせた形で対応
が必要になりそうです。

お礼日時:2008/10/01 20:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!