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](https://support.microsoft.com/ja-jp/help/4487017)
- 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](https://support.microsoft.com/ja-jp/help/4489894)
- 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](https://support.microsoft.com/ja-jp/help/4489899/windows-10-update-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](https://support.microsoft.com/ja-jp/help/4493509/windows-10-update-kb4493509)
- Visual Basic 6 ランタイム
- Officeインストールなしの環境

## 環境3
- Windows 7 SP1, [2019 年 3 月 13 日 - KB4489878 (マンスリー ロールアップ)](https://support.microsoft.com/ja-jp/help/4489878/windows-7-update-kb4489878)
- Visual Basic 6 ランタイム
- Microsoft Excel for Office 2010 (14.0.7228.5001) 32ビット

# 結果

```: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

```vb
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

```vb
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

```vb
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||

# サンプルソース

```vb: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
```

## イメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/204150/80074599-5f9c-300c-5cdc-6cd79138088b.png)