きなこSHOW

日々の戯言

UiPathで西暦日付を和暦に変換するワークフロー

UiPathで日付を入力する時、操作対象のアプリケーションが和暦で入力するタイプだと、困る。
開発者としてはもうぜんぶ西暦に統一してくれと願うばかりだが、和暦で入力するアプリにたまに遭遇するので、いちいちダメージを受けていられない。

そこで共通関数みたいなものを用意した。
UiPathで日付を西暦から和暦に変換するワークフローの作成手順と、コピーしてそのまま使えるコードを紹介しよう。

シーケンス「ConvertSeirekiToWareki.xaml」のイメージ

「ConvertSeirekiToWareki.xaml」

依存関係は「UiPath.System.Activities」だけ。他のは要らないので削除して良し。

引数

あらかじめ引数を定義しておく。好きな名称で構わないが混乱しないように。
ちなみに外側の変数は不要。

「ConvertSeirekiToWareki.xaml」では引数を次のように設定する。
引数
結果はテキストボックスに貼り付ける用だろう、入力・出力ともにString型で良し。

名前 方向 引数の型 規定値
ArgINPDate 入力 String  
ArgOutDate 出力 String  
ArgOutGengo 出力 String  
ArgOutYear 出力 String  
ArgOutMonth 出力 String  
ArgOutDay 出力 String  

これらの引数は次の用途に使う。
ArgINPDate:呼び出し元で日付を”yyyy/mm/dd”形式の文字列をセットする
ArgOutDate:和暦に変換した結果を「ggy年M月d日」形式の日付文字列で返す
ArgOutGengo:和暦の元号部分だけを返す
ArgOutYear:和暦の年部分だけを返す
ArgOutMonth:月を返す
ArgOutDay:日を返す

「コードを呼び出し/Invoke code」アクティビティ解説

引数

「コードを呼び出し」(英版だと「Invoke code」)アクティビティを使用する。

コードを呼び出し

このアクティビティ内の[引数を編集]ボタンをクリックすることで「呼び出されたコード引数」ダイアログが表示される。
Invoke codeの引数

外側(「ConvertSeirekiToWareki.xaml」)の引数とよく似ているが、違うのはIN / OUTともに値に「ConvertSeirekiToWareki.xaml」の引数を渡すよう設定している。
「Invoke code」内で定義する引数の名前は、外側(「ConvertSeirekiToWareki.xaml」)と同じで構わない。
以下のように設定しよう。

名前 方向
ArgINPDate 入力 String ArgINPDate
ArgOutDate 出力 String ArgOutDate
ArgOutGengo 出力 String ArgOutGengo
ArgOutYear 出力 String ArgOutYear
ArgOutMonth 出力 String ArgOutMonth
ArgOutDay 出力 String ArgOutDay

コード

「コードを呼び出し」アクティビティ下部にある[コードを編集]をクリックして表示される「コードエディター」が下の図。

コードエディタ

次のコードをコピーして貼り付けよう。

' カルチャの「言語-国/地域」を「日本語-日本」に設定します。
Dim ci As New System.Globalization.CultureInfo("ja-JP")
' 和暦を表すクラスです。
Dim jp As New System.Globalization.JapaneseCalendar
Dim dt As System.DateTime

' DateTime形式を満たさない場合抜ける
If Not System.DateTime.TryParse(ArgINPDate, dt) Then
   Return
End If

' 現在のカルチャで使用する暦を、和暦に設定します。
ci.DateTimeFormat.Calendar = jp

' 引数のデータを、DateTime型に変換します。
dt = System.DateTime.Parse(ArgINPDate)

' 「書式」「カルチャの書式情報」を使用し、文字列に変換します。
ArgOutDate = dt.ToString("ggyy年M月d日", ci)
ArgOutGengo = dt.ToString("gg", ci)
ArgOutYear = dt.ToString("yy", ci)
ArgOutMonth = dt.Month.ToString
ArgOutDay = dt.Day.ToString

上記を設定したら好きな名前でxamlを保存する。
このサンプルでは「ConvertToWareki.xaml」とした。

呼び出し例

呼び出し例

変数

変数定義
「ConvertToWareki.xaml」の入力用引数に渡す「yyyy/mm/dd」形式の文字列と、出力用引数の値を受け取ってメッセージボックスに表示させるための変数を定義した。

名前 変数の型 スコープ 既定値
strINPDate String 呼び出し元  
strDate String 呼び出し元  
strGengo String 呼び出し元  
strYear String 呼び出し元  
strMonth String 呼び出し元  
strDay String 呼び出し元  

ここは上記の通りに設定する必要はない。各自で定義している変数名に読み替えて欲しい。

アクティビティ解説

ひとつ目の「入力ダイアログ」アクティビティは、おなじみINPUTBOXみたいなものなので説明は省略する。
INPUTした結果を変数「strINPDate」に出力するよう設定している。

次に「ConvertToWareki.xaml」を呼び出す。[プロジェクト]ツリー内に作成されている「ConvertToWareki.xaml」をペタっとしてやると簡単に設定できる。
ペタぁ
このアクティビティ内の[引数をインポート]ボタンをクリックすると「呼び出されたワークフローの引数」ダイアログに「ConvertToWareki.xaml」で設定した引数が表示される。
「呼び出されたワークフローの引数」

「ArgINPDate」の値・・・strINPDate
「ArgOutDate」の値・・・strDate
「ArgOutGengo」の値・・・strGengo
「ArgOutYear」の値・・・strYear
「ArgOutMonth」の値・・・strMonth
「ArgOutDay」の値・・・strDay

最後はメッセージボックスに以下の式を表示している。

strDate & vbCrLf & strGengo & strYear & "年".ToString & strMonth & "月".ToString & strDay & "日".ToString

実行した例がこちら。
入力
入力ダイアログ20190430
出力
メッセージボックス平成
入力
入力ダイアログ20190501
出力
メッセージボックス令和

メッセージボックス内の上の行の表示は「ConvertToWareki.xaml」の下図の部分で設定したもので、「strDate」(ArgOutDate = dt.ToString("ggyy年M月d日", ci)の結果)の年の部分が01の場合、元年に変換される事に注目されたい。
日付書式
ここの書式を"ggyy年~"にしようが、"ggy年~"にしようが、1年が元年になってしまうのは.NET Framework の仕様らしい。

メッセージボックスの下の行の表示は、
「strGengo & strYear & "年".ToString & strMonth & "月".ToString & strDay & "日".ToString」で結合した結果を出力している。
こちらは1年が数字で返される。

strDateを使うか、日付をバラしたパーツを使うかは、用途に応じて好きな方を選んで欲しい。