UiPathで日付を入力する時、操作対象のアプリケーションが和暦で入力するタイプだと、困る。
開発者としてはもうぜんぶ西暦に統一してくれと願うばかりだが、和暦で入力するアプリにたまに遭遇するので、いちいちダメージを受けていられない。
そこで共通関数みたいなものを用意した。
UiPathで日付を西暦から和暦に変換するワークフローの作成手順と、コピーしてそのまま使えるコードを紹介しよう。
シーケンス「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」)アクティビティを使用する。
このアクティビティ内の[引数を編集]ボタンをクリックすることで「呼び出されたコード引数」ダイアログが表示される。
外側(「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
メッセージボックス内の上の行の表示は「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を使うか、日付をバラしたパーツを使うかは、用途に応じて好きな方を選んで欲しい。