令和6年能登半島地震 令和6(2024)年1月1日(月)午後4時10分

ユーザ定義のエクセル関数の作成

コンピュータ
この記事は約6分で読めます。

1980年代の年月日(曜日)の処理

2000年問題

 1980年代後半からメインフレームで主にCOBOLでシステム開発を行っていました。その当時のCOBOLは、年月日は99/99/99の表示形式が一般的でした。見てのとおり年が2桁なので、2000年に近づくにつれて「2000年問題」として、プログラムの変更を余儀なくされました。

曜日変換

 加えて曜日は「曜日変換(副プログラム)」を作成して、主プログラムで曜日が必要な場合は、CALL文で副プログラムを呼び出して使用しなければなりませんでした。当時はネット検索などなく、私は数学の先生から年月日を曜日に変換する手順を教わりプログラミングしました。

エクセルの標準関数利用

 さて、現在では日付から曜日は簡単に計算してくれます。エクセルを例にすると、A1のセルに変換したい年月日「yyyy/mm/dd」・「2023/3/16」のように入力します。mmとddは1桁でも構いません。B1セルに「=TEXT(A1,”aaa”)」と関数を書けば曜日を表示してくれます。

ABC
12023/3/16=TEXT(A1,”aaa”)
2
B1セルには「木」と表示されます。

 エクセルのセル内には「数値」「文字」「関数」などを入力することができ、それらを四則演算や関数などを利用して表やグラフなどの資料を作成していると思います。


 今回、曜日を計算してくれる標準関数としてTEXT(値,”表示形式”)がありますが、自分で一からユーザ関数を作成してみることにしました。

エクセルのユーザ関数作成

手順1 「Alt+F11」でVBAエディタが起動

 簡単なプログラムを実行するには、エクセル(VBA)を利用するのが簡単で便利です。

手順2 標準モジュールの作成

 とりあえず、標準モジュールを挿入してください。

手順3 モジュール内に記述

 次のプログラムをコピーしてペーストしてください。

 特に問題がなければ、エクセルにて、次のように自分で作った関数を入力してみてください。標準関数と同じような結果になればOKです。

ABC
12023/3/16=youbi(A1)
2
B1セルには「木」と表示されます。

Function youbi(c As String) As String

 Dim y As Integer, m As Integer, d As Integer
 Dim h As Integer, i As Integer

 y = Mid(c, 1, 4)
 m = Mid(c, 6, 2)
 d = Mid(c, 9, 2)

 If m = 1 Or m = 2 Then
  y = y – 1
  m = m + 12
 End If

 i = y + Int(y / 4) – Int(y / 100) + Int(y / 400) + Int((m * 13 + 8) / 5) + d
 h = i – Int(i / 7) * 7

 Select Case h
  Case 0
   youbi = “日”
  Case 1
   youbi = “月”
  Case 2
   youbi = “火”
  Case 3
   youbi = “水”
  Case 4
   youbi = “木”
  Case 5
   youbi = “金”
  Case 6
   youbi = “土”
  Case Else
   youbi = “休”
 End Select

End Function

プログラムの解説

 簡単にプログラムの解説をしておきます。表現等が適切でない場合はご指摘願います。

Function youbi(c As String) As String
関数(youbi)を作成します。
任意のセルから受け取った値(パラメータ)は、文字型変数(c)で処理されます。
また、結果(戻り値)を(youbi)に返します。

 Dim y As Integer, m As Integer, d As Integer
 Dim h As Integer, i As Integer
 数値型変数(y),(m),(d),(h),(i)を宣言します。
 yは年、mは月、dは日の計算に使用します。
 h,iは中間結果を保持するために使用します。

 y = Mid(c, 1, 4)
 m = Mid(c, 6, 2)
 d = Mid(c, 9, 2)
 例えば、セルA1に”2023/1/10”と入力されていた場合、セルA2に”=youbi(A1)”と記述すると、変数cには、”2023/01/10”の値が入っており、
 y = Mid(c, 1, 4)は、
 cの値を1カラムから4カラムまで取り出し、yに格納するというものです。よって、yには【2023】の値が代入されています。また数値型で【2023】として扱われます。
 m = Mid(c, 6, 2)は、
 cの値を6カラムから増分2カラムまで取り出し、mに格納するというものです。よって、mには【01】の値が代入されますが、数値型で【1】として扱われます。

 d = Mid(c, 9, 2)は、
 cの値を9カラムから増分2カラムまで取り出し、dに格納するというものです。よって、dには【10】の値が代入されます。数値型で【10】として扱われます。

 If m = 1 Or m = 2 Then
  y = y – 1
  m = m + 12
 End If
 If文、m=1 Or m=2は、月が1月または2月ならば、年数を1減じ、月数に12を加えます。月が3月~12月は、y,m,dはそのまま計算されます。
例えば、【2023/1/10】は、1月であることからyは、【2022】、mは【13】として計算されます。

 i = y + Int(y / 4) – Int(y / 100) + Int(y / 400) + Int((m * 13 + 8) / 5) + d
 h = i – Int(i / 7) * 7
 ここで、(ツェラーの公式への変形)をWikipediaで確認してください。
 h = (y + [y / 4] – [y / 100] + [y / 400] + [(13 * m + 8) / 5] + d) mod 7
 [y / 4]は、年数を4で割って小数点以下を切り捨てという意味で、VBAで記述するとInt(y / 4)となります。
 Mod 7は、計算結果を7で割った余りをhに代入するという意味で、hには0,1,2,3,4,5,6のいずれかの数値が求められます。

 Select Case h
  Case 0
   youbi = “日”
  Case 1
   youbi = “月”
  Case 2
   youbi = “火”
  Case 3
   youbi = “水”
  Case 4
   youbi = “木”
  Case 5
   youbi = “金”
  Case 6
   youbi = “土”
  Case Else
   youbi = “休”
 End Select
 hの値が0の場合は“日”、1の場合は“月”・・・という値をyoubiに代入します。なお、念のためhの値が0~6以外の場合を想定しCase Else を用意しておきます。

End Function

 いかがでしょうか。エクセルで自分で考えた関数を簡単に作成することができます。ただし、なるべく標準関数を使うのが原則だと思います。