dポイントプレゼントキャンペーン実施中!

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がはじめてマイナスになったときだけ表示させるようにするにはどのように変更すればいいでしょうか?

ご教授の程宜しくお願い致します。

A 回答 (3件)

今回使用する myFlg は、モジュールレベルで宣言する必要があります。


宣言する場所はモジュールの最上部で、最初のプロシージャの上の部分です。(宣言セション)
変数については、こちらを参考に

http://t_shun.at.infoseek.co.jp/My_Page/Excel-VB …
「メッセージを1度だけ表示したい。」の回答画像3
    • good
    • 0
この回答へのお礼

わざわざ画像まで添付していただき、誠にありがとうございます。
先頭行にフラグを立てることで繰り返し注記が表示されることは無くなりました。
以上、お礼申し上げます。

お礼日時:2009/09/19 18:59

フラグを付けるだけで良いでしょう


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

以上、度重なる質問で恐縮ですが宜しくお願い致します。

補足日時:2009/09/15 04:24
    • good
    • 0

こんにちは。



ご質問のような場合はセルの値をチェックするのとは別のアプローチで
グローバル変数をフラグとして使えば対処できると思います。

モジュール先頭に
Dim blnCheckData as Boolean
などにして

IF BlnCheckData = False Then
'マイナスチェック処理

BlnCheckData = True
End IF

上記でできるかと推測します。
はずしてたらすみません。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
フラグを立てることを知り勉強になりました。
以上、お礼申し上げます。

お礼日時:2009/09/19 19:01

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A