プロが教える店舗&オフィスのセキュリティ対策術

マクロを独学で学び仕事に応用しているのですが、どうしても分からないことが発生してしまい、質問です。

内容は、今、エクセルシートのA1~B5の範囲で

A B
1 1 1
2 1 2
3
4 1
5 1

という形で入力されています(見難くてスミマセン)。
この状態から「A列とB列に同じ数字が入力されてれば、メッセージBOXを表示して、なおかつOKボタンを押したら該当セルを赤くする」というマクロを作りたいのですが、本来であれば1行目のみ赤くなるはずなのですが、空白セルが含まれている3行目も赤くなってしまうんです。つまり、空白セルも「同じ値」と認識されているみたいなのですが...。
この場合、空白セルを無視するにはどうしたらよいのですか?教えてください。なお、マクロは以下のように作っています。

Sub ナンバーチェック()
Dim Btn As Integer
For X = 5 To 10
If Cells(X, "A").Value = Cells(X, "B").Value Then
 Btn = MsgBox("同じ数値です", vbOK, "警告")
 If Btn = vbOK Then
  Cells(X, "A").Interior.ColorIndex = 3
Cells(X, "B").Interior.ColorIndex = 3
End If
End If
Next
End Sub

A 回答 (11件中1~10件)

Sub ナンバーチェック()


Dim Btn As Integer
For X = 5 To 10
If Cells(X, "A").Value = Cells(X, "B").Value And Cells(X, "A") <> "" And Cells(X, "B")<>"" Then
Btn = MsgBox("同じ数値です", vbOK, "警告")
If Btn = vbOK Then
Cells(X, "A").Interior.ColorIndex = 3
Cells(X, "B").Interior.ColorIndex = 3
End If
End If
Next
End Sub

ではいかがでしょう?
paopao01さんのアイディアでほぼOKなのですが、Cell(X,"A").Value<>""の判断で".Value"をつけているために空欄は数値で0と判断されるため常に真となります。
.Valueを外せばOKです。
また、A列の値が0でB列が空欄という場合を排除するため、B列についても空欄かどうかの判断も付け加えてみました。
paopao01さんのNo.4にあるTrimについては、空欄に見えながらも実はスペースが入っている可能性があるならばつけておいた方がいいかもしれません。
    • good
    • 2
この回答へのお礼

おぉ!
ホントに.Valueをはずしただけで、空白セルがスキップされました!
ホントにありがとうございました~♪

お礼日時:2007/07/08 13:03

こんばんは。



#10さんの
>また、答え書きすぎなように思われます。

そうですね。ただ、私は、回答者さんたちのためにも書いたつもりだったのですが。

そして、#8のimogasiさんのようなワークシートによる記録マクロの方法もアリですね。

細かいことを言えばきりがないですが、私としては、こういう問題(空白とEmpty)は、昔、やはり人から教わったことです。そういう受け入れ態勢が出来て初めて分かることかもしれませんが、ちょっと気になって書いてしまいました。半分ぐらいの人は理解していないような気がします。

それと、
>(個人的にはif文で1行に書きすぎるとわかりにくく、追加しずらいです)

私もそう思います。IF文1行の条件文はしないほうがよいです。
本来、他の言語ですと、条件ごとに括弧( )で括るような書き方をします。

質問者さんは、#6さんの回答には、目をくれていませんが、本来は、それでよかったのですが……。ただし、私は、そういうようには書きません。それは、それぞれのレベルがあるからです。また、長さ0の文字列の意味が分からなければ、何もなりません。


Sub ナンバーチェックR()
  Dim x As Integer
  Dim btn As Integer
  
  For x = 5 To 10
    '以下の一行の条件文を入れる
    If Cells(x, "A").Value <> "" And Cells(x, "B").Value <> "" Then
    
      If Cells(x, "A").Value = Cells(x, "B").Value Then
        btn = MsgBox("同じ数値です", vbOK, "警告")
        If btn = vbOK Then
          Cells(x, "A").Interior.ColorIndex = 3
          Cells(x, "B").Interior.ColorIndex = 3
        End If
      End If
    '以下の一行でEnd Ifと括る
    End If
  Next x
End Sub


また、ちょっと記録マクロを使った使い方なら、こんな風にも出来ますね。これは、スピードが速いです。ただし、条件付書式です。

Sub FormatConditionUsed()
With Range("A5:B10")
   .FormatConditions.Delete '条件付書式の削除
   '条件付書式にて
   .FormatConditions.Add _
    Type:=xlExpression, _
    Formula1:="=AND(RC1=RC2,RC1<>"""",RC2<>"""")"
   .FormatConditions(1).Interior.ColorIndex = 3
  End With
End Sub
    • good
    • 0

no.1です


しばらくvb触っていないのでなんともいえませんが・・・
以下は複雑すぎるように思います。
単純に、serecut case(またはswich等で)
aの場合(yes)
bの場合(no)
それ以外(else)
の分岐で良いと思います。
.valueなどで得る値もnullや””とは限りません。
追加するときも、cを追加するだけです。
if文で多重分岐させるよりも、簡易でデバッグしやすいですし、if文で文字列との違いも追加しやすいです。
(個人的にはif文で1行に書きすぎるとわかりにくく、追加しずらいです)

また、答え書きすぎなように思われます。
これでは質問者の方が自得しにくいように思います。
できるだけヒントを与えて、プログラムはフリーにすべきです。
(これでなければいけない、といった決まりはないのですから・・)
基本的にifとfor文に頼りすぎると良くないように思います。

