人に聞けない痔の悩み、これでスッキリ >>

Excel2003です。
タイトルそのまんまなんですが、Deleteキーを押したときだけWorksheet_changeイベントが走らないようにできますか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

Sheetには、Key_Downなどのキーを押されたときのイベントがありませんのでできません。



で、代案。
Deleteキーを押すということはセルの値を消すということですから
Changeイベントの最初で、該当セルの値をチェックしてはどうでしょうか。

'---------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Value = "" Then Exit Sub

   ーー通常処理ーー

End Sub
'---------------------------------------------------
 
勘違いしてましたらご容赦願います!(^^;;;


 
 
    • good
    • 1
この回答へのお礼

いける!!!!!
こんな簡単なことだったのかぁぁぁあああ
ありがとう!!!!

お礼日時:2009/01/29 10:28

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBA セルの入力後「Delete」キーを押したか判断するプログラム

セルに入力したあとその入力したキーが「Delete」キーかどうか判定するプログラムを作りたいのですが、下記のようにコードを書きました。

'標準モジュール
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

'Microsoft Excel Objects(ワークシート)
Private Sub Worksheet_Change(ByVal Target As Range)
If GetAsyncKeyState(46) <> 0 Then 'キーボードの「Delete」キーかどうか判定
○○
Else
○○
End If
End Sub

ところが、「Delete」キーを押してもGetAsyncKeyState(46)の値が「0」になり、「Delete」キーを押してないことになってしまいます。どのようにすればよいのでしょうか?
回答よろしくお願いします。

Aベストアンサー

#1 のコードを部分訂正。。。。

どうも、こうやらないとダメみたい。

' // DELキーを送信
Call Auto_Close
AppActivate Application.Caption
SendKeys "{DEL}", True
Call Auto_Open

Qキーボードが押されたことの感知(エクセルVBA)

キーボードが押されたことを、イベントとするマクロってできるのでしょうか?例えば、ctlキーが押されたら、"押されました"、離されたら”離れました”って表示する方法をご伝授願えればと思います。どなたか、VBAに詳しい方、宜しくお願いいたします。また、感知することが出来ないキーや、右や左で判別できない(例えば、shiftキー)キーもあるのでしょうか?

Aベストアンサー

こんばんは。

以前、9x系で、Win32APIを、見よう見まねで、キーイベントを作ろうとして、見事に失敗した経験があります。理論的は間違いないつもりでいたのですが、二度と試そうとは思いません。基本的には、無理だと考えてよいと思います。

>Win32API のGetKeyboardState 関数は、現在押しているかの判別だと思いますが???正しいのでしょうか?

確かに、そのとおりではあるのですが、あくまでも、API関数を通しての結果だったと思います。

>Alt キー、Ctrl キー、Shift キー(今考えているのは、Ctrl キー、Shift キー)を押した時に、メニューバーの表示を切替えようと考えています。

必要ないというよりも、Alt キーは、Excel等のアプリケーションと、コンフリクトを起こすのではないでしょうか?せいぜい、シフトキーまでにしないと、あぶなくてしょうがないです。それから、シフトキーだけでメニューを換えるというのは、既存のアプリでも出来ていませんね。あくまでも、ボタンのクリック・イベントに対して、シフトキーをチェックしてメニューを換えるようにされています。

あまり凝った方法にしないで、新たに、ツールバー全体を作るか、メニューバー自体を入れ替えたほうが早いのでは?どんなに多くても、100までにはならないと思いますが。というか、それだけのプロシージャを確保して運用しても、重すぎるのではないか、と思います。

私の苦い経験で、最初の大きく構えて設計段階でコケてしまうと、後が全滅になりますよ。小技を構築して、大きなものを作ったほうが、成功率は高いです。

また、ロータス方式のように、ひとつの大メニューバーのメニューコマンドに対して、小メニューバーを設けていってもよいのではありませんか?

これ以上は、私としては、なんとも言い様がありません。

こんばんは。

以前、9x系で、Win32APIを、見よう見まねで、キーイベントを作ろうとして、見事に失敗した経験があります。理論的は間違いないつもりでいたのですが、二度と試そうとは思いません。基本的には、無理だと考えてよいと思います。

>Win32API のGetKeyboardState 関数は、現在押しているかの判別だと思いますが???正しいのでしょうか?

確かに、そのとおりではあるのですが、あくまでも、API関数を通しての結果だったと思います。

>Alt キー、Ctrl キー、Shift キー(今考えているのは、Ct...続きを読む

QエクセルVBAのDeleteキーによるエラー

VBA初心者です。エクセル(2003)のVBAについて質問です。

セルに何か値が入力されたら、隣のセルに「TRUE」と入力し、
入力が消去されたら、隣のセルに「FALSE]と入力されるマクロを作成しています。

下記のコードをシートモジュールに入力し、
標準モジュールにはそれぞれ呼び出し用のマクロを入力しています。
A列とB列は結合されていて、その結合されたA・B列のセルに値が入力されたり消去されたりすると
隣のC列に結果が入力されるようにしたいのですが、
A・B列の値をDeleteキーで消去するとエラーになってしまいます。
BSキーで値を消去するとエラーは出ません。
Deleteキーでもエラーが出ない様にする方法はありますでしょうか。
どなたかご教授お願いします。

-----------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:B1,A3:B3,A5:B5")) Is Nothing Then
If Target.Value <> "" Then
Select Case Target.Address(0, 0)
Case "A1"
Call マクロ1_TRUE
Case "A3"
Call マクロ3_TRUE
Case "A5"
Call マクロ5_TRUE
End Select
ElseIf Target.Value = "" Then
Select Case Target.Address(0, 0)
Case "A1"
Call マクロ1_FALSE
Case "A3"
Call マクロ3_FALSE
Case "A5"
Call マクロ5_FALSE
End Select
End If
End If
End Sub

VBA初心者です。エクセル(2003)のVBAについて質問です。

セルに何か値が入力されたら、隣のセルに「TRUE」と入力し、
入力が消去されたら、隣のセルに「FALSE]と入力されるマクロを作成しています。

