• ベストアンサー

エクセルのマクロ実行について

ボタンではなく動作を受けてマクロを実行させることはできませんか? 例えば、あるセルに「2」を入れると実行する等

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんにちは。 今、読み返してみると、私の文章はおかしいです。コードは一気に書きますが、文章、足したり消したり、縦書きにしたり横書きにしたりして書いています。 こちらの含みのメッセージに良く気がつかれましたね。さすがです! 私は、聞かれない前には、ほとんどあれこれ書かないことにしています。そうしないと長く続けられません。他人のコードに疑問を感じることも大事ですね。 If Target.Count > 1 Then Exit Sub  これは、Changeイベントの、お約束ということで、ロックで開いているところがひとつなら、ここは必要ありません。二つ開いて処理したりすると、以下のような部分でエラーが出ます。 あくまでも、Target は、ひとつ分しか想定していないからです。 2個分入るとエラーが発生します。(配列値になるからです)  If Target.Address <> "$B$4" Then Exit Sub  If Target.Value = 2 Then >なぜロックシート?ということで呼び出さなければならないのか。 実は、サブルーチン LockSheet そのものは、意味を持っていないからです。だから、取り外しが簡単なように、別にしました。 B4さえ、アンロック状態なら、ThisWorkbook モジュールの WorkBook_Open などの起動時に、 Private Sub Workbook_Open() With Worksheets("Sheet1")  .UnLock  .Protect, _   DrawingObjects:=True, _   Contents:=True, _   Scenarios:=True, _   UserInterfaceOnly:=True End With End Sub とするだけで、最後のUserInterfaceOnly という単語が生きていて、マクロ側からは、シートのプロテクトでエラーが出ません。 >多少無理があるコードのようですね。 実は、私は、個人的には、あまり、Change イベントを使いません。今まで、Excel 2003 までですと、イベントの再発生は、1万回ぐらいで、イベントとマクロコードのタイムラグが生じて停止するのですが、Excel 2007 では、スピードが速いせいか、ハング状態になってしまいます。 Application.EnableEvents = False だから、イベント・スイッチをOffにして使うわけです。 今回の元のマクロも、イベントの再発生が発生しています。入力の自セル(B4)以外に値を置く場合は、イベントの再発生してしまいます。     Range("V12:AL15").Delete Shift:=xlUp     Range("V12:AL15").Insert Shift:=xlDown     Range("V12:V13").Value = "管理部署"     Range("V14:V15").Value = "設置場所" ----------------------------------------------     Range("V12:V13").Value = "移動先 管理部署"     Range("V14:V15").Value = "移動先 設置場所" この二つ範疇で発生してしまいます。ボタン・クリックには、そうしたイベント再発生がありません。 イベント・ドリブン型マクロというのは、なかなか難しいです。コードの中では、出来る限りエラーが発生しないようにして作ることが大事なのですが、一旦、エラーが発生すると、イベントが動かなくなってしまいます。そのたびに、Application.EnableEvents = True という方法も、あるのですが、ユーザーさんに、それを説明するのが、面倒なのです。そういう自力回復できないマクロは、不完全だと思います。 安易に、On Error Goto ErrHandler というエラー・トラップを設けることもあるのですが、全体のコードが格好が悪いです。それを他の方法で回復する方法もあるのですが、それは、実務上の問題ですから、掲示板では相応しくないような気がします。アマチュアとプロの差というのは、エラー処理の仕方だといわれる所以です。たかが、VBAマクロなのですが、それでも、完ぺきを目指さなくてはならない時があります。プロの方でも、VBAマクロになるとテンションが下がる人もいます。 人に使わせるマクロって、簡単なことでも、ものすごく難しいのです。悔しいかもしれませんが、よほど実力が付くまでは、ユーザーのために、必要以上はプロジェクト・ロックはしないということです。

mutuaikun
質問者

お礼

今回はマクロをあきらめました(少し悔しいですが)。 条件付き書式というのがあるのを思い出して、 白くするということで対応しました。 ありがとうございました。

mutuaikun
質問者

補足

