Excelでセルをクリックした時にマクロを起動する方法

このQ&Aのポイント
  • Excelのセルをクリックした時に特定のマクロを自動的に起動する方法を解説します。
  • 条件として、C3〜C5のいずれかのセルをクリックする動作が必須です。
  • マクロを設定することで、セルクリック時のイベントをトリガーとして別のマクロを実行させることができます。
回答を見る
  • ベストアンサー

excelでセルクリックした時、マクロ起動

office2003です。 sheet1のC3,C4,C5セルに、ある文字列をコピーペーストするマクロがあります。…(1) マクロ文は省略 下記は、それぞれC3,C4,C5セルが選択(クリック)された時、実行するマクロ…(2)です。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row = 3 Then personC3 If Target.Column = 3 And Target.Row = 4 Then personC4 If Target.Column = 3 And Target.Row = 5 Then personC5 end sub やりたい内容は、C3,C4,C5に文字列を表示させ、その文字列がクリックされたら、 別のマクロを起動(例.C3クリックされたら、personC3マクロ起動)させたいのです。 しかし(1)(2)の順に実行すると、C3,C4,C5セルには文字列のコピーペーストが出来ません。 (2)のマクロは、セルが変化したら実行ですから当然なのは分かっているのですが、 ここが困っている所です。 もともとC3,C4,C5に文字列が入っている場合は、(2)のマクロだけでよいのですが、 (1)を実行した後に(2)のマクロが有効とするには、どの様にしたらよいのでしょうか? 尚、やりたい内容が実現できれば、他のやり方でも可です。 条件: C3~C5までのどれかをクリックする動作は必須です。 C3からC5までに設定される文字は、固定(同一)ではありません。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

selectionchangeイベントは「セルをクリックしたイベント」では無いので,どうやっても無理があるのは承知ですね。 シングルクリックではなくWクリックイベントを利用する方向に,設計変更することを推奨します。 で。今の限界の中でそれでもどーにかしてみるなら。 作成例: 「コピーペースト」の具体的な内容が不明のため,たとえばA1:A3の値をC3,4,5に転記する sub macro1()  range("C3:C5").value = range("A1:A3").value  range("A1").select end sub そのマクロによって「C3,4,5以外のセル」を選択しておいてから,C3,C4,C5の選択動作に移行する private sub worksheet_selectionchange(byval Target as excel.range)  if application.intersect(activecell, range("C3:C5")) is nothing then exit sub  if activecell.row = 3 then personC3  if activecell.row = 4 then personC4  if activecell.row = 5 then personC5 end sub さらにPersonC3,4,5実行後はまたA1セルに積極的に待避し,次の選択動作に備える sub personC3() ’do your work range("A1").select end sub sub personC4() ’do your work range("A1").select end sub sub personC5() ’do your work range("A1").select end sub

3620313
質問者

お礼

回答ありがとうございます。おもった通りの動作が実現できました(^^)/~~~

その他の回答 (1)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

1)「(1)を実行した後に」どこかのセルにでもフラグを立てておきます。 2)「その文字列がクリックされたら」そのフラグを参照して、「(2)のマクロが有効」になります。 3)「(2)のマクロが有効」になった後には、「どこかのセル」に立てたフラグは無効にしておきます。  要するに、 ・「sheet1のC3,C4,C5セルに、ある文字列をコピーペーストするマクロ」で、「どこかのセル」に立てたフラグを参照する ・「(2)のマクロが有効」になった後には、「どこかのセル」に立てたフラグは無効にする という条件を付けておくということです。

3620313
質問者

お礼

回答ありがとうございます。大変参考になりました。

