[[20250903094100]] 『はい・いいえをするには?』(新卒事務員) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『はい・いいえをするには?』(新卒事務員)

以下の様なマクロを記録から作成しました。
このマクロを実行する前に、削除しますか?はい・いいえと
選んではいの時に実行させるにはどうしたらいいですか?
マクロは初心者なのでよくわからないので教えて下さい。
よろしくお願いします。

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

マクロコードが書かれている画面(VisualBasicEditerという)の左上にある
プロジェクト-VBAProject
というウインドウを見てください。

標準モジュールというフォルダの絵の下階層にある
「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


前にここでClearなら消せるがClearContentsだとだめってのがあったと思うが
.Range("C4:G28").value = ""
なら大丈夫とか
読まねえんだな・・・
(nara,) 2025/09/07(日) 23:24:49

Microsoft365で↓なら成功しました。
報告まで。

    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.