- 締切済み
再質問 長いIF文を短くしたい
お世話になっております 先日1/24に、条件を示さずに「長いIF文を短くしたい」という質問をしてしまいました こちらの手抜きをお詫びします 前回keithinさんにアドバイスいただいた方法で書き直しましたので これをさらに簡単に書く方法があれば教えてください 以下は、Private Sub Worksheet_Change(ByVal Target As Range)内のマクロです If Target.Row >= 15 And Target.Row <= 100 And Target.Column = 9 Then If Range("I" & Target.Row).Value < Range("J" & Target.Row).Value Then If Range("G" & Target.Row).Value >= 1 Then If Range("I" & Target.Row).Value >= Range("G" & Target.Row).Value Then If Range("I" & Target.Row).Value Mod Range("G" & Target.Row).Value = 0 Then 処理 End If End If End If End If End If
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 前回の質問内容「長いIF文を短くしたい」を、改めてよみました。 この場合は、回答者への気遣いはそれほどないようですね。ご質問に出ているコードですと、ご質問者さん以外のコードでは、ちょっと手控えたくはなりますが。 これ自体は、コーディング・スタイルの問題だと思いますが、正解があるわけではなく、エラーがでなければ、それで良いとするしかありません。あまりスタイルにこだわると、本末転倒になりかねません。むろん、私の以下のコードは、スタイルにこだわったものであり、書き換えの際にミスをしやすいのはやむを得ません。 >IF 条件1 and 条件2 and 条件3 and 条件4 and 条件5 Then 実際、このような時、and をつないでいくことは多くありませんが、かと言って、If構文で、あまり深いネストにしないのが慣例です。ただ、まとめられる条件は、まとめるほうがよいと思います。 イベント・ドリブン型マクロは、少し特殊で、除外するものを先にし、マクロのコードを中まで、くぐらせないようにします。コードを良く読むと、If構文すべては、除外項目が並んでいるだけのようですから、If構文のネストは必要はありません。 変数でまとめるというのも一案ですが、以下のような方法もあります。 '// Private Sub Worksheet_Change(ByVal Target As Range) Dim n Dim i As Long n = Target.Value i = Target.Row If Intersect(Target, Range("I15:I100")) Is Nothing Then Exit Sub '入力セルが、範囲にない場合 If Range("G" & i).Value <= 1 Then Exit Sub If n >= Range("J" & i).Value Or n < Range("G" & i).Value Then Exit Sub If n Mod Range("G" & i).Value <> 0 Then Exit Sub '処理 Stop '←End If は要らない。 End Sub '//
- mshr1962
- ベストアンサー率39% (7417/18945)
何度も出てくるRangeの列がI,J,Gのみなのだから変数を使えばいいのでは? Private Sub Worksheet_Change(ByVal Target As Range) TR = Target.Row TC = Target.Column IR = Range("I" & TR).Value JR = Range("J" & TR).Value GR = Range("G" & TR).Value If TR>= 15 And TR <= 100 And TC = 9 Then If IR < JR Then If GR >= 1 Then If IR >= GR Then If IR Mod GR = 0 Then 処理 End If End If End If End If End If
お礼
ありがとうございます まさか、こんな変数の使い方があったとは・・・ 勉強になりました