• ベストアンサー

EXCEL VBA(ワークシート上)でデータ入力の感知

EXCEL VBAに関する質問です。(素人です) ワークシート上で金額、納入期限、利率を元に、延滞金が100、200、300~5,000円となる日の算出をボタンクリック行うロジックを作成しました。金額、納入期限、利率のいずれかの入力後、ボタンクリックすることなく出来るようしたいのですが、以下の方法ではダメでした。 ○ユーザー関数…for next,DO WHILE命令?使用の為機能せず。 ○SelectionChange…データ入力自体は感知しない。 ○Worksheet_Calculate…イベント発生が50回もあり不可。 何とかワークシート上でENTERキーを感知する方法はないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

ワークシートのセルのイベントの代表的なものに Private Sub Worksheet_Change(ByVal Target As Range) End Sub がある。エクセルVBAのイベントのイロハのイです。 VBA関連の質問回答には毎日載っているものです。WEB(例えばGoogle)ででも、Worksheet_Changeで照会すれば、沢山の使用例が出ます。プログラムをやる以上WEB照会ぐらいしなきゃ。 http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200705/07050005.txt ほか何万件? ーー ChangeしたセルはTargetで返されるので If文でそのアドレスを判別したり 範囲を判別したりできる(上記サイトの If Intersect(Target, Range("D4:D20")) Is Nothing Then Exit Sub ) 質問者はVBAのコントロールのイベントなどとあわせて、系統的にシート・ブックのイベントを勉強すべき状態だと見える。

kmasumi
質問者

お礼

ありがとうございました。 年に1、2度VBA使う程度、各サイト参照して試してみたのですが、 目指すものが見つかりませんでした(^_^;) 例で示された「文字色を変え」の部分を「演算式」に置き換えれば できそうですね。 ENTERキー認識にこだわり過ぎてたようです。KEYCODEなどいろいろ 初で試してみましたが、シートでは機能せず困り果てていました。 ありがとうございました。

その他の回答 (2)

noname#70958
noname#70958
回答No.3

●マクロ自体の動作によってマクロが起動してしまうことを防ぐ たとえば、サンプルAのように書いてしまうと、 セルの値を変更する動作によってイベントが発生してしまいます。 ×サンプルA '------------------↓ ココカラ ↓------------------ Private Sub Worksheet_Change(ByVal Target As Range)  Range("A1") = Range("A1") + 1 End Sub '------------------↑ ココマデ ↑------------------ 一方、セルを変更する前にEnableEventsをFalseにしておけば、 その後の処理ではイベントが発生しないので、きちんと終了します。 ○サンプルB '------------------↓ ココカラ ↓------------------ Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = False   Range("A1") = Range("A1") + 1  Application.EnableEvents = True End Sub '------------------↑ ココマデ ↑------------------ あるいは、「変更された場所」をチェックして、 マクロによる変更かどうかを判断し、 マクロによって変更された場合にキャンセルする方法もあります。 ○サンプルC '------------------↓ ココカラ ↓------------------ Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Address = "$A$1" Then Exit Sub  Range("A1") = Range("A1") + 1 End Sub '------------------↑ ココマデ ↑------------------ ご参考まで。

kmasumi
質問者

お礼

ありがとうございました。 Application.EnableEvents = Falseがカギのようですね。 NO.2の方の回答にも記述してありました。 Falseでイベント発生の命令を押さえ込むことができるのですね。 どんな意味か分からなかったので、参考になりました。 これで完全に問題か既決できそうです。

  • keirika
  • ベストアンサー率42% (279/658)
回答No.1

Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "aaa" End Sub はどうでしょうか。

kmasumi
質問者

お礼

ありがとうございました。 この方法だとダメみたいです。 と云うのは、セル50個に結果を表示するので、 その度にイベントが発生するので、プログラムが ループ状態になってしまい、強制終了しなくては なりません。

関連するQ&A