こんにちは。 ご丁寧にありがとうございます。 実は、夜に教えていただいたコードのファイルをいじっていたら、B4以外のアンロックセル(イベントには関係ないただの入力セル)をいじって保存すると、マクロが無効になることがわかりました。やっぱりChange イベントにこの動作がひっかかりこのようなことが起こってしまうかなと思いました。(2007のExcelで97-2003の互換モードで作成しているためそのことも多少影響があるのかもしれませんが・・・)いったんファイルを閉じてマクロを有効にすれば回避はできますが、それだと意味がないので、正直自分のレベルからするとこのイベント・ドリブン型マクロというのは、使いこなせないかなと思いました(せっかく教えていただいたのにすみません。)。作業を低減してもらおうと思って配ったもので困らせてしまうのは本末転倒ですからね。 ボタンをつけてのマクロを作成して試みているのですが、コピーのところでエラーが出てしまい(上書きしてもいいですか?とメッセージが出てマクロが止まる)、その回避を考えています。 書いていただいた内容でよくわからないところがあり、今後のためにできれば教えていただきたいのですが、・・・ Private Function LockSheet(flg As Boolean) ActiveSheet.Protect , _ DrawingObjects:=flg, _ Contents:=flg, _ Scenarios:=flg, _ UserInterfaceonly:=True End Function の代わりに、下記文章をかいたらコンパイルエラーが出てしましました(Sub またはFunctionが定義されていません)なぜだか検討はつきますでしょうか。(面倒でしたら回答なしでOKです^^) Private Sub Workbook_Open() With Worksheets("Sheet1") .UnLock .Protect , _ DrawingObjects:=True, _ Contents:=True, _ Scenarios:=True, _ UserInterfaceonly:=True End With End Sub

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんにちは。 お礼と補足の前後関係がわからないので、答えようがありませんが、 以下は、このようにして、ThisWorkbook に取り付ければよいですが……。 .Unlock は、間違いでした。 Private Sub Workbook_Open() With Worksheets("Sheet1")     .Unprotect 'ここは修正してください。     .Protect , _     DrawingObjects:=True, _     Contents:=True, _     Scenarios:=True, _     UserInterfaceonly:=True   End With End Sub

mutuaikun
質問者

お礼

