
マクロを独学で学び仕事に応用しているのですが、どうしても分からないことが発生してしまい、質問です。
内容は、今、エクセルシートの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
No.7ベストアンサー
- 回答日時:
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については、空欄に見えながらも実はスペースが入っている可能性があるならばつけておいた方がいいかもしれません。
No.11
- 回答日時:
こんばんは。
#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
No.10
- 回答日時:
no.1です
しばらくvb触っていないのでなんともいえませんが・・・
以下は複雑すぎるように思います。
単純に、serecut case(またはswich等で)
aの場合(yes)
bの場合(no)
それ以外(else)
の分岐で良いと思います。
.valueなどで得る値もnullや””とは限りません。
追加するときも、cを追加するだけです。
if文で多重分岐させるよりも、簡易でデバッグしやすいですし、if文で文字列との違いも追加しやすいです。
(個人的にはif文で1行に書きすぎるとわかりにくく、追加しずらいです)
また、答え書きすぎなように思われます。
これでは質問者の方が自得しにくいように思います。
できるだけヒントを与えて、プログラムはフリーにすべきです。
(これでなければいけない、といった決まりはないのですから・・)
基本的にifとfor文に頼りすぎると良くないように思います。
NO.9さんのゆうように、ローカルウィンドウで得る値を経験すべきと思います。
ありがとうございます!
serecut caseですね?
自分にとっては未知の数式でした。
とりあえず他の方の数式で問題は解決したのですが、自分の経験値アップのためにトライしてみます。
ありがとうございました。
No.9
- 回答日時:
こんばんは。
今回の場合、別にエラー値を比較するようなこともないし、どちらでもよいことですが、もし、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)で比較してみると、空白かどうかの違いが分かるはずです。
No.8
- 回答日時:
とりあえずForNextで繰り回すのが良いでしょうが、進歩が無い。
エクセルでは、特有の、条件付き書式というのはある(アクセスにもあるが)。この操作を下記に書いておきますので、マクロの記録をとってVBAコードを出して勉強してください。
ーー
A1:G5を範囲指定しておいて
書式ー条件つき書式ー式がー式に
=AND(A1<>"",$A1=$B1) A1、B1の両方に色をつける場合
=AND(A1<>"",A1=B1) A1だけに色をつける
を入れる。
ーーー
空白セルの捉え方は
IF Cells(X, "A").Value="" Then
処理スキップ
で良いのでは。Nullなど考えなくても。
No.6
- 回答日時:
こんばんは。
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 <> ""
だけでもまあよい。
No.5
- 回答日時:
こんばんは。
まあ、こんな風にすればよいのですが、
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では違ってくるわけです。
No.4
- 回答日時:
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
ありがとうございます!
Trimって、すごいんですね~!
他の方のやりかたでもできましたが、この数式でもできました。
ありがとうございました!
No.3
- 回答日時:
NO.1です
または多重分岐でも良いです。
以下のselect caseを参照してください。
参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) Sheet2からオートフィルターで売上日を抽出した件数をカウントし、その件数をSheet1のセルB1 2 2023/01/12 12:24
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
このQ&Aを見た人はこんなQ&Aも見ています
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。
-
ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
ゴリラ向け動画配信サイト「ウホウホ動画」にありがちなことを教えて下さい。
-
限定しりとり
文字数6文字以上の単語でしりとりしましょう
-
チョコミントアイス
得意ですか?不得意ですか?できれば理由も教えてください。
-
準・究極の選択
「年収1000万円で一生カレーライス」か「年収180万円で毎日何でも食べ放題」
-
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
空白セルをとばして転記
Visual Basic(VBA)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
未記入がある場合はマクロを実行させない方法
その他(Microsoft Office)
-
6
空白行を無視してコピーするマクロについて
Excel(エクセル)
-
7
excelのマクロで該当処理できなければ飛ばして進むにはどうすればよいのでしょうか
Visual Basic(VBA)
-
8
数式の結果が空白の時の空白扱い
Excel(エクセル)
-
9
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
10
VBA 列が空白なら別のマクロへ移動したい
Visual Basic(VBA)
-
11
Excel2003 マクロ 1ページのみ印刷する
Excel(エクセル)
-
12
数式による空白を無視して最終行までコピーするマクロ
Excel(エクセル)
-
13
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
14
VBA Cのセルが空白でなかったら、Aのセルに順番に数値を入力
Visual Basic(VBA)
-
15
VBA 空白行に転記する
Visual Basic(VBA)
-
16
【VBA】特定列に文字が入っていたらそのセル行をコピーしてマスターブックの同じ行に貼り付けたい
その他(Microsoft Office)
-
17
空白セルを空セルに置き換える方法(エクセル)
Excel(エクセル)
-
18
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
19
形式貼り付けの「空白を無視する」ができない
Excel(エクセル)
-
20
【excelVBA】Findメソッドで検索対象を複数列
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
2つの数値のうち、数値が小さい...
-
VLOOKUP関数を使用時、検索する...
-
彼女のことが好きすぎて彼女の...
-
ある範囲のセルから任意の値を...
-
小数点以下を繰り上げたものを...
-
Excel 数値の前の「 ' 」を一括...
-
エクセルで空白セルを含む列の...
-
値が入っているときだけ計算結...
-
精子に血が・・・
-
EXCELで条件付き書式で空白セル...
-
エクセルで数式の答えを数値と...
-
イタリアから帰国する際、肉製...
-
リンク先のファイルを開かなく...
-
エクセルのラベルの値(文字列...
-
ワードのページ番号をもっと下...
-
健否~書類の書き方~
-
MIN関数で空白セルを無視したい...
-
エクセルでエラーが出て困って...
-
検便についてです。 便は取れた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
爪が紫色?
-
EXCELで条件付き書式で空白セル...
-
2つの数値のうち、数値が小さい...
-
VLOOKUP関数を使用時、検索する...
-
リンク先のファイルを開かなく...
-
エクセルで数式の答えを数値と...
-
小数点以下を繰り上げたものを...
-
値が入っているときだけ計算結...
-
エクセル指定した範囲からラン...
-
健否~書類の書き方~
-
勃起する時って痛いんですか? ...
-
イタリアから帰国する際、肉製...
-
エクセルで空白セルを含む列の...
-
風俗店へ行く前のご飯
-
精子に血が・・・
-
MIN関数で空白セルを無視したい...
-
ワードのページ番号をもっと下...
-
ある範囲のセルから任意の値を...
おすすめ情報