VB6、およびOffice VBAの元号対応の状況について


概要

VB6、およびOffice VBAの元号対応の状況についてまとめました。

パッチによっては、CDate、DateValueは強制終了する、という状況となる。CDate, DateValueで和暦日付文字列変換を行う、という実装はあまりないと思うが。

また、元年表記についてもレジストリを参照して動作しない不具合があった。

ただし、Windows 10 1809以外は、2019年3月20日に対応パッチがリリースされている。
https://forest.watch.impress.co.jp/docs/news/1175704.html

元年表記

VBA.Formatの(Win32等もだが)元年表記は、以下のレジストリに左右される。

また、2019/3/20の更新を適用しないと、正しくレジストリを参照して動作しないようだ。((4/14修正)Windows 10 1809用の更新は3/20のタイミングではリリースされていないリリースされた)
https://forest.watch.impress.co.jp/docs/news/1175704.html

Gannen vs Ichinen
https://blogs.msdn.microsoft.com/shawnste/2018/11/12/gannen-vs-ichinen/

コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese
"InitialEraYear"="1年" or "元年"

既定値は、Microsoftの情報によれば、
https://support.microsoft.com/ja-jp/help/4469068/summary-of-new-japanese-era-updates-kb4469068

バージョン
2019/5にリリース予定のWindows 19H1 "元年"
Windows 10 1809以前、7等 "1年"

各関数が対応される更新

VBA, VB6

OSを更新することで元号対応(本記事の内容)

  • Format、CDate、DateValue、DateDiff、DateAdd、DatePart、IsDate

.NET 3.5

OSを更新することで元号対応(本記事の内容)

  • Microsoft.VisualBasic.Compatibility.VB6.Format

.NET 3.5を更新することで元号対応(補足情報)

  • System.DateTime.ToString(format As String, provider As IFormatProvider)
  • Microsoft.VisualBasic.DateAndTime.DateValue
  • Microsoft.VisualBasic.DateAndTime.DateDiff
  • Microsoft.VisualBasic.DateAndTime.DateAdd
  • Microsoft.VisualBasic.DateAndTime.DatePart
  • CDate
  • Microsoft.VisualBasic.Information.IsDate

履歴

2019年3月19日

Windows 7と特定のOfficeでは対応している、という話もあるので確認予定。
Windows 7では、Windows Updateで最新のパッチまで適用することで、CDate、DateValueについても改善しました。が、元年表記ではなくなった。

2019年3月21日

以下の2019年3月19日発表のパッチでもろもろ改善している可能性もあるので、確認予定
https://forest.watch.impress.co.jp/docs/news/1175704.html

2019年4月2日

元年表記に関する記載を追加。また、2019年3月19日発表のパッチで改善していることを確認。

2019年4月4日

各関数が対応される更新について追記

2019年4月14日

元年表記に関わる修正を追記。
Windows 10 1809の最新バージョンに関する検証を追加。

環境

環境1

  • Windows 10 1803 (OS ビルド 17134.590), 2019 年 2 月 13 日 — KB4487017
  • Visual Basic 6 ランタイム
  • Microsoft Excel for Office 365 MSO (16.0.11231.20164) 32ビット

環境1-1

  • Windows 10 1803 (OS ビルド 17134.677), 2019 年 3 月 20 日 — KB4489894
  • Visual Basic 6 ランタイム
  • Microsoft Excel for Office 365 MSO (16.0.11231.20164) 32ビット

環境2

  • Windows 10 1809 (OS ビルド 17763.379), 2019 年 3 月 13 日 — KB4489899
  • Visual Basic 6 ランタイム
  • Microsoft Excel for Office 365 MSO (16.0.11231.20164) 32ビット

環境2-1

環境3

結果

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Erasに追加
2019 05 01 新規_新_New_N

(4/14追記)更新適用直後の次のレジストリについて未確認。
ただし、Microsoftの情報によれば、2019/5にリリース予定のWindows 19H1以外、"1年"。
https://support.microsoft.com/ja-jp/help/4469068/summary-of-new-japanese-era-updates-kb4469068

Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese
Name: InitialEraYear

Format

