概要
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
- Windows 10 1809 (OS ビルド 17763.437), 2019 年 4 月 10 日 — KB4493509
- Visual Basic 6 ランタイム
- Officeインストールなしの環境
環境3
- Windows 7 SP1, 2019 年 3 月 13 日 - KB4489878 (マンスリー ロールアップ)
- Visual Basic 6 ランタイム
- Microsoft Excel for Office 2010 (14.0.7228.5001) 32ビット
結果
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 |
サンプルソース
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