- ベストアンサー
エクセルで特定のセルに入力後エンターを押すとマクロが起動
エクセルで特定のセルに入力後エンターを押すとマクロが起動 エクセルで、ファームで作成したボタンを押すとマクロが起動するように して有ります。 記憶させたマクロの起動にはファームで作成したボタンを右クリックし 「マクロの登録」でモジュールを登録する方法しか知りません。 これを特定のセルにデータを入力後エンターを押して入力値が確定されたら このマクロが起動するようにするにはどうすればいいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(1)セルのChangeイベントを使う。 (2)>特定のセルにデータを入力 はTargetという引数でデータが入力されたセルが返される(教えてくれる)から、そのアドレスがA2セルであるか判別して、該当しないときは、イベントの中ですべき処理をスルーさせれば仕舞い。 Googleで「VBA Change イベント」で照会したら記事が沢山です http://www9.plala.or.jp/siouxsie/date06.html シートモジュールにコードを書くこと。 Targetのセル限定は1セル、行・列、セル範囲 http://oshiete.nikkeibp.co.jp/qa2932094.htmlなど 、セル範囲外などのはんつき判別が必要に応じて行われる。 データの変動にはどういうものがあるか良く勉強すること。手入力は良いが、コピー貼り付け、VBAでセルの値変化、DELその他色んなケースがあって私は難しいという感じを持っている。
その他の回答 (2)
- S-Fuji
- ベストアンサー率36% (592/1624)
>Private Sub Worksheet_Change(ByVal Target As Range) >を利用しますと、 >コンパイルエラーとか >End subを入れてあるのに「End subが必要です」となり >駄目なんです。 >また「初期化ボタン」を押すとセルの値が変わる為なのか >同じく >コンパイルエラーとか >End subを入れてあるのに「End subが必要です」 >となってしまいます。 これは、キチッとプログラムの組立が出来ていないからでしょう。 Sub とEnd Subは、1対1に成らなければいけません。 >Private Sub Worksheet_Change(ByVal Target As Range)では >ループしてしまって駄目なのでしょうか? マクロの中で、セルを書き換えると、またイベントが発生します。 で、イベントを止めるコマンドを書き込んでおきセルを書き換え、 マクロから抜ける寸前に、戻します。 止める場合、「Application.EnableEvents = False」 イベントの発生を、許可する場合 「Application.EnableEvents = True」を書いておきます。 一寸、一言。 ボタン等を作るのは、「ファーム」ではなく「フォーム」です。 http://www.officepro.jp/excelvbaform/
お礼
>止める場合、「Application.EnableEvents = False」 >イベントの発生を、許可する場合 >「Application.EnableEvents = True」を書いておきます。 これを組み込みました。 ループとかはしなくなりました。 >コンパイルエラーとか >End subを入れてあるのに「End subが必要です」 >となってしまいます。 も直りましたが、肝心な印刷が開始しません。 >一寸、一言。 >ボタン等を作るのは、「ファーム」ではなく「フォーム」です。 申し訳ありません。 別な発想から、思っていた物が完成しました。 (シート1のセルB5が5ケタ以上なら、「現在、印刷ボタンをクリックすると起動するマクロ」をCall。) ありがとうございました。
- S-Fuji
- ベストアンサー率36% (592/1624)
ワークシートのイベントを利用することで、マクロを起動できます。 この場合、セルが変更されたら起動するようにしましょう。 このイベントは、何処のセルが変更されても起動するので、 マクロの中で、「特定のセル」が変更されたかを確かめる必要が有ります。 イベントは、「Worksheet_Change」です。 Help等も参考に 例 Private Sub Worksheet_Change(ByVal Target As Range) End sub
補足
作成したマクロなんですが以下のようになっています。 シート1=入力画面と表示画面 シート2=マスターデータ シート3=連番印刷の為のデータエリア シート1の B5のセルに英数字を入力しエンターを押して確定すると シート2のC列から同レコードを検出し、 その検出した行のD~G列の値を シート1のD5~D8に値をかえします。 データがあった場合には、シート1のD5~D8に値が表示されています。 シート2にデータが無い場合はシート1のD5~D8には「#N/A」と表示されます。 ここまでは関数なのでマクロではありません。 ここでファームで作成した「印刷ボタン」をクリックします。 ここで登録したマクロが起動します。 シート1のD5に「#N/A」が表示されている場合はメッセージボックスで 「データがありません」と出ます。 メッセージボックスの「OK」をクリックすると、 入力したシート1のB5のデータがDELETEされます。 印刷は実行されません。 D5~D8が「#N/A」以外の場合は印刷が実行されますが シート3の数値を利用した別のマクロで印刷の都度 番号を繰り上げてシート1のセルD9に表示します。 次の印刷時に有効です。印刷ボタンを押すごとにと1番づつ繰り上がります。 印刷ボタンを押すと印刷がされますがと同時に シート1のセルB5がDELETEされます。 結果シート1のD5~D8は「#N/A」が表示されます。D9はクリアされません。 印刷終了後セルの値が変化する事になります。 もう一つファームで作成した「初期化」というボタンがあります。 これをクリックするとマクロが起動して シート1のセルB5がDELETEされます。 よってシート1のセルD5~D8も「#N/A」に値が変わります。 Private Sub Worksheet_Change(ByVal Target As Range) を利用しますと、 コンパイルエラーとか End subを入れてあるのに「End subが必要です」となり 駄目なんです。 また「初期化ボタン」を押すとセルの値が変わる為なのか 同じく コンパイルエラーとか End subを入れてあるのに「End subが必要です」 となってしまいます。 マクロの中にセルの値を変化させる内容が組み込まれていると Private Sub Worksheet_Change(ByVal Target As Range)では ループしてしまって駄目なのでしょうか? 回避策はないのでしょうか?
お礼
現在正常に稼動しています「印刷ボタンをクリックで起動するマクロ」を セルのChangeイベントに使用したかったのですが マクロ内に、セルの書き換え、コピペ、関数による編集が多数あり うまくいきません。 別の発想で B5セルの値が5ケタ以上になったらマクロを起動にして セルのChangeイベントでCallで前項のマクロを呼び出しで成功しました。 ありがとうございました。