毎月20日や月末などの決まった日に行われる経理業務の一つに総合振込があると思います。
振込予定日が土曜日または日曜日などの平日ではない場合には実務上、前倒しで金曜日に振込処理が行われることが多いような気がします。
で、総合振込の一覧表などの経理資料をExcelを使って作成していると、振込予定日などを入力することがあるのですが、Excelでセルに土曜または日曜の日付データを入力された場合にその前日または前々日(ようは金曜日)を表示させる方法をいくつか考えてみたので整理してみることにします。
TEXT関数を使って何曜日か表示させてIF関数で加工する
Excelでは日付のデータが入力されているセルがある場合に、そのセルに入力されたデータが「何曜日」なのかを確認することができます。
その確認の時に使う関数がTEXT関数になります。
下記の画像のようにB2セルに日付のデータが入力されている場合でとなりのC2セルに画像のようにTEXT関数を入力します↓
関数を入力して確定するとC2セルに下記のように表示されます↓
この方法を使って、C2セルが「土」または「日」になったときにB2セルの日付を加工してあげればいいことになります。
2023年7月8日は土曜日ですのでB2セルに「2023/7/8」と入力して確定すると下記のようにC2セルに「土」表示されます↓
次に、D列にIF関数を入力してあげて、C2セルが「土」かどうかを判定させます。
判定の結果、「土」ならB2セルの値からマイナス1日します。「土」以外であればそのままB2セルの結果を表示させるようにします↓
確定すると下記のようになります↓
D2セルに変な数字が表示されています(シリアル値といわれるものらしいです)が、これに関してはD列の表示形式を変更してあげると日付の形式にすることができます。↓
表示形式を変更すると、土曜日の前日である金曜日の日付を取得できていることが確認できました。
試しに、セルの入力内容を別の日、2023年7月12日に打ち換えてみます。
するとその日は土曜日ではないのでD2セルの日付は加工されずそのまま表示されていることが確認できました。
ここまでで「土曜日」の場合には金曜日にすることができましたので、あとは「日曜日」の場合にも同じように加工すればOKということになります。
日曜日も判定させるためにはさきほど入力したIF関数を少し手直しします。
具体的には下記の画像を参考にしてもらえればと思います↓
これでB2セルに入力された日付けが日曜日の場合にも前々日である金曜日を表示させることができるようになります。
試しに2023年7月23日(日曜日)の日付をB2セルに入力してみます。
D2セルにきちんと前々日の金曜日の日付データに加工されています。
なお、C列に記載したデータを見せたくない・見た目が不細工と思うのであればExcelの「グループ化」機能を利用して見えないようにしておくと良いかもしれません。
グループ化のあとに表示される「+」ボタンをクリックするとC列が隠れます↓
WEEKDAY関数を使って何曜日か表示させてIF関数で加工する
もう一つのやり方としてWEEKDAY関数を使う方法があると思います。
WEEKDAY関数を使うと日付のデータが入力されているセルがある場合に、そのセルに入力された日付データが「何曜日」なのかを1~7までの数字で表示してくれます。
TEXT関数とやってることは変わらないのですが、こんな感じで使います↓
入力を確定すると下記のように表示されます。日曜日を「1」として月曜日は「2」、火曜日なら「3」といった感じで表示してくれます。
=WEEKDAY(セル)とすることで曜日に応じて1~7の数字が表示される。
ためしに1週間分のデータを入力してみて、WEEKDAY関数を使うとこうなります↓
これを利用してIF関数で日付を加工します。
具体的には土曜日の「7」または日曜日の「1」と表示されているのであれば日付をマイナス1したり、マイナス2すればよいことになります。
なのでこんな感じで数式をD2セルに入力してあげるといいかと思います↓
上記の数式を他のセルにも適用してみると下記のようになります↓
土曜日と日曜日の場合には前日または前々日の日付に加工できています。
番外編:Excelマクロを使って判定させる
Excelの関数でできることをわざわざマクロを使って処理する必要はない。と個人的には考えているので必要性を感じないのですが、仮にマクロを使ってやるとしたらどうなるかを考えてみようと思います。
0から考えるのは時間がかかりそうなのでChatGPTを使ってベースとなるマクロを作ってみることにします
ということで、ChatGPTに
ExcelのA1セルに入力された日付データが土曜日の場合にはB1セルに金曜日の日付データを入力するマクロを教えて
と、お願いしてみたところ、下記の回答が5秒で作成されました↓
Sub CheckSaturday()
Dim inputDate As Date
Dim outputDate As Date
' A1セルの日付データを取得
inputDate = Range("A1").Value
' A1セルの日付が土曜日かチェック
If Weekday(inputDate) = vbSaturday Then
' 金曜日の日付を計算
outputDate = inputDate - 1
Else
' A1セルの日付が土曜日でない場合は何もしない
Exit Sub
End If
' B1セルに金曜日の日付を入力
Range("B1").Value = outputDate
End Sub
このマクロをベースにして、少し内容を追加すると今回やりたいことが実現できるような気がします。
ということで少し加工してみたのが下のマクロになります↓
Sub CheckSaturday()
Dim inputDate As Date
Dim outputDate As Date
' A1セルの日付データを取得
inputDate = Range("A1").Value
' A1セルの日付が土曜日かチェック
If Weekday(inputDate) = vbSaturday Then
' 金曜日の日付を計算
outputDate = inputDate - 1
' A1セルの日付が日曜日かチェック
ElseIf Weekday(inputDate) = vbSunday Then
' 金曜日の日付を計算
outputDate = inputDate - 2
' A1セルの日付が土曜日または日曜日でない場合は何もしない
Else
Range("b1").Value = inputDate
Exit Sub
End If
' B1セルに金曜日の日付を入力
Range("B1").Value = outputDate
MsgBox "その日は土・日なので金曜日の日付に変更しました"
End Sub
上のマクロのざっくりした内容ですが、A1セルに日付を入力した後にマクロを実行するとB1セルにA1セルに表示された曜日に応じて加工された日付が入力されるようになっています。
A1セルが空欄など、日付のデータが入っていない状態でマクロを実行するとエラーになります。
このマクロを「ボタン」に登録しておいて、
実行すると↓
B1セルに日付が入力されます。
A1セルに入力された日付が「土」・「日」の曜日の場合には加工後の日付が表示されます↓
マクロを使ってやるならこんな感じでしょうか。紹介した以外にも色々なやりかたがあると思います。
最後に、「シート1」などの特定のシートでのみマクロを発動させたい(イベントプロシージャっていうんですかね?)のであれば下記のようなマクロで実現できるかと思います。
マクロの細かな内容については割愛させていただきます。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row > 1 Then Exit Sub '変更されたセルが1行目より下ならプログラム終了
If Target.Column > 1 Then Exit Sub '変更されたセルが1列目でなかったならプログラム終了
Dim inputDate As Date
Dim outputDate As Date
' A1セルの日付データを取得
inputDate = Range("A1").Value
' A1セルの日付が土曜日かチェック
If Weekday(inputDate) = vbSaturday Then
' 金曜日の日付を計算
outputDate = inputDate - 1
' A1セルの日付が日曜日かチェック
ElseIf Weekday(inputDate) = vbSunday Then
' 金曜日の日付を計算
outputDate = inputDate - 2
' A1セルの日付が土曜日または日曜日でない場合は何もしない
Else
Range("b1").Value = inputDate
Exit Sub
End If
' B1セルに金曜日の日付を入力
On Error GoTo myerror
Range("B1").Value = outputDate
MsgBox "その日は土・日なので金曜日の日付に変更しました"
Exit Sub
myerror:
MsgBox "A1セルに日付を入力してください", vbExclamation
End Sub
ちなみにイベントプロシージャに関してはこちらの過去記事で紹介しています↓
エラー処理に関する過去記事はこちら↓
まとめ
Excelでセルに入力された日付データが土曜または日曜である場合にその前日や前々日である金曜日の日付を表示させるための方法を整理してみました。
いろんなやり方で今回やりたいことが実現できると思うので自分がやりやすい方法でやってもらったらいいのではないかと思います。
少し話がそれますがChatGPTは今回のようにプログラムのコードを「サッ」と確認するときには抜群に威力を発揮するなと感じます。
巷ではChatGPTに旅行先での美味しい食べ物屋さんなどを聞いてみると、その回答が実在しないお店の名前であったり、既に閉店してしまっているお店の情報などが提示されてしまうことがあるらしく、それが面白おかしくネタのように扱われていることもあるようです。
こういった使い方は別に「ダメ」とか「間違い」ではないと思うのですが、「適切」ではない気がしています。
【本日の近況報告】
久しぶりに紀伊国屋書店に行く機会があったので書籍をいくつか購入しました。話題のビジネス書やら、最近改正が発表されたNISAやIDECOなどの書籍やらをゲット。
最近は電子書籍でサクッとダウンロードして読むことが増えてきているとはいえ、紙媒体の書籍をパラパラめくるのが好きだったりします。
【本日の1曲】
Sublime/Santeria
すでに紹介していると思って過去記事検索してみたものの、ヒットしなかったので多分紹介してなかったんだろうと思います。
最初に聴いたのは多分18、19歳の頃。当時は早いテンポのパンク(ランシドとかバッドレリジョンとかオフスプリングとかあの辺)ばっかり聴いていたのでこの曲の良さがまったくわかりませんでした。
曲が遅せぇ!くらいにしか思っていませんでした。が今では夏になると必ず1回は聴く定番曲になっています。
=TEXT(セル,”aaa”)とすることでセルに入力されたデータが何曜日なのか取得することができる