『はい・いいえをするには?』(新卒事務員)
以下の様なマクロを記録から作成しました。
このマクロを実行する前に、削除しますか?はい・いいえと
選んではいの時に実行させるにはどうしたらいいですか?
マクロは初心者なのでよくわからないので教えて下さい。
よろしくお願いします。
Sub Macro1()
Sheets("Sheet1").Select Range("C4:G28").Select Selection.ClearContents Range("C4").Select Sheets("Sheet2").Select Range("C4:G28").Select Selection.ClearContents Range("C4").Select Sheets("Sheet3").Select Range("C4:G28").Select Selection.ClearContents Range("C4").Select Sheets("Sheet4").Select Range("C4:G28").Select Selection.ClearContents Range("C4").Select Sheets("Sheet5").Select Range("C4:G28").Select Selection.ClearContents Range("C4").Select Sheets("Sheet6").Select Range("C4:G28").Select Selection.ClearContents Range("C4").Select Sheets("Sheet7").Select Range("B2").Select End Sub
< 使用 Excel:Excel2019、使用 OS:Windows10 >
ちなみに
「ClearContents」
という命令は「消去」であり「削除」ではありません。
「削除」は「Delete」という命令で、
Excel上で手作業でやったときに、「〇〇方向にシフト」
というウインドウが表示される作業です。
(匿名) 2025/09/03(水) 10:03:51
>該当のセルを選択したら >その範囲のデータを消去する前に、 >メッセージを出して、 >「はい」の時だけデータを消去するという事でしょうか?
はい。その通りです。消去で大丈夫です。 よろしくお願いします。 (新卒事務員) 2025/09/03(水) 10:05:53
こんなことでしょうか。 Sub test() Dim ans As Variant ans = MsgBox("セルを消去してよければ""はい""を押して下さい", vbYesNo) If ans = vbYes Then Call セル範囲消去 End If End Sub
マクロ記録そのままだと何をしているか、後々見てもわかりにくいので、 せめてこれぐらいにはされたほうがよいと思います。 もちろん、繰り返しの構文を使うことができるわけですが。 Sub セル範囲消去() Sheets("Sheet1").Range("C4:G28").ClearContents Sheets("Sheet2").Range("C4:G28").ClearContents Sheets("Sheet3").Range("C4:G28").ClearContents Sheets("Sheet4").Range("C4:G28").ClearContents Sheets("Sheet5").Range("C4:G28").ClearContents Sheets("Sheet6").Range("C4:G28").ClearContents End Sub (xyz) 2025/09/03(水) 10:13:19
標準モジュールというフォルダの絵の下階層にある
「Module1」と書いてあるところが、
標準モジュールといいます。
マクロ記録すると、これがExcelによって作られます。
そして、その上あたりにある
Microsoft Excel Objects
というフォルダの下に、Sheet1(Sheet1)、Sheet2(Sheet2)…Sheet7(Sheet7)
というのがあると思います。
これらを、先ほどの「標準モジュール」に対して、
「Sheetモジュール」といいます。
ここをダブルクリックすると、
そのシート用のコードをかけるようになります。
【標準モジュールに書くコード】
Sub Sample(ws As Worksheet, rngActRange As Range)
Dim rng As Range Dim ret As Long
Set rng = ws.Range("C4:G28") If Not Application.Intersect(rngActRange, rng) Is Nothing Then ret = MsgBox("消去しますか?", vbYesNo + vbDefaultButton2) If ret = vbYes Then rng.ClearContents End If
End Sub
【Sheetモジュールに書くコード】
※全てのSheetモジュール(Sheet1〜Sheet7)に記述します。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call Sample(ActiveSheet, Target) End Sub
(匿名) 2025/09/03(水) 10:28:23
Sheet1のC4〜G8を選択してマクロを実行したとき、
Sheet1〜Sheet7のC4〜G8を消去する場合は、
xyz様の回答です。
私の回答は、
Sheet1のC4〜G8が選択された場合、
Sheet1のみの該当範囲が消去されるものです。
(匿名) 2025/09/03(水) 10:46:30
■1
質問のようなことであれば、既に提案のあるようにMsgboxを使うのが一般的かとおもいます。
Msgboxは細かく説明しだすとキリがないですし、「VBA Msgbox」などで検索いただいて解説サイトをご覧いただいたほうが理解が深まると思いますので詳細の説明は省きます。
〜〜以下は、質問とは関係しない蛇足部分になりますので興味がなければ読み飛ばしてください〜〜
■2
VBAの世界では基本的にシートやセル(オブジェクトといいます)は、きちんと指定すればいちいちアクティブにしたり選択したりする必要はありません。
また、【標準モジュール】でシートの指定を省略するとActiveSheetが指定されたとみなされるルールです。
上記を踏まえると、今回のように複数シートを扱うのであれば、可読性向上の観点からも対象オブジェクトをきちんと記述することをお勧めします。
■3
今回のケースでは、複数のシートの同じセル範囲を対象にセルの値をクリアしたいということと理解しました。
このような場合、手作業であれば【作業グループ】を使うこともあろうかとおもいます。
この、作業グループはマクロでも扱うことができ、上記に反しますが↓のようにシートを選択するという書き方になります。
Sub 研究用1() Stop 'ブレークポイントの代わり If MsgBox(Prompt:="実行?", Buttons:=vbYesNo) = vbYes Then Stop 'ブレークポイントの代わり Worksheets("Sheet1").Select Worksheets("Sheet2").Select False Worksheets("Sheet3").Select False Worksheets("Sheet4").Select False Worksheets("Sheet5").Select False Worksheets("Sheet6").Select False
Range("C4:G28").ClearContents
Sheets("Sheet7").Activate Sheets("Sheet7").Range("B2").Select End If End Sub
■4
上記のように作業グループを使うこと"も"できますが、私ならちらっと紹介のあった繰返処理を使って↓のように書くと思います。
Sub 研究用2() Dim SH As Worksheet
If MsgBox(Prompt:="実行?", Buttons:=vbYesNo) = vbYes Then Stop 'ブレークポイントの代わり For Each SH In Worksheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6")) SH.Range("C4:G28").ClearContents Next
Application.Goto Sheets("Sheet7").Range("B2") End If End Sub
■5
このように、同じ結果でもいろいろなアプローチがありますので、興味があれば【ステップ実行】で研究してみるとよいとおもいます。
そのうえで、理解しづらいところがあれば具体例をあげて質問されるとアドバイスが得られると思います。
(もこな2 ) 2025/09/06(土) 18:23:19
>以下の様なマクロを記録から作成しました。
「マクロの記録」の機能はマクロを作る機能ではなく、
単に行った操作をVBAのコードとして記録されるだけですので、
記録されたものだけでは、作業の自動化はなかなかできません。
様々な単語や文法を覚える必要がありますのでご覚悟をしてください。
で、
1)Sheet1を選択してShiftキーを押しながらSheet6を選択
2)そのまま適当にセル範囲を選択
3)値のクリア
というような操作をやってみて記録されたコードが
Sub Macro1()
'
' Macro1 Macro
'
'
Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6")).Select '1)シートの選択 Sheets("Sheet1").Activate Range("B5:I15").Select ’2)セルの選択 Selection.ClearContents ’3)値のクリア End Sub
注)「'」より右は私が追記しました。
これによりなんとなく書き方を理解して、
ご所望の「条件分岐」の文も追加して清書すると、
Sub test()
If MsgBox("値をクリアしますか?", vbYesNo) = vbNo Then Exit Sub
With Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6")) .Range("C4:G28").ClearContents .Range("C4").Select End With Application.Goto Sheets("Sheet7").Range("B2") End Sub
というような感じになります。
(人により多少の考え方や手順に違いが出ます。つまりいろいろな書き方ができる。)
条件分岐の参考URL>>
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_if_select.html
参考になれば。。。
(まっつわん) 2025/09/06(土) 19:55:26
With Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6")) .Range("C4:G28").ClearContents .Range("C4").Select End With を実行するとエラーになりませんか? (xyz) 2025/09/06(土) 22:40:12
もこな2さん Sub 研究用1() ですが、最初のシートしか消去されませんね。(Excel365,Win10) お手元では成功しますでしょうか。 (xyz) 2025/09/07(日) 21:15:25
研究用1はダメですね。
(もこな2) 2025/09/07(日) 23:23:23
Sub 研究用1_改() Stop 'ブレークポイントの代わり If MsgBox(Prompt:="実行?", Buttons:=vbYesNo) = vbYes Then Stop 'ブレークポイントの代わり Worksheets("Sheet1").Select Worksheets("Sheet2").Select False Worksheets("Sheet3").Select False Worksheets("Sheet4").Select False Worksheets("Sheet5").Select False Worksheets("Sheet6").Select False
Range("C4:G28").Select Selection.ClearContents
Sheets("Sheet7").Activate Sheets("Sheet7").Range("B2").Select End If End Sub
(もこな2) 2025/09/07(日) 23:28:40
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.