• 締切済み

(マクロ)特定のセルを変更しようとしたら確認メッセージが出るようにしたい

表題の通りです。 ある、特定のセル(ここの入力次第で金額が大幅にずれ、決算が間違う可能性がある:現在リストから選択)を変更したら本当にこれでよろしいですかと表示が出て、はいと押したら変更が反映され、いいえとおしたら反映されない。 このようなマクロの組み方ってどうすればいいでしょうか?リストにしてあるため(入力は3通り)誤って他のものを選択してしまう可能性があるのが怖いんです。 よろしくお願いします。

みんなの回答

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.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つを現在のシートに合わせて、変えてください

starlight56
質問者

補足

ありがとうございます。早速試してみました。 ただ二点ほどうまくいかない点があったので追加で教えていただけないでしょうか? 一点目は >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以降が実行されないと思うのです。 これを解決するためにマクロの本をだいぶ読んだのですが、私の知識不足でどうしても解決方法がわかりません。 つきましては解決方法をご教授願えないでしょうか?

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

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」と出てきますが、それを実際に値を入力するセルの番地に書き換えてください。 これでご希望の動作ができると思います。一応仕組みとしては、 ・そのシートが表示されたり、そのセルが選択されたときに、作業用のシートに元の値をコピーして保存しておく。 ・そのセルの値が変更されたとき、「これでよろしいですか」というダイアログを出し、「いいえ」を選択したときは、そのセルの内容を保存しておいた元の値に戻す。 ということをやっています。作業用シートを表示したくないときは、作業用シートを選択してから「書式」>「シート」>「表示しない」で非表示にすればいいでしょう。 もしご希望の通りに動かない場合は補足をお願いします。

関連するQ&A