• 締切済み

エクセルVBA実行方法

表記についてご教授宜しくお願いいたします。 今は実行ボタンを作成してセルに数字を全て入力した後に実行ボタンをクリックして計算を完成させています。できればセルに入力の都度に例えばエンターキーを押したら実行のようにその都度計算が完成する方法を教えていただきたい。

みんなの回答

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

VBAを学び始めたときに、そういうことをやりたい気持ちになることは判る。 しかしVBAをある程度判って、ボタンなどのコントロール(部品)のイベントプロシージュアーを経験したのちに、勉強しなおすべき課題だと思う。 ワークシートにENTERのキーインで発動するイベントはない。セルの値の変化によって発動するイベントしかない。 これも学び始めは、自分で変化させたセルの値の変化で、またそれが原因でイベントが起こり、ぐるぐる周りの処理になる。それを防ぐため、処理に入る前にイベントを無効にして、主なる処理が終われば、イベントの発動機能を元に戻して出る。こういう細工も必要で、テストをやっていると不手際で、イベントが発動されないことも起こる。慣れると自力で原因がわかり、避けられる(正常に戻せる)ようになる。周りに指導者がいないと質問コーナー利用では心もとない。ただこれを読んだだけですぐわかる人もいるとは思うが。 ーー VBになって、イベント処理方式を取り入れてくれたおかげで、自然に近い処理になるが、Msなどの、ソフト構想力の進歩のおかげです。 エクセルにVBAに限って言えば、バッチ処理(素材的データを完成させて一斉に処理を始める)で十分間に合うと思う。質問者が、他のプロ(ウインドウズ製品など)のハイレベルの処理になじんでしまって、自分もやりたいということだろうと思うが。 ーー (1)VBEの画面で(General≫の方をWorkSheet、(Declaration)の方をChangeを選ぶ (2)変化したセルを制約するためTargetでセル範囲内か判別する (3)既述の、いったんイベント発動を止めて(True)コードを書き、終わるとイベントを発動停止を解除(True)して脱出する。 初心者では、Enableibvents状態がどうなっているか判らなくなる。途中でエラーになると Falseにするの行があっても、そこを通らない組み方になっている場合が起こる。すると イベントが発生すべきなのに、発動しない などのことが注意事項。それと変数の受け渡しなどむつかしい点がある。 こんな質問コーナーに頼るのでなく、エクセルVBAの中級以上(250ページ以上の本)の本を読むこと。 ワークシートのChangeイベントに関する項を探せ。

  • kkkkkm
  • ベストアンサー率66% (1721/2591)
回答No.5

仮にE5からE38に数値を入力している場合 Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Target, Range("E5:E38")) Is Nothing Then Application.EnableEvents = False 'イベントを無効にします。有効になるまで各種イベントが発生しないので、Changeイベント内で指定範囲内のセルの書き換えなどした場合の再帰による無限ループがなくなります。 'やりたい計算などのコード Application.EnableEvents = True 'イベントを有効にします。最後に有効にしておかないと以後のイベントに反応しなくなります。 End If End Sub

回答No.4

「セルに入力の都度に例えばエンターキーを押したら実行のようにその都度計算が完成する方法」 これだけなら、標準モジュールにPublic Functionを作ることで実装出来る場合があります。

回答No.3

追記。 >セルに数字を全て入力した後に実行ボタンをクリックして計算を完成させています。 という場合は「結果を求めたいセル」に「数値を入力したセルを参照する計算式を書く」のが最も「手っ取り早い方法」です。 例えば「A1~A12に毎月の売り上げを入力して、A13に12ヶ月1年分の合計、A14に売り上げの平均値、A15に売り上げの最高金額を計算する」という場合、A13、A14、A15のそれぞれのセルに =SUM(A1:A12) =AVERAGE(A1:A12) =MAX(A1:A12) のように書くだけで済みます。 そして、EXCELのワークシート関数(セルの計算式で使える関数)は、集計関数なども含めかなり多彩なので「たいていの事ならセルに計算式を書くだけで済む筈」です。 VBAで書く必要があるとすれば「かなり複雑な条件があって、セルに計算式を入力するというような単純な話では済まない」と言う場合だけですが、そんなに複雑なんでしょうか?

回答No.2

なお「セルの値が変更されたら自動的に呼ばれるプロシージャ」の中で「セルの値を書き換える処理」をする場合は、注意が必要です。 何も対処しないで居ると セルに手入力する ↓ セルの値が変更されたら自動的に呼ばれるプロシージャが呼ばれる ↓ そのプロシージャの中で、セルの値を書き換える処理をする ↓ セルの値が変更されたら自動的に呼ばれるプロシージャが呼ばれる ↓ そのプロシージャの中で、セルの値を書き換える処理をする ↓ セルの値が変更されたら自動的に呼ばれるプロシージャが呼ばれる ↓ そのプロシージャの中で、セルの値を書き換える処理をする ↓ 以下、延々と繰り返されて「実行時エラー'28' スタック領域が不足しています」のエラーが出て止まる のように、実行時エラーが出て止まってしまいます。 なので「セルの値を書き換えた所為で、自分自身のプロシージャが再び呼び出される(これを「再入」とか「再帰」とか言います)のを防ぐ」のが必要になります。 これらの「再入防止」は「かなり高度な処理」を必要としますので、上手く行かない場合は「諦めて、CommandButtonを押す方式」にして下さい。 また「セルの値が変更されたら自動的に呼ばれるプロシージャ」は「すべてのセルに入力が完了する前に呼ばれてしまう」ので「全部のセルに入力が完了しないと計算できない」と言う場合は、使い物になりません。 「100個のセル全部に入力完了しないと計算できない」のに「1個目のセルに入力した瞬間に呼ばれてしまう」ので、困った事になります。 ですので「100個のセル全部に入力完了しないと計算できない」とかの場合は「全部のセルに入力し終わった段階で、コマンドボタンを押させて計算する」の方が良いです。 どちらが良いのか、良く考えてからにして下さい。

回答No.1

ご参考。 http://vba-geek.jp/blog-entry-224.html エクセルには「セルの値が変更されたら自動的に呼ばれるイベントプロシージャ」が用意されています。

関連するQ&A