NO.9さんのゆうように、ローカルウィンドウで得る値を経験すべきと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!
serecut caseですね?
自分にとっては未知の数式でした。
とりあえず他の方の数式で問題は解決したのですが、自分の経験値アップのためにトライしてみます。
ありがとうございました。

お礼日時:2007/07/08 13:01

こんばんは。



今回の場合、別にエラー値を比較するようなこともないし、どちらでもよいことですが、もし、VBAの問題として、厳密なの空白セルの判定ということでしたら、ちょっと話が違ってきます。

まず、Cells(x,"A").Value も Cells(x,"A") も、Excel Application 内では、自動的にプロパティが決定しますから、Value 値になります。しかし、環境によっては(オートメーションオブジェクト内)、セルにプロパティがないと、エラーが発生することがあります。出来る限り、明示的にプロパティは必要です。

また、 If Cells(x,"A").Value = Empty も If Cells(x,"A").Value = "" も、If Cells(x,"A") = 0 も、数値比較なのか、文字比較なのかによって、True/Falseが決まるのであって、それが、厳密に空である判定にはなりません。

Empty 値は、0 と同義ですし、="" は、長さ0の文字列「""」と同義です。長さ0の文字列は、値として存在しています。

あえて、文字列比較で空を判定しようとするなら、
 If Cells(i, 1).Formula = ""
ということになりそうです。

通常は、空のセルは、IsEmpty() で判定します。ワークシート関数で、ISBLANK(セル) の判定と同じです。

セル =Empty とすると、0 でも、空と判定してしまいます。

なお、余談ですが、「長さ0の文字列」と「値0の文字列」の二種類の空文字とがあります。
値0の文字列 は、StrPtr関数で判定します。

VBA では、Null 値は、Variant 型に明示的に代入する値です。その判定は、IsNull を使用します。それによって、Empty値とNull値の違いの判定が可能になります。Empty 値は、上記の説明のように、0 と同義になってしまうので、コードによって判定をも違うことがありますが、Null 値は明確に判定できます。ワークシートのNull値は、また別のエラー値ですから、これらとは別の値です。VBAをお使いになるなら、こういう点の違いは、押さえておいたほうがよいかとは思います。

セル に、="" や0 を入れて判定してみればよいです。

今回の空白セルかどうかの判定は、「'」プレフィックス文字(PrefixChar)で比較してみると、空白かどうかの違いが分かるはずです。
    • good
    • 1

とりあえずForNextで繰り回すのが良いでしょうが、進歩が無い。


エクセルでは、特有の、条件付き書式というのはある(アクセスにもあるが)。この操作を下記に書いておきますので、マクロの記録をとってVBAコードを出して勉強してください。
ーー
A1:G5を範囲指定しておいて
書式ー条件つき書式ー式がー式に
=AND(A1<>"",$A1=$B1)  A1、B1の両方に色をつける場合
=AND(A1<>"",A1=B1)   A1だけに色をつける
を入れる。
ーーー
空白セルの捉え方は
IF Cells(X, "A").Value="" Then
処理スキップ
で良いのでは。Nullなど考えなくても。
    • good
    • 0

こんばんは。


Ano.2の方と同じ考えなのですが…

If Cells(X, "A").Value <> "" And _
  Cells(X, "B").Value <> "" And _
  Cells(X, "A").Value = Cells(X, "B").Value Then

※質問文の例題だと必要な条件式は Cells(X, "B").Value <> ""
 だけでもまあよい。
    • good
    • 0

こんばんは。



まあ、こんな風にすればよいのですが、

If Not IsEmpty(Cells(x, "A").Value) _
  And Not IsEmpty(Cells(x, "B").Value) Then
If Cells(x, "A").Value = Cells(x, "B").Value Then
 Btn = MsgBox("同じ数値です", vbOK, "警告")
 If Btn = vbOK Then
  Cells(x, "A").Interior.ColorIndex = 3
  Cells(x, "B").Interior.ColorIndex = 3
 End If
 End If
End If
Next

ところで、Null 値というのは、ちょっと難しい値で、Variant 型にある、有効でない値の値っていう複雑な意味ですね。では、Empty 値といいたいのですが、そのEmpty 値というのは、ちょっとややこしいので、IsEmpty で取るのが楽だと思うのです。もちろん、ワークシートのセル上に、実質的に、Empty の種類があったとしても、比較する分には問題はないのですが、厳密にいうと、VBAでは違ってくるわけです。
    • good
    • 0

trimを入れて見ました、



Sub ナンバーチェック()
Dim Btn As Integer
For X = 1 To 20
If Cells(X, "A").Value = Cells(X, "B").Value And Trim(Cells(X, "A").Value) <> "" Then

Btn = MsgBox("同じ数値です", vbOK, "警告")
If Btn = vbOK Then
Cells(X, "A").Interior.ColorIndex = 3
Cells(X, "B").Interior.ColorIndex = 3
End If
End If
Next
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます!
Trimって、すごいんですね~!
他の方のやりかたでもできましたが、この数式でもできました。
ありがとうございました!

お礼日時:2007/07/08 13:05

NO.1です


または多重分岐でも良いです。
以下のselect caseを参照してください。

参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
    • good
    • 0

If Cells(X, "A").Value = Cells(X, "B").Value And Cells(X, "A").Value <> "" Then



ではどうですか
    • good
    • 0
この回答へのお礼

すみません、頑張ってみたけどダメでした~★

お礼日時:2007/07/06 21:09

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

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


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