関連するQ&A

  • エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい

    エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい。 今、3列目に入力された値によって15列から17列の値を自動入力するように次の マクロを作りました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 3 Then Exit Sub For Each r1 In Selection If r1.Cells(1, 1) <> "部品表" Then Cells(r1.Row, 15) = "-" Cells(r1.Row, 16) = "-" Cells(r1.Row, 17) = "-" End If Next End Sub 3列目のみのセルをペーストすると正しく動作しますが、1列目から3列目のセルにペーストすると何も動きません。 正しく動くようにするには、どう修正すればいいでしょうか?

  • Excel VBA で1時的に右クリックを使いたい

    30枚ほどのシートの表を一挙に変更したいです。ところが、各シートに次のコードが入っているため、右クリックしてコピーとか一切使えません。各シートの変更ができるまで、右クリック使いたいです。何か方法ありませんでしょうか? ' 画面の一番上表示 Dim hr As Range Set hr = Range("A1") '左上隅セルを設定 ActiveWindow.ScrollRow = hr.Row '行の一番上にスクロール ActiveWindow.ScrollColumn = hr.Column '列の一番左にスクロール End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 14 And Target.Row < 45 And Target.Column > 13 And Target.Column < 15 Then 明細入力フォーム.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 1 And Target.Column < 3 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 3 And Target.Column < 5 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 5 And Target.Column < 7 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 8 And Target.Column < 10 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 2 And Target.Column < 4 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 4 And Target.Column < 6 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 6 And Target.Column < 8 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 44 And Target.Column > 9 And Target.Column < 11 Then UserForm3.Show End If End Sub

  • メッセージボックスを表示させるエクセルマクロ

    こんにちは。マクロ初心者です。 エクセル(Excel2003)でメッセージボックスを 表示させるマクロが思うようにいかず困っています。 B列に「○○会社」と入力されれば、 「取引先です。」 とメッセージボックスを表示させたいと思い、 次のとおりマクロを作成しました。 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- しかし、コピーなどで複数のセルを貼り付ける(入力)行為をすると、 「実行エラー'13': 型が一致しません」と出てしまいます。 Worksheet_Change(ByVal Target As Range)を使っているので、 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- と、「If Target.Count > 1 Then Exit Sub 」を入れれば、 メッセージは出なくなるのですが、 これだと、A列セルに、コピー&ペーストで複数セルを貼り付けた場合、 「○○会社」があっても、マクロが効いてきません。 複数セルの貼り付けにも対応させるには、 どのようにすればよろしいでしょうか? 基本的なところが理解できていないのだと自覚しておりますが、 どうかご教授願います。 長々とわかりづらい文章ですみません。よろしくお願いします。

  • マクロでの条件判断について

    A行に何かデータを入力した場合、同じ列のとなりの行のセルに入力時間を残したいと思い、 例 A1:あ B1:2006/5/9/16:00 A2:い B2:2006/5/10/18:00 以下のマクロを教えて頂いたのですが、 Private Sub Worksheet_Change(ByVal Target As Range) '///A列のセル以外ならマクロ終了/// If Target.Column <> 1 Then Exit Sub '///1行目のセルならマクロ終了/// If Target.Row = 1 Then Exit Sub '///内容がブランクならB列のセルをブランクにする。/// If Target.Value = "" Then Target.Offset(0, 1).Value = "" Else Target.Offset(0, 1).Value = Format(Date + Time, "yyyy/mm/dd hh:mm:ss") End If End Sub A列以外にもC列に入力した値の入力時間をD列にE列に入力した値の入力時間をF列にと、全部で6箇所値を入力したとなりのセルに入力時間が出るようにしたかったのですが、 '///A列のセル以外ならマクロ終了/// If Target.Column <> 1 Then Exit Sub の部分を '///A,C列のセル以外ならマクロ終了/// If Target.Column <> 1 Or Target.Column <> 3 Then Exit Sub のように変更してまずはA列とC列に値を入れて挑戦したのですが、時間が表示されなくこまっておりました。 解決方法をご存知のかたがいらっしゃいましたら、ぜひよろしくお願いいたします。

  • エクセルのマクロでセル選択の条件式の書き方

    いつもお世話になりありがとうございます。 Excel97です。 Worksheet_SelectionChangeマクロで、 Range("B2:D11")内のセルが選択されたときに動くマクロを書きたいのですが、条件式を With ActiveCell If .Row < 12 And .Row > 1 And .Column < 5 And .Column > 1 Then '実行するマクロ End If End With とIfの行を And、And、And で長々と書かず、Range("B2:D11")を使うなりしてもっと簡略な記述方法はないでしょうか? ご教示いただければ幸いです。

  • シングルクリックでフォームが表示されない

    windowsXP  Excel2000 でマクロを作成している超初心者です。 あるサイトの暦で日付を入力するマクロですが、1枚のシートに 1)と 2)を併記して実験したところ正常に表示できました。 2)をシングルクリックで表示したいのですができません。なぜでしょうか? 2)はいかにも稚拙です。もっと整理したいのですが方法が分かりません。以上2点よろしくご指導ください。 -------------------------------------------------------------------- 1)シングルクリックで UserForm1を正常に起動できました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'シングルクリックで表示 Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 22 And Target.Column > 2 And Target.Column < 4 Then UserForm1.Show End If If Target.Row > 22 And Target.Column > 13 And Target.Column < 15 Then UserForm1.Show End If End Sub ------------------------------------------------------------------------- 2)ダブルクリックでしか正常に表示されません。 'Private Sub Worksheet_SelectionChange(ByVal Target As Range)’ 起動しない Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) '起動した Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 23 And Target.Column > 1 And Target.Column < 3 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 23 And Target.Column > 12 And Target.Column < 14 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 12 And Target.Row < 21 And Target.Column > 12 And Target.Column < 14 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 12 And Target.Row < 21 And Target.Column > 14 And Target.Column < 16 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 12 And Target.Row < 21 And Target.Column > 16 And Target.Column < 18 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 12 And Target.Row < 21 And Target.Column > 18 And Target.Column < 20 Then Call ShowCalendarFromRange2(Target) End If End Sub ----------------------------------------------------------------------- 3)'これがサイトにあった例で、これを元に上のスクリプトを作りました。 'Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 複数セル選択時は無視 ' If Target.Count <> 1 Then Exit Sub ' A列以外は無視(今回サンプルの例) ' If Target.Column <> 1 Then Exit Sub ' カレンダーフォームを起動する ' Call ShowCalendarFromRange2(Target) 'End Sub ---------------------------------------------------------------

  • 手動計算時の条件付書式判定

    excel2010 条件付き書式の判定に制約あるのでしょうか? A1,B1,C1セルに数値を設定し、 C2セルに=SUM(A1:C1)と設定します。 C2セルの条件付書式は、セルの値 次の値より大きい =500 上記条件で文字色を赤 としています。 計算方法の設定は手動。 また、マクロで下記を設定しています Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Row = 1) And (Target.Column >= 1 And _ Target.Column <= 3) Then 'セルの値に変更があったときに実行したい処理を記述 Calculate End If End Sub C2セルが500より大きくなったら、数値が赤になるはずですが、変わりません。 計算は実施しているのになぜ赤色にならないのでしょう? 下記の様にマクロを変更し、計算方法の設定を自動にすると正しく判定されます。 Private Sub Worksheet_Change(ByVal Target As Range) Application.Calculation = xlCalculationAutomatic '自動 xlCalculationManual If (Target.Row = 1) And (Target.Column >= 1 And _ Target.Column <= 3) Then 'セルの値に変更があったときに実行したい処理を記述 Calculate End If Application.Calculation = xlCalculationManual End Sub 上記で、とりあえずいけたのですが、計算はしているのに条件判定されないのが??? です。

  • マクロ、カーソルの相対移動

    下記マクロはカーソルの相対移動で教えいいただいたものです。 セルに値を入力しないで、Enterを押下した時もこのように動作させるためにはどのように記述したらいいでしょうか。教えてください。よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) if Target.Column = 2 Then Cells(Target.Row,5).Select if Target.Column = 5 Then Cells(Target.Row,7).Select if Target.Column = 7 Then Cells(Target.Row + 1, 2).Select End Sub

  • エクセル2003 VBAでセル移動

    いつもお世話になります。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row > 9 Then If Target.Column = 3 Then Cells(Target.Row, 4).Select ElseIf Target.Column > 5 Then Cells(Target.Row + 1, 1).Select End If End If End Sub これで、B列からC列を飛ばしてD列にセル移動して取りあえずの目的は達成しているのですが、 D列からB列には方向キー移動してくれません。Target.Columnが3になるんで当たり前なんですが・・・ B列の入力ミスがあるときマウスで移動させるか、A列まで戻ってから方向キーで上に上がるかです。 何かいい方法ありませんでしょうか。D列から方向キーで戻るときも、出来ればC列を飛ばしてほしいです。 よろしくお願いします。

  • VBA 特定セル変更時に指定セルに日付代入方法

    初心者のため、伝わるかわかりませんが、 次のような動作をVBAで行えなくて困っています。 ・行いたい事 (※前提として"行"ごとに実行します) J列が"1"だった場合、 L列にJ列が"1"になった日付(yyyy/mm/dd)を入力する ただし、J列には関数を使用し"1"と表示されているため セルの値変更ではありません。 ・現在のVBA Private Sub Worksheet_Calculate() If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then With Target.Offset(, 2) .Value = Now() .NumberFormatLocal = "yyyy/mm/dd" End With End If End Sub ※J列が関数を使用しているため、Calculateにしています。 2行目の↓の部分でエラーになってしまっています。 > If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then どなたかご教授いただけたら助かります。 よろしくお願いします。

専門家に質問してみよう