『はい・いいえをするには?』(新卒事務員)
以下の様なマクロを記録から作成しました。
このマクロを実行する前に、削除しますか?はい・いいえと
選んではいの時に実行させるにはどうしたらいいですか?
マクロは初心者なのでよくわからないので教えて下さい。
よろしくお願いします。
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
研究用1_改()が成功することを確認しました。ありがとうございます。
複数シート同時操作の場合、Selectが不可避であり、 「シートは逐一選択するな」という方針の唯一といってよい例外である、 といった知識はありましたが、Selectionでしたか、実際に動かしてみないと分からないものですね。 提示された今もなぜそうするとよいのか理屈は分かっていません。(こうしたことは得てして多いですね)
私は迷わず各シートを繰り返し操作することにしたいと思います。(ま、その立場にはないけど)
# それにしても質問して回答があったのですから質問者さんからご返事を頂きたいものですね。 (xyz) 2025/09/08(月) 12:07:25
Sub test()
If MsgBox("値をクリアしますか?", vbYesNo) = vbNo Then Exit Sub
With Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6"))
.Select
.Item(1).Range("C4:G28").Select
Selection.ClearContents
.Item(1).Range("C4").Select
Selection.Select
End With
Application.Goto Sheets("Sheet7").Range("B2")
End Sub
>複数シート同時操作の場合、Selectが不可避であり >Selectionでしたか
なるほど。。。すっかり忘れてました^^;失礼しました。
(まっつわん) 2025/09/09(火) 08:35:43
Selectしないでも、
Sheets オブジェクトには FillAcrossSheets メソッドがあるので、
こんな書式で行けましたけども。(Win11、Excel2010)
↓
With Sheets(Array("Sheet1", "Sheet2", "Sheet3",・・・))
.Item(1).Range("A1:C2").ClearContents
.FillAcrossSheets .Item(1).Range("A1:C2"), xlFillWithContents
End With
(半平太) 2025/09/09(火) 09:48:52
使ったことなかったです。ありがとうございます。 xlFillWithFormatsとすると、書式(例:塗りつぶし色)だけコピーするんですねえ。 (xyz) 2025/09/09(火) 15:31:35
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.