ご回答ありがとうございました。 Private~についてまだ理解できていない部分が多いので 勉強してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 コードとしては、少し無理があるように見受けられます。 B4をロックしたら、このコードはまったく動きません。 この場合は、トグルボタンとかどの方が確実です。なぜ、ボタンではいけないのか、良く分かりません。セルに入力するというコードの方が複雑になり、不安定になります。 Application.EnableEvents = False これで、イベントの再読み込みは防いではいるのですが、コード中にエラーが発生すると、手動か別のマクロで、EnableEvents = True にしなければなりません。 Range("V12:V13").FormulaR1C1 = "=IF(R4C2=1,""移動先 管理部署"",IF(R4C2=2,""管理部署"",""""))" B4 で判定させるなら、数式の必要はないと思います。 '------------------------------------------------ Private Sub Worksheet_Change(ByVal Target As Range)   Call LockSheet(False)   If Target.Count > 1 Then Exit Sub 'アンロックセルが2つ以上ある場合      Application.EnableEvents = False      If Target.Address <> "$B$4" Then Exit Sub      If Target.Value = 2 Then     Range("V12:AL15").Delete Shift:=xlUp     Range("V12:AL15").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove     Range("V12:V13").Value = "管理部署"     Range("V14:V15").Value = "設置場所"          Range("B4").Select        Else     Range("A12:Q15").Copy Range("V12")     Range("V12:V13").Value = "移動先 管理部署"     Range("V14:V15").Value = "移動先 設置場所"          Range("B4").Select   End If   Application.EnableEvents = True   Call LockSheet(True) End Sub Private Function LockSheet(flg As Boolean)    ActiveSheet.Protect , _    DrawingObjects:=flg, _    Contents:=flg, _    Scenarios:=flg, _    UserInterfaceonly:=True End Function

mutuaikun
質問者

補足

(寝てしまいました。) おはようございます。 ご回答ありがとうございます。 書いていただいたコードで行ったところ、目的の内容を行うことができました。 このファイルは依頼票で、マクロなどあまりわからない多数の人間に配布し、記入印刷してもらったものを提出してもらうために作成しています。 マクロを意識しないで(ボタンを押すというひと手間をさせないで)ファイルを使用してもらおうと思い、ボタンなしでというマクロにしようと思ったのですが、多少無理があるコードのようですね。 自分が理解できていない部分があるのでこのままファイルを配布するかどうか悩んでいます。 わからない部分についてご教授いただけると助かります。 このシートの中で、B4以外にも複数のセルについてセルのロックをはずしてシート全体に保護をかけています。 ただし Range("V12:AL15") Range("V12:AL15") Range("V12:V13") Range("V14:V15") についは保護をかけている部分なので(セルがロックされている状態)、当初保護をいったん外すコードを記入していました。 Call LockSheet(False) If Target.Count > 1 Then Exit Sub     Application.EnableEvents = False    If Target.Address <> "$B$4" Then Exit Sub 上記のコードの意味をもう少し詳しく教えていただけないでしょうか。 なぜロックシート?ということで呼び出さなければならないのか。 またターゲットカウントをいう概念で分岐しなければならないのか。 Private Function LockSheet(flg As Boolean) ActiveSheet.Protect , _ DrawingObjects:=flg, _ Contents:=flg, _ Scenarios:=flg, _ UserInterfaceonly:=True End Function 上記文章についてもヘルプなどで調べてみたのですが、どういう意味かわかりませんでした。 保護を外したシートに再度保護をかけている?という作業行っているのですか? お手数をおかけいたしますが、よろしくお願いいたします。     

全文を見る
すると、全ての回答が全文表示されます。
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.5

If Target.Address = Range("B4").Address And Target.value = 2 Then としてみてください。

全文を見る
すると、全ての回答が全文表示されます。
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

横からすみません。コードを記述する場所が違っていると思います。 シート名のタブが下にありますが、それを右クリックして、コードの表示をクリック VBエディターが起動したら、 Private Sub Worksheet_Change(ByVal Target As Range) と End Sub の間にコードを記述します。

mutuaikun
質問者

補足

ご回答ありがとうございます! 今度は If Target.Address = Range("B4") And Target = 2 Then のところで型が違うというメッセージがでてしまいました。 何かだめなのか検討がつきますでしょうか。。

全文を見る
すると、全ての回答が全文表示されます。
  • takesun
  • ベストアンサー率40% (22/54)
回答No.3

マクロの中身までみていませんが 頭のSub Macro5()が不要だと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

SheetのコードにWorksheet_Changeイベントを書く。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address=(あるセル) And Target=2 then (処理) end if End Sub

mutuaikun
質問者

補足

ご回答ありがとうございます! でも・・・コンパイルエラーが出てしまいました。 「名前が適切ではありません:Worksheet_Change」 できればご教授いただけると助かります。。 ↓マクロ全文です。 -------------------------------------------------------- Sub Macro5() Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("B4") And Target = 2 Then ActiveSheet.Unprotect Range("V12:AL15").Select Selection.Delete Shift:=xlUp Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True Range("B4").Select Else ActiveSheet.Unprotect Range("A12:Q15").Select Selection.Copy Range("V12").Select ActiveSheet.Paste Application.CutCopyMode = False Range("V12:V13").FormulaR1C1 = "=IF(R4C2=1,""移動先 管理部署"",IF(R4C2=2,""管理部署"",""""))" Range("V14:V15").FormulaR1C1 = "=IF(R4C2=1,""移動先 設置場所"",IF(R4C2=2,""設置場所"",""""))" ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True Range("B4").Select End If End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

シートのセルのChangeイベントの例をGoogleででも検索して、勉強のこと。しょっちゅうVBAの質問の回答でも出ているよ。

mutuaikun
質問者

補足

ご回答ありがとうございます。 さっそくGoogleで検索してみたのですが、自分のやりたいことと結びつけができないです。勉強不足ですね。 月曜までに仕上げたいので、困っています。 一般のプロシージャ(標準モジュール)に作成するのではなく、オブジェクトに対して直接作成する形式と取らないとだめなのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • EXCELでマクロを初めて実行してみたんですがぁ・・・・

    初めてマクロというものをやってみました。 ただ、動作を記憶させただけです。プログラムは全然知りません。 sheet1の株価4本値と日付を1日だけ繰り上げる 単純な動きです。一番最後のセルにその日の 日付と4本値と入れて、マクロを実行させて、1日だけ繰り上げる 作業です。 それを、Sheet2が「=Sheet1!B2」このような形で参照するように してあるのですが、実行させると、 Sheet2B2のセルが#REF!とかなんとか表示されて B3からしか正しく表示されません。 以後同じことを繰り返すと、どんどん1つずつセルがエラーして 正しく表示されるセルが下がりながら、減っていってしまいます??? なぜなんでしょうか?? また回避策というか、正しい方法はありますでしょうか?? 何卒、初めてなので、わかりやすくお教えいただけると ありがたいです。 よろしくお願いを致します。

  • EXCELで”+100"を実行するマクロ

    EXCELで、マクロを実行するたびに、そのセルに入っている数に100プラスされるマクロを作りたいのです。 意味がよく分からないかもしれませんが、 例えば、あるセルに"100"という数値が入っていて、 1回実行すれば100+100で"200"に、もう1度実行すると、200+100で"300"に。…という感じです。 私的に考えたのは、 別のセルに"そのセル+100"をする式を書き込み、 コピー&元のセルに値貼り付けをし、 式の入った別のセルをDELする… というのをマクロにしてみたのですが、 イマイチうまくないというか… よい方法があったら、アドバイスください。

  • Excel 画像クリックでマクロ実行

    Sheet上にある画像をクリックすると拡大表示する、という動作をさせたいと考えています。 画像は複数個、順次追加されるので、画像にマクロを組みこんで、ボタン化する、ということではなく、イメージとしてはWorkbook_SheetChangeでどのセルの値を変えてもマクロが実行されるように、どの画像をダブルクリックしても、その画像が拡大されるようにしたいのですが可能でしょうか?

  • エクセル マクロの実行方法について

    エクセル2003を使っています。 あるセル(例えばA1)をクリックする(アクティブにする)とあるマクロ(例えばmacro1)が実行されるようにしたいのですが、どのようにすればよいのでしょうか? フォームボタンを作ってボタンにマクロを割り当てるという方法は都合が悪いので、上記方法が実現できるととても助かります。 初歩的な質問で申し訳ありませんがよろしくお願いします。

  • Excel VBAでマクロの実行範囲を限定することはできますか?

    選択したセルに塗りつぶしを設定するマクロを組んでボタンに登録していますが、塗りつぶし不可のセルを選択してボタンをクリックした場合は塗りつぶしのマクロが実行できないようにする、といったことはできますか? よろしくお願いいたします。

  • エクセルのマクロが実行できません

    オフィス2002ではマクロを実行できたのに、オフィス2003に変えたらマクロに無署名のため、自動的にマクロが実行できないようになっているらしくて、マクロが実行できません。マクロを有効にするためには、「この発行者のマクロを常に信頼するチェックボックスをオンにする」「マクロを有効にするボタンをクリックする」とあるのですが、それらはどこをクリックすれば出てくるのでしょうか?

  • 値によって違うマクロの実行

    表題の質問をさせていただきます。よろしくお願いいたします。 A1セルには、別シートで計算された値が転記されるようになっており、1から45までのいずれかの数値が入っています。 その数値によって異なる動きをするマクロが3個あります。  1から15の時はマクロA  16から30の時はマクロB  31から45の時はマクロC おのおののマクロはフォームのボタンから実行できるように登録してあります。 現在はA1セルの数値を見て該当するボタンを押してマクロを実行しています。 たとえばA1の値が「25」の時はマクロCが登録してあるボタンCを押しています。 そこで質問させていただきたいのは 既存のボタンを撤廃し 新たに設置するひとつのボタンで3個のマクロを制御したいと思ったのです。 新たなマクロでA1の値を取得し、そのマクロ内で既存のマクロへ割り振るためには どのような記述をすればよいのでしょうか。 よろしくお願いいたします。

  • エクセルのマクロについて

    エクセルのマクロ実行についてですが、 例えば、 E1セルの値が1ならばこうする(マクロ名 E1セル1) E2セルの値が2ならばこうする(マクロ名 E1セル2) E3セルの値が3ならばこうする(マクロ名 E1セル3) というマクロを別々に作りました。 これをボタンで実行する時に、 If Range("E1").Value = 1 Then ElseIf Range("E1").Value = 2 Then 2行目には作ったマクロを全部貼り付けないといけないのでしょうか? それとも簡単にこの場合は、マクロ名E1セル1を実行するという命令することができるのでしょうか? できるのであれば、入力方法を教えてください。 質問が分かりにくいと思いますが、よろしくお願いします。

  • エクセル アクティブ中のセルにマクロ実行

    表題の件について質問させていただきます。 基本的に数字の入っているセルなのですが、たまに数字の前に備考として特定の文字を入力しています。  特定文字例:東京・千葉・埼玉・鈴木・木村・佐藤  入力後の例:東京232・木村50 その特定の文字の入力には、マクロ登録してあるボタンで実行しています。  ActiveCell.FormulaR1C1 = "特定の文字" さて、質問なのですが、上記ではセルを選択しているときにボタンを押すことで特定文字の入力はきるのですが、入力中っていうのかな?カーソルが点滅している最中にはマクロが実行できないのです。 その為、数字の入った後のセルを選択してボタンを押すと、いちど数字の上に特定文字が上書きで入力されて数字が消えてしまいます。 現在は、ボタンを押して特定文字を入力した後に再度数字を入力しています。 どうにか、セルの選択中でもカーソル点滅中でもマクロを動かすことはできないでしょうか。 よろしくお願いいたします。

  • 別ファイルからのマクロ実行

    Excelファイルにコマンドボタンを設定し、別ファイルのマクロを実行したいのですが、この動作は可能なんでしょうか? マクロの動作設定はしていて、マクロ実行の動きを行いたいのです。 お分かりの方がいらっしゃいましたら、ご回答よろしくお願いします。

専門家に質問してみよう