下記のコードをシートモジュールに入力し、
標準モジュールにはそれぞれ呼び出し用のマクロを入力しています。
A列とB列は結合されていて、その結合されたA・B列のセルに値が入力されたり消去されたりすると
隣のC列に結果が入力されるようにしたいのですが、
A・B列の値をDeleteキーで消去するとエラーになって...続きを読む

Aベストアンサー

こんにちわ

Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Address(0, 0)
If Intersect(Target.Cells(1), Range("A1:B1,A3:B3,A5:B5")) Is Nothing Then Exit Sub
If Target.Cells(1).Value <> "" Then
・・・
・・・

上の例のように、MsgBox Target.Address(0, 0)を加えて、
DeleteキーとBSキーでの動作の違いを見てください。

そして、次のようにすべて書き換えてください。
Target → Target.Cells(1)

QEnterキーでマクロを起動さす。

Excelの(例)A1のセルに検索値を入力しEnterキーを押すと事前に組まれたマクロが起動する方法を教えて下さい。

又はEnterキーにマクロは設定できませんか?

Aベストアンサー

#4のnojioさんの補足ということでお読みください。(書いているうちにかぶってしまいました。)

Worksheet_Changeがsumi-hamaさんの意図かもしれませんが・・・下記はEnterに対して機能します。


下記コードを標準モジュールに貼り付け、
 Onkey_Set を実行することでEnterキーにマクロが割り当てられます。
 マクロ側で(MacroTest)Sheet1のA1を特定しています。

 Onkey_Off を実行することでEnterキーは元の機能に戻ります。


'Enterキーにマクロを割り当て
Sub Onkey_Set()
  Application.OnKey "{Enter}", "MacroTest"
End Sub

'デモ(Sheet1のセルA1のみで機能させる)
Sub MacroTest()
  If ActiveSheet.Name = "Sheet1" Then
    If ActiveCell.Address(0, 0) = "A1" Then
      MsgBox "Sheet1のセルA1でEnterキーを押しました"
    End If
  End If
End Sub

'Enterキーを元の機能に戻す
Sub Onkey_Off()
  Application.OnKey "{Enter}"
End Sub

#4のnojioさんの補足ということでお読みください。(書いているうちにかぶってしまいました。)

Worksheet_Changeがsumi-hamaさんの意図かもしれませんが・・・下記はEnterに対して機能します。


下記コードを標準モジュールに貼り付け、
 Onkey_Set を実行することでEnterキーにマクロが割り当てられます。
 マクロ側で(MacroTest)Sheet1のA1を特定しています。

 Onkey_Off を実行することでEnterキーは元の機能に戻ります。


'Enterキーにマクロを割り当て
Sub Onkey_Set()
  Applic...続きを読む

QVBA エンターキーでイベントに入りたい。

テキストボックスにデータ入力後エンターキーの押下でイベントに入りたいのですが、下記のコーディングで[通過]メッセージが表示されません。英数字は通過しますが、エンターキーは動作停止します。
これと全く同じコーディングでVB6は正しく動きます。(ただし、Pvate Sub text1_KeyPress(KeyAscii As Integer)に変更してます。)
<コーディング>
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Msgbox "通過"
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
End If
End Sub

これが出来ると、そのつどキーボードから手を離さずに済むので作業効率がグンとあがります。どうかよろしくご教示ください。Excel2003SP3

Aベストアンサー

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃっているようですが、はっきり言えば、その最初のコードは、VBAでは間違っています。それに気がついてください。

