hiroton
2023/11/15 (水) 17:06:40
e2c8b@f966d
最終的にすべてDateSerial(y, m, d)
の計算をしているので、DateSerial
を主に置くとすっきりすると思います
必要な要素をまとめて式にすると、次のように表現できそうです
DateSerial([年],[月]-[減算補正]+[月補正],[実日])
「減算補正」はマイナス計算しかないので式自体マイナスにしていますが、「月補正」はプラスマイナスあるのでプラスで作成しておきます
それぞれの補正の計算は
減算補正:IIf([選択1のID]=9,[減算値],0)
月補正:IIf([選択1のID]=9, Switch([A]=0 And [B]>0, 1, [A]>0 And [B]=0, -1, True, 0), IIf([X]>[Y] Or [選択2のID]=1 Or [選択2のID]=5, 1, 0))
のような形で作れます
これを上の式に当てはめてもいいですし、そのまま別フィールドにしてもいいでしょう
「減算補正」は簡単ですが、「月補正」は複雑ですね。求め方はこれに限りません
例えば、最終結果(1,-1,0)のグループを作る形で
//Switch([1になる条件], 1, [-1になる条件], -1, True, 0)の形にする
月補正:Switch([選択1のID]=9 And [A]=0 And [B]>0 Or [選択1のID]<>9 And ([X]>[Y] Or [選択2のID]=1 Or [選択2のID]=5), 1, [選択1のID]=9 And [A]>0 And [B]=0, -1, True, 0)
のようにしてもいいと思います
関数のネストが減るメリットはあるものの、やりたいことを直感的に表現できているか?とはちょっと離れているかな?という印象です
Switch関数は条件が真(True
)になったときの値を返す関数なので、条件にTrue
を指定すれば、そこで必ず値を返すことになります。「それ以前の条件で真が無ければこの値を返す」という、IIf関数における「偽のとき」の値を設定できます
条件式では様々な比較演算子を使うことができます
//↓の部分について
IIf([X]>[Y],DateSerial([年],[月]+1,[実日]),IIf([選択2のID]=1,DateSerial([年],[月]+1,[実日]),IIf([選択2のID]=5,DateSerial([年],[月]+1,[実日]),DateSerial([年],[月],[実日]))))
IIf(
[X]>[Y]
,DateSerial([年],[月]+1,[実日]) // ←同じ結果を求めている
,IIf(
[選択2のID]=1
,DateSerial([年],[月]+1,[実日]) // ←同じ結果を求めている
,IIf(
[選択2のID]=5
,DateSerial([年],[月]+1,[実日]) // ←同じ結果を求めている
,DateSerial([年],[月],[実日])
)
)
)
このようないずれかに当てはまれば真というのはOr
で表現できます
IIf([X]>[Y] Or [選択2のID]=1 Or [選択2のID]=5,DateSerial([年],[月]+1,[実日]),DateSerial([年],[月],[実日]))
Or
比較はAnd
比較と同じくらい使うので覚えましょう
蛇足
こう複雑な計算が必要になると、なんかこう、元のテーブル構造が怪しそうですね
通報 ...