データの分析、グラフ作成、および通信のためのツールを備えた Microsoft 表計算ソフトウェアのファミリ。
こんにちは。
カードの種類が提示されている 2種類に限っていて、それ以上増えることはなく、また「引落日」は曜日に左右されることがないということでしたら、それほど難しい数式を組まなくても可能かと思います。
ただし、その場合も、銀行やカード会社の都合で本来の期日から一時的に変更になる場合があったり、カード会社へカードの使用が通知される日が店側の事務処理の都合で後日になることもあるかもしれず(推測ですが)、そうなると、数式で正確な「引き落とし日」を算出することは困難で、算出が出来るのはあくまで目安の日付になろうかと思います。
なので、本来は、カード会社から通知される「引き落とし日」を数式を使わずに手入力するのが一番確実でしょう。
ですが、目安の日付でも良いということでしたら、せっかくなのでカードの種類も増やしていくことが出来るように、様々な算出条件を想定した場合の数式を組んでみました。
※カードごとの「利用日」・「締め日」・「引落日」の関係と、「引き落とし日」の算出条件
ただし、「引き落とし日」の曜日は考慮していません。
(説明の都合で、提示されておられる表の「月日」となっている見出しを「利用日」に変更させていただきました。)
【「利用日」が「締め日」と同一もしくはそれより前の日付の場合(「利用日」<=「締め日」)】
- 「引落日」に『翌月』の指定がない場合(=『当月』指定の場合)
「引き落とし日」は、「利用日」の『当月』の指定された日付。(「末日」指定の場合は『当月』の末日)
- 「引落日」に『翌月』の指定がある場合
「引き落とし日」は、「利用日」の『翌月』の指定された日付。(「末日」指定の場合は『翌月』の末日)
【「利用日」が「締め日」より後の日付の場合(「利用日」>「締め日」)】
- 「引落日」に『翌月』の指定がない場合(=『当月』指定の場合)
「引き落とし日」は、「利用日」の『翌月』の指定された日付。(「末日」指定の場合は『翌月』の末日)
- 「引落日」に『翌月』の指定がある場合
「引き落とし日」は、「利用日」の『翌々月』の指定された日付。(「末日」指定の場合は『翌々月』の末日)
この条件で良い場合の「引き落とし日」を求めるための数式( I8 セルに入れる数式)は以下のようになります。あくまで一例です。
=IF(ISNUMBER(A8),IFERROR(EOMONTH(A8,IFERROR(SUBSTITUTE(HLOOKUP(H8,$1:$3,2,0),"日","")*1<DAY(A8),0)+(LEFT(HLOOKUP(H8,$1:$3,3,0),2)="翌月")-1)+SUBSTITUTE(SUBSTITUTE(HLOOKUP(H8,$1:$3,3,0),"日",""),"翌月","")*1,EOMONTH(A8,IFERROR(SUBSTITUTE(HLOOKUP(H8,$1:$3,2,0),"日","")*1<DAY(A8),0)+(LEFT(HLOOKUP(H8,$1:$3,3,0),2)="翌月"))),"")
途中で自動的に折り返されているかと思いますが、全部で 1行の数式になります。
※数式を組み立てた際の前提条件
- 「締め日」や「引落日」は、共に全て『文字列』として入力されているものとします。
例えば、セルの書式設定などで『数値』の見た目を加工して表示させたりはしていない、と推測しています。
- 「利用日」は日付のシリアル値として入力されているものとします。
例えば、「 1/3 」 と入力すると、自動的に日付が入力されたものと解釈して「1月3日」というように表示されるかと思いますが、この値は Excel 内部では日付のシリアル値(『数値』)として扱われます。
- 「引落日」に『翌月』の指定が無い場合や他の文字列が指定されていた場合は、全て『当月』指定と見なします。(「締め日」は全て『当月』指定と見なします。)
この数式を、提示されておられる表の I8 セルに入力(またはコピー・貼り付け)し、必要なだけ下方向にコピーしておきます。
コピーする行数は、将来的にどのくらいの数の「利用日」を入力するかによりますが、多めに見積もって 100行分とか 200行分コピーしておけば良いかと。
尚、コピー方法はオートフィルコピーがお勧めです。
・https://dekiru.net/article/12457/
図1は、「締め日」と「引落日」の様々な組み合わせを試すため、カードの種類を増やした上で「利用日」に「締め日」前後の日付を入れ、「引き落とし日」を上記の数式で算出してみた結果です。
尚、増やしたカード名は適当に考えた架空のものです。図1のように右方向にいくらでも増やしていくことが出来ます。
・図1
「引き落とし日」がお考えの日付になっているかどうか確認の上、よろしければお使いになってみてください。
<数式の動作概要>
EOMONTH(A8,IFERROR(SUBSTITUTE(HLOOKUP(H8,$1:$3,2,0),"日","")*1<DAY(A8),0)+(LEFT(HLOOKUP(H8,$1:$3,3,0),2)="翌月")-1)
の部分で、「利用日」に対してのカード別の「前月」の末日、あるいは「当月」の末日、あるいは「翌月」の末日を求め、
SUBSTITUTE(SUBSTITUTE(HLOOKUP(H8,$1:$3,3,0),"日",""),"翌月","")*1
の部分で、カード別の「引落日」に指定された日にちを求め、求めておいた末日の日付にプラスすることで実際の「引き落とし日」を求めています。
尚、「引き落とし日」を求める計算がエラーになった場合(日にちを指定する数字が無い=「末日」が指定されていると見なす場合)、
IFERROR(・・・,EOMONTH(A8,IFERROR(SUBSTITUTE(HLOOKUP(H8,$1:$3,2,0),"日","")*1<DAY(A8),0)+(LEFT(HLOOKUP(H8,$1:$3,3,0),2)="翌月")))
の部分で、「当月」の末日、あるいは「翌月」の末日、あるいは「翌々月」の末日の「引き落とし日」を求めています。
また、
=IF(ISNUMBER(A8),・・・,"")
の部分で、「利用日」が空白だったり文字列だったりした場合に、エラー表示ではなく空白を表示するようにしています。
これにより、多めに数式をコピーしておいても良いようにもなっています。
以上です。これより細かく書くと長くなりすぎるので省略します。
数式の不明点については、出来るだけお答えしたいとは思いますが・・・。
Windows10 と Excel2016 の組み合わせで動作確認しています。
ご参考になれば幸いです。