- ベストアンサー
メッセージを1度だけ表示したい。
EXCEL VBAについての質問です。 初心者です。宜しくお願い致します。 使用環境はWindows 2000 service pack4 Excel 2000. =質問= セルA1~A10に数値を入力しセルB1はその合計だとします。 セルB1が0以下になったときに"メッセージ1"が表示するようにするには以下のプログラムで実行できます。 Private Sub Worksheet_Calculate() If Range("B1") < 0 Then メッセージ1 '起動するマクロ名 End If セルA1~A10に数値を入力した際、すでにA3の入力でセルB1が0以下で、そのA4~A10に数値を順に入力してもセルB1はマイナスのままだったとします。 上記、プログラムではA4~A10を入力する都度メッセージ1が表示されてしまいます。 メッセージ1はセルB1がはじめてマイナスになったときだけ表示させるようにするにはどのように変更すればいいでしょうか? ご教授の程宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
今回使用する myFlg は、モジュールレベルで宣言する必要があります。 宣言する場所はモジュールの最上部で、最初のプロシージャの上の部分です。(宣言セション) 変数については、こちらを参考に http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page4.htm
その他の回答 (2)
- watabe007
- ベストアンサー率62% (476/760)
フラグを付けるだけで良いでしょう Dim myFlg As Boolean Private Sub Worksheet_Calculate() If Range("B1").Value < 0 And myFlg = False Then MsgBox "マイナスになりました。", 48 myFlg = True End If End Sub Range("B1") ⇒ Range("B1").Value Valueプロパティは付けるようにしましょう
補足
早速の回答ありがとうございます。 アドバイスに従って、新規ファイルにVBAを組み込んだところ、正常に機能しました。(条件が1度発生した時のみメッセージが表示される。) しかし、実際に使用するファイルの中には他の条件やプログラムが記載されており、その中にアドバイス文を入れ込むと動作しません。(毎回、メッセージが表示される。) Dim myFlg As BooleanをPrivate Sub Worksheet_Calculate()より上の行に記載しなければうまく動かないようですが、その場合、さらに上に記載しているPrivate Sub Worksheet_SelectionChange(ByVal Target As Range) 文に対しコンパイルエラーが発生してしまいます。 以下に実際に使用するためのプログラムの抜粋を記しました。 以下に修正すべきかご教授いただけると助かります。 Private Sub CheckBox1_Click() If CheckBox1 = True Then Range("$CC$26") = "A" Else: Range("$CC$26") = "" End If End Sub Private Sub CommandButton5_Click() Sheets("F3").Select End Sub Private Sub CommandButton6_Click() Sheets("F1").Select End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Address = "$D$11:$E$11" Then With UserForm1 .ListBox1.List = Array("A", "B", "C") .Show (0) End With ElseIf .Address = "$D$13:$E$13" Then With UserForm2 Select Case Range("$D$11") Case "A" .ListBox1.List = Array("あ, "い"," う", "え", "お") Case "B" If Range("$CH$48").Value = "1A" Then .ListBox1.List = Array("か", "き") ElseIf Range("$CH$48").Value ="3A" Then .ListBox1.List = Array("く") ElseIf Range("$CH$48").Value ="2AN" Then .ListBox1.List = Array("け") ElseIf Range("$CH$48").Value ="3AN" Then .ListBox1.List = Array("こ") End If Case "C" .ListBox1.List = Array("さ", "し"," す", "せ") End Select .Show (0) End With End If End With End Sub (以下、アドバイスいただきた文) Dim myFlg As Boolean Private Sub Worksheet_Calculate() If Range("CC6") < And myFlg = False Then MsgBox "注意1のメッセージ", 48 myFlg = True End If If Range("CF33") >= 3 And myFlg = False Then MsgBox "注意2のメッセージ", 48(←48の意味を教えていただければ幸いです。) myFlg = True End If (以下はセルCF42が1になったときに4秒間だけ注意3のメッセージを表示するプログラムです。) If Range("CF42").Value >= 1 Then 注意3 End If End Sub Sub 注意3() Dim myShell As Object Set myShell = CreateObject("Wscript.Shell") myShell.PopUp "注意3のメッセージ" Set myShell = Nothing End Sub 以上、度重なる質問で恐縮ですが宜しくお願い致します。
- Azzz___
- ベストアンサー率40% (9/22)
こんにちは。 ご質問のような場合はセルの値をチェックするのとは別のアプローチで グローバル変数をフラグとして使えば対処できると思います。 モジュール先頭に Dim blnCheckData as Boolean などにして IF BlnCheckData = False Then 'マイナスチェック処理 BlnCheckData = True End IF 上記でできるかと推測します。 はずしてたらすみません。
お礼
アドバイスありがとうございます。 フラグを立てることを知り勉強になりました。 以上、お礼申し上げます。
お礼
わざわざ画像まで添付していただき、誠にありがとうございます。 先頭行にフラグを立てることで繰り返し注記が表示されることは無くなりました。 以上、お礼申し上げます。