はじめに
Power Automate で Excel のシリアル値(日付)を取得する方法を記載します。
ちなみに
Power Automate の Excelアクションには、、シリアル値を ISO 8601形式
に変換し取得するオプションも用意されています。
Power Automate の日付関数は、ISO 8601形式で記載された日付データ(テキスト型)をIN/OUTとすることが多いので、こちらの利用も考慮してください。
その場合、本記事で実施する処理が不要となるケースも存在します。
取得したデータに対し、「アレイのフィルター処理」で、ISO 8601形式の日付を利用し、レコードの抽出が可能です。
Power Automate でシリアル値を求める
シリアル値は、以下の数式で求められます。
add(div(sub(ticks('[求める日付]'),ticks('1/1/1900')),864000000000),2)
[求める日付]部分には、1/10/2023
など、MM/dd/yyyy
形式で指定してください。
日本の今日であれば、以下の式になります。
formatDateTime(convertFromUtc(utcNow(),'Tokyo Standard Time','o'),'MM/dd/yyyy')
よって、今日(日本時間)のシリアル値は
add(div(sub(ticks(formatDateTime(convertFromUtc(utcNow(),'Tokyo Standard Time','o'),'MM/dd/yyyy')),ticks('1/1/1900')),864000000000),2)
です。
Excel コネクタの 「行の取得」 アクション等で利用可能です。
解説
add(div(sub(ticks('[求める日付]'),ticks('1/1/1900')),864000000000),2)
について解説します。
Excelのシリアル値とは、「1900年1月1日 を 「1」 とした連番」 です。
対して、Power Automate では直接シリアル値に変換する関数はなく、日時を連番で取得するには ticks()
を利用します。
ticks() とは、「0001年1月1日午前00時00分00秒 を 「0」 とし、経過した 100 ナノ秒間隔の数」 を表します
よって、ティック化したのち、
① 1900年と0001年の差を吸収し、
② ナノ秒を日(日付)に変換し、
③ シリアル値の「1」から開始する仕様と、Excelの「1900/02/29」への対応
を行っています。順に説明します。
① 1900年と0001年の差を吸収
上記でも記載しましたが、シリアル値は1900年1月1日から、ticks()は0001年1月1日からスタートした経過日時になります。
よって、求める日付のティック値より、約1900年分を差し引く必要があります。
sub(ticks('[求める日付]'),ticks('1/1/1900')
② ナノ秒を日(日付)に変換
シリアル値は1日を1とした連番ですが、ticks()は100ナノ秒ごとの連番です。
よって、1,000,000×60×60×24=864,000,000,000 で除算し、日単位に変換します。
div([①の結果],864000000000)
③ シリアル値の「1」から開始する仕様と、Excelの「1900/02/29」への対応
シリアル値は「1」から開始しますが、ticks()は「0」から開始します。
また、Excelには、「1900/02/29」という本来ありえない日付が存在しており、この日もシリアル値にて1加算されています。
よって、上記②で求めたシリアル値に2日分を追加する必要があります。
add([②の結果],2)
まとめ
Excelの日付値を、参照/更新する際、ISO 8601形式での指定が可能となっていますが、シリアル値を扱うことも可能です。その際、当記事をご参考いただければ。