アプリ版:「スタンプのみでお礼する」機能のリリースについて

マクロの不等号についての質問です。

マクロ初心者でネットで検索しながら自己流で勉強をしていますのでトンチンカンで初歩的な質問でしたら申し訳ありません。

現在不等号を使用して入力した値から外れていたらメッセージが出るようにはしているのですが、セル内で計算をしているせいか規定値内に入っていてもメッセージがでてきてしまいます。
現状行なっている仮定となりますが
(絶対値での計算ですので)

ABS(A1)+ ABS(A2)の結果をB1にセットし

範囲の設定は条件によって変わりますので
事前にマクロのフォームを使用して入力した値がD1に入力されるようにしいますのでその結果に応じて
最小値がE1に最大値がE2へと入力されるように計算式を入れました。
実際の計算式は

E1が=D1-6 E2が=D1

となっています。

以上の前提条件からB1で計算された値がE1E2の間にない場合はメッセージが出るようにしたく質問いたします。

今回行なったマクロは

If Range("B1").Value > Range("E1") And Range("B1").Value < Range("E2").Value Then

Else

MsgBox "値から外れています" & vbCrLf "確認を行ってください", vdExclamation

Cancel = True

End If

です。

申し訳ありませんがよろしくお願いいたします。

質問者からの補足コメント

  • 構文が汚いのは許してください泣

      補足日時:2018/03/19 11:17

A 回答 (2件)

今回のIFでうまくいかないのは、Range("E1") > Andって書いてある(Valueプロパティが抜けている)せいじゃないですか?CellsだったらValueを省略してもデフォルトプロパティがValueなので問題ないですが、RangeのデフォルトプロパティはValueじゃないんですよ。

なんじゃそりゃ?な_Defaultがデフォルトです。

ちなみに私だったら異常値を捕まえたい場合は、先に異常値かどうかを判定します。で、範囲のように異常になる条件が複数ある場合はすり抜けがあると嫌なので、AndではなくOrで「どれか一つでも異常だったらTrueになる」ようにIFを書きます。以下みたいな感じで。まあ「全部正常だったら処理する」ってのとどっちが良いかは、完全に好みやどちらのケースが多いかで変わる問題ですけどね。

If (Range("B1").Value < Range("E1").Value) Or (Range("B1").Value > Range("E2").Value) Then
MsgBox "値から外れています" & vbCrLf "確認を行ってください", vdExclamation
Cancel = True

Else
正常な場合の処理

End If

この場合はカッコは付けなくても動作するはずですが、自分で後で見て迷うくらいなら不要であってもカッコを省略しない方が身のためです。また正常な場合の処理が不要な場合は、Elseも不要です(当たり前)。
    • good
    • 0
この回答へのお礼

外部アクセスできないPCからスマホでの手入力でしたので構文にミスがあり申し訳ありませんでした。ご指摘の.Valueは入力されています。

ですがORでの括りを行い範囲外である場合を指定した方がわかりやすいですね!

まだ私にはElseを扱うには勉強が足りず時期尚早だったようです。

非常に勉強になりましたありがとうございます。

お礼日時:2018/03/19 12:04

単に書き方だけの話ですが、


変更前
If Range("B1").Value > Range("E1") And Range("B1").Value < Range("E2").Value Then

変更後
a=Range("E1").Value
b=Range("B1").Value
c=Range("E2").Value
if a<b and b<c then

こっちの方が見やすいですよ。何を言いたいのかというと、表記ミスではないですか?
コードにおいては可読性(読みやすさ)も重要です。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます

SymphonicMarchさんのおっしゃる通り読みやすさの点から
定義づけする方がわかりやすいのは重々承知でやった方がいいのは頭にはあったのですが

不等号対象のB1セルを次の処理でB2に移りB3,B4,G1,G2と対象が変わるので

一個々々構文を作成していたので何とも読みづらいものとなってしまいまい
わけがわからなくなってしまったのが実情かもしれません。
何とも初心者が陥りそうなことで申し訳なかったです。

何度も似たような処理をするならそれこそ定義づけしろよと言われると思います(泣

ご指摘の通り一度定義づけして構文の見直しを行ってみたいと思います。
定義づけの正しい方法もいまだ理解が曖昧な部分も多々あるので
いじりながら使い方を勉強していきたいと思います。

ご回答ありがとうございました。

お礼日時:2018/03/20 04:40

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