Format(Date, "gggee年mm月dd日")
環境 Date型 結果 備考
環境1 Windows 10 1803 (OS ビルド 17134.590) 2019/04/30 平成31年04月30日
2019/05/01 新規元年05月01日 元年表記
2020/05/01 新規02年05月01日
環境1-1 Windows 10 1803 (OS ビルド 17134.677) 2019/04/30 平成31年04月30日
2019/05/01 新規01年05月01日 1年表記
2020/05/01 新規02年05月01日
環境2 Windows 10 1809 (OS ビルド 17763.379) 2019/04/30 平成31年04月30日
2019/05/01 新規元年05月01日 元年表記
2020/05/01 新規02年05月01日
環境2-1 Windows 10 1809 (OS ビルド 17763.437) 2019/04/30 平成31年04月30日
2019/05/01 新規01年05月01日 1年表記
2020/05/01 新規02年05月01日
環境3 Windows 7 SP1 KB4489878 2019/04/30 平成31年04月30日
2019/05/01 新規01年05月01日 1年表記
2020/05/01 新規02年05月01日

CDate

CDate(日付文字列)
環境 日付文字列 結果 備考
環境1 Windows 10 1803 (OS ビルド 17134.590) 平成31年04月30日 2019/04/30
新規元年05月01日 実行時エラー '13' 型が一致しません。 パースで新元号が認識されない
新規02年05月01日 実行時エラー '13' 型が一致しません。 パースで新元号が認識されない
平成31年05月01日 2019/05/01
環境1-1 Windows 10 1803 (OS ビルド 17134.677) 平成31年04月30日 2019/04/30
新規元年05月01日 2019/05/01
新規02年05月01日 2019/05/01
平成31年05月01日 2019/05/01
環境2 Windows 10 1809 (OS ビルド 17763.379) 平成31年04月30日 2019/04/30
新規元年05月01日 実行時エラー '13' 型が一致しません。 パースで新元号が認識されない
新規02年05月01日 実行時エラー '13' 型が一致しません。 パースで新元号が認識されない
平成31年05月01日 2019/05/01
環境2-1 Windows 10 1809 (OS ビルド 17763.437) 平成31年04月30日 2019/04/30
新規元年05月01日 2019/05/01
新規02年05月01日 2019/05/01
平成31年05月01日 2019/05/01
環境3 Windows 7 SP1 KB4489878 平成31年04月30日 2019/04/30
新規元年05月01日 2019/05/01
新規02年05月01日 2019/05/01
平成31年05月01日 2019/05/01

DateValue

DateValue(日付文字列)
環境 日付文字列 結果 備考
環境1 Windows 10 1803 (OS ビルド 17134.590) 平成31年04月30日 2019/04/30
新規元年05月01日 実行時エラー '13' 型が一致しません。 パースで新元号が認識されない
新規02年05月01日 実行時エラー '13' 型が一致しません。 パースで新元号が認識されない
平成31年05月01日 2019/05/01
環境1-1 Windows 10 1803 (OS ビルド 17134.677) 平成31年04月30日 2019/04/30
新規元年05月01日 2019/05/01
新規02年05月01日 2019/05/01
平成31年05月01日 2019/05/01
環境2 Windows 10 1809 (OS ビルド 17763.379) 平成31年04月30日 2019/04/30
新規元年05月01日 実行時エラー '13' 型が一致しません。 パースで新元号が認識されない
新規02年05月01日 実行時エラー '13' 型が一致しません。 パースで新元号が認識されない
平成31年05月01日 2019/05/01
環境2-1 Windows 10 1809 (OS ビルド 17763.437) 平成31年04月30日 2019/04/30
新規元年05月01日 2019/05/01
新規02年05月01日 2019/05/01
平成31年05月01日 2019/05/01
環境3 Windows 7 SP1 KB4489878 平成31年04月30日 2019/04/30
新規元年05月01日 2019/05/01
新規02年05月01日 2019/05/01
平成31年05月01日 2019/05/01

サンプルソース

Form1.frm
Option Explicit

Private Sub Command1_Click()
    Text3.Text = Format(CDate(Text1.Text), Text2.Text)
End Sub

Private Sub Command2_Click()
    Text1.Text = CStr(CDate(Text3.Text))
End Sub

Private Sub Command3_Click()
    Text1.Text = CStr(DateValue(Text3.Text))
End Sub
ファイル配置
Project1.exe
Project1.exe.local\VB6JP.DLL

イメージ