重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

表題の通りです。
ある、特定のセル(ここの入力次第で金額が大幅にずれ、決算が間違う可能性がある:現在リストから選択)を変更したら本当にこれでよろしいですかと表示が出て、はいと押したら変更が反映され、いいえとおしたら反映されない。

このようなマクロの組み方ってどうすればいいでしょうか?リストにしてあるため(入力は3通り)誤って他のものを選択してしまう可能性があるのが怖いんです。

よろしくお願いします。

A 回答 (2件)

Private Sub Worksheet_Change(ByVal Target As Range)


  toku_l = 1: toku_c = 1 '特定セルの座標
  l = Target.Row: c = Target.Column
  If (toku_l = l) And (toku_c = c) Then
   x = Target.Value
   toku1 = 1: toku2 = 2: toku3 = 3 'リストに設定されている値
   If Not ((x = toku1) Or (x = toku2) Or (x = toku3)) Then
    yn = MsgBox(" 本当に " & x & " でよろしいですか", vbYesNo)
    If yn = vbNo Then
     Cells(toku_l, toku_c) = toku1 'デフォルトの値
    End If
   End If
  End If
End Sub
---------------------------
特定セルの座標
リストに設定されている値
デフォルトの値
の、3つを現在のシートに合わせて、変えてください

この回答への補足

ありがとうございます。早速試してみました。
ただ二点ほどうまくいかない点があったので追加で教えていただけないでしょうか?

一点目は
>Cells(toku_l, toku_c) = toku1 'デフォルトの値
となっていますがデフォルトの値に戻すのではなく、前回の内容に戻したいのです。
つまり、例えば現在入力規則でリスト1、リスト2、リスト3と3通り選べるようになっています。このときリストが現在リスト2の状態であったときにリスト3を選んだら、本当にこれでいいですかと表示が出てハイを押せばリスト3、いいえを押せばリスト2に戻るようにしたいのです。
教えていただいた方法では常にデフォルトの値になってしまいます。

二点目は、 If Not ((x = toku1) Or (x = toku2) Or (x = toku3))
という箇所ですが、これですとリストにない項目を入力してはじめて
then以降が実行される式だと思います。
つまり、リスト2からリスト3に選択したときTHEN以降が実行されないと思うのです。

これを解決するためにマクロの本をだいぶ読んだのですが、私の知識不足でどうしても解決方法がわかりません。
つきましては解決方法をご教授願えないでしょうか?

補足日時:2006/11/15 23:25
    • good
    • 0

1.まず、新たなシートを追加し、「作業用」というシート名にしてください。



2.数値を入力するシートの見出しを右クリックし、「コードの表示」でVBAの画面を出します。

3.以下のマクロを貼り付けてください。

Private Sub Worksheet_Activate()
  Worksheets("作業用").Range("A1").Value = Range("B2").Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address(False, False) = "B2" And Target.Value <> Worksheets("作業用").Range("A1").Value Then
    Beep
    If MsgBox("本当にこれでよろしいですか", vbYesNo + vbQuestion, "確認") = vbNo Then
      Target.Value = Worksheets("作業用").Range("A1").Value
    End If
    Worksheets("作業用").Range("A1").Value = Target.Value
  End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address(False, False) = "B2" Then
    Worksheets("作業用").Range("A1").Value = Target.Value
  End If
End Sub

4.上記のマクロの中に3カ所「B2」と出てきますが、それを実際に値を入力するセルの番地に書き換えてください。

これでご希望の動作ができると思います。一応仕組みとしては、

・そのシートが表示されたり、そのセルが選択されたときに、作業用のシートに元の値をコピーして保存しておく。

・そのセルの値が変更されたとき、「これでよろしいですか」というダイアログを出し、「いいえ」を選択したときは、そのセルの内容を保存しておいた元の値に戻す。

ということをやっています。作業用シートを表示したくないときは、作業用シートを選択してから「書式」>「シート」>「表示しない」で非表示にすればいいでしょう。

もしご希望の通りに動かない場合は補足をお願いします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!