質問のコードのままのコードでは、Enter キーのイベントは、取れないのです。別にPCの故障でもソフトの問題でもないし、こちらが試していないわけでもありません。

Visual Basic とVBAは、細かい点で違います。

VBAのこの種のイベントの KeyAscii では、VB6 で取れる、EnterキーのKeyAsciiの 「13」 は、取れません。 KeyAscii は、MSForms.ReturnIntegerとなって、Integer ではありません。

だから、私は、その代わりとして、KeyDown イベントを使えばよいとしているわけなのです。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = vbKeyReturn Then
  MsgBox "Enterキーが入りました", 64
  'KeyCode =0
 End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 MsgBox "通過"
End Sub

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃってい...続きを読む

QExcel VBA あるセルでENTERを押すと特定のセルへ移動したい

Excel VBAで例えばセル"A2"をセレクトしている状態で
「ENTER」を押すとB5に自動的にセレクトすることはできないでしょうか?

Worksheet_Change関数を使おうと思ったのですが
"A2"の中身が変化しないと発動しません。

Worksheet_SelectionChange関数を使って"A2"を選択している状態で「ENTER」を押すと"A3"が選択されることを利用し、
「"A3"が選択されたら"B5"に飛ぶ」
も考えたのですが、マウスやキーボード操作で"A3"を
選択すると"B5"に飛んでしまうので、これも使えません。

何か対策案はないでしょうか。ご教授よろしくお願いします。

Aベストアンサー

こんばんは。

これは、定番のコードですが、私は、それに、もう少し工夫を凝らしてみました。
本来は、クラスによるインスタンスが良いとは思いますが、それを一般的にお勧めするには、ちょっと荷が重いような気がしました。

'<標準モジュール>

Private Sub ReturnDirectrion2SelectCell()
 If ActiveCell.Address(0, 0) Like "A2" Then
  Range("B5").Select
 Else
  'Original ReturnDirection の再現
  On Error Resume Next
  Select Case Application.MoveAfterReturnDirection
  Case xlDown
    ActiveCell.Offset(1).Select
  Case xlToRight
    ActiveCell.Offset(, 1).Select
  Case xlToLeft
    ActiveCell.Offset(, -1).Select
  Case xlUp
    ActiveCell.Offset(-1).Select
  End Select
 End If
End Sub

Sub SetKeys()
  '設定用
  Application.OnKey "~", "ReturnDirectrion2SelectCell"
  Application.OnKey "{Enter}", "ReturnDirectrion2SelectCell"
End Sub
Sub SetOffKeys()
 '解除用
 Application.OnKey "~"
 Application.OnKey "{Enter}"
End Sub

'-----------------------------------------

自動設定が必要な場合は、以下のコードを加えてください。

'-----------------------------------------
'<標準モジュール>
Sub Auto_Open()
 Call SetKeys
End If
Sub Auto_Close()
 Call SetOffKeys
End If
'-----------------------------------------

なお、現在の設定では、全てのブックの全てのシートに同じように適用されます。Auto_Open等の代わりに、例えば、Worksheet_Activate や Workbook_SheetActivateなどに、SetKeysをCall し、Worksheet_DeactivateやWorkbook_SheetDeactivateに、SetOffKeysをCallするようにすると良いと思います。

こんばんは。

これは、定番のコードですが、私は、それに、もう少し工夫を凝らしてみました。
本来は、クラスによるインスタンスが良いとは思いますが、それを一般的にお勧めするには、ちょっと荷が重いような気がしました。

'<標準モジュール>

Private Sub ReturnDirectrion2SelectCell()
 If ActiveCell.Address(0, 0) Like "A2" Then
  Range("B5").Select
 Else
  'Original ReturnDirection の再現
  On Error Resume Next
  Select Case Application.MoveAfterReturnDirection
  ...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL(VBA) セルをクリックしたときの処理

何度もお世話になります。

A5:A20のどれかをクリックしたときに
クリックしたセルが値が入力済みか確認してから
ファイルを名前を付けて保存したいのですが
クリックしたという情報(イベント?)の取得方法が
わかりません。

(1)どのようにチェックすればよいのでしょうか?
(2)また、皆さんはどのようにしてこのような問題を解決してるのでしょうか?

よろしくお願いします。

Aベストアンサー

Sheet1だとして、
Sheet1のマクロで

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
If Target.Column = 1 And Target.Row >= 5 And Target.Row <= 20 Then
If Target.Value <> "" Then MsgBox "入力済み"
End If
'
End Sub

と入れると、クリックしたセルがA5からA20のどれかで
かつセルに値が入っているときのみ”入力済み”とメッセージが表示されます。
このメッセージ表示の部分を、「名前を付けて保存」の処理に置き換えてはいかがでしょうか。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング