Power Query:日付列と時刻行の一覧表を組み替える
画像で見た方が分かりやすいと思うので、早速だが下のような表があるものとする。「日」の列と「時刻」の行で構成されたマトリクス表から「日時」と「名前」の表に組み替えしたい場合。何となく「列のピボット解除」をすれば良さそうなのは分かると思う。というわけで、まずは「データ範囲」を読み込む。今回はテーブルではないので「先頭行をヘッダーに昇格」も実行する。 ソース =...
View ArticlePower Query:1セルに入力したアンケート結果から集計する
Excelを利用している人の中には、「入力で楽して、計算で困る」人が結構な数います。月ごとにシートを分けて、Excel方眼紙で表を作っちゃうような人はその部類に入るでしょう。これは、とある人が入力したアンケート結果の記録です(実話)。何かというと「問1は『1』、問2は『1』、問3は『3』、……問15は『3』」を1セルに入力したものです。1セルずつ分けて入力しておけばなんてことないのに、Enterキー...
View Article数式/関数:UNIXタイムスタンプをシリアル値に変換する
「10桁以上の数値からなる日時を表現した数値」があったら、それは「UNIX時間(タイムスタンプ)」で間違いありません。桁数が多い場合もありますが、気にする必要はありません。この仕組みは単純なもので、「1970年1月1日」を「0」として経過秒数を協定世界時(UTC)で表現したものです。なので、Excelでシリアル値に変換するのは難しくありません。画像の場合なら、UNIX時間→シリアル値への変換A1に値...
View ArticlePower Query:ソースの読み込みエラーを回避する(DataSource.Error)
皆さんは、クエリでソースを読み込もうとしたらエラーが起きたことはないでしょうか。私はよくあります。固定のパスでフォルダを参照していると、ふとした拍子にリンクが切れてしまうことがあるからです。こんな時は慌てずに、右上の「設定の編集」ボタン、もしくは「データ...
View Article数式/関数:年月表記の文字列を月単位表記に変換する
勤続年数を「何年何ヶ月」と表示したいからと、DATEDIF関数の「Y」と「YM」で計算したものを「&」で繋いで文字列で表現する人が時々います。=DATEDIF(入社日,現在,"Y")&"年"&DATEDIF(入社日,現在,"YM")&"ヶ月"やるのはいいんですけど、これをどうやって計算に使うつもりなんでしょう。よくあるのは「職員の平均勤続年数を計算したい」みたいな話で...
View ArticlePower Query:ソースの読み込みを条件式で切り替える
ソースの読み込みを条件式で切り替えた場合、該当しないほうのデータは読み込まれるでしょうか。答えはノーです。つまり読み込む情報を小分けにしておいて、必要に応じて切り替えて使ったほうが処理は断然早くなります。例えば A列が1行、B列が100万行のテーブルがあるとします。ここからクエリを作成し、クエリ1Table.FromColumns( {{"A"}, List.Repeat({"あ",...
View ArticlePower Query:複数のシートのデータを縦結合する(ヘルパークエリ編)
複数のブックを統合するのに標準機能でやると、出現するのがヘルパークエリなんですが、これが苦手な人も多いのではないでしょうか。でも慣れれば便利なので、是非とも仕組みを理解して活用して欲しいと思います。もちろん他の用途にも応用できますし。今回は「複数のシートを縦結合する」を一からヘルパークエリで作ってみましょう。普通にやる方法は以前にやったので割愛します。最初に一点注意。対象のファイルとデータを読み込む...
View Article数式/関数/Power Query:指定行数分だけ繰り返し表示させる
指定行数分だけ繰り返し表示をしたい場合。それも「1」「2」「3」「1」「2」「3」……ではなく、「1」「1」「1」「2」「2」「2」……としたい時はどうればいいでしょうか。これが1列しかない場合は、それほど難しくないです。例えば4行繰り返したい場合なら、=TOCOL(A:A,SEQUENCE(COUNTA(A:A)),SEQUENCE(,4,,0)))これでできます。範囲が固定なら、=LET(r,A...
View ArticlePower Query:上と同じ値を非表示にする(グループ表示)
空いている行を上の値で埋めるのは「下方向にフィル」で簡単にできますが、その逆はどうでしょうか。もちろん「上方向にフィル」という意味ではなくてです。つまり画像のように、先頭の値以外を表示しない設定です。「ピボットテーブルでやれ」、「クエリでやることか」といってしまえばその通りなんですが、頭の体操がてらどうやればいいか考えてみましょう。エクセル感覚だと「上のセルと比較してー」と安易に考えがちですが、クエ...
View ArticlePower Query:リストを使って抽出する
クエリのステップの中で、複数キーを指定して抽出したい時、数が多くなれば抽出用のリストを用意することになるでしょう。ただ「~と一致する」なら抽出条件に List.Containsを使えばいいんですが、「~を含む」を条件にしたい場合には、そうはいきません。例えば「リストの値と等しい行を抽出」する場合は、Table.SelectRowsの条件を下記のように記述すれば抽出できます。each...
View ArticlePower Query:重複している行を抽出する
簡単かと思ってやってみたら、意外と苦戦するかもしれません。「重複を省いて抽出」ではなく「重複している行を抽出」したい場合、どうすればいいでしょうか。こういう時、エクセル感覚だと「それぞれの行に、一つ上までの行を参照する COUNTIF関数を仕込んで……」みたいな発想になりがちですが、これを Power Queryに持ち込むと碌なことになりません。間違っても、List.Generateや...
View ArticlePower Query:要素数の異なる配列からテーブルを作る
個数の合わない配列(ジャグ配列)を、単純に1テーブルに変換しようとすると、エラーを起こしてしまいます。文章で読んでもピンとこないかもしれませんが、例えば要素数が 10個の配列(例えば「{1..10}」)を 3分割した場合、最後の配列の要素数は 1つになりますね(「1,2,3」「4,5,6」「7」)。これを...
View Article数式/関数:住所を分割する
住所から郵便番号を検索したり、郵便番号から住所を検索したりは、WebAPIの力を借りれば比較的簡単にできるようになりました。今回はそれらの合わせ技。手入力された住所情報を「都道府県名」「市区町村名」「地名」「番号」「それ以外」に分割してみましょう。まずは、テーブルの「住所」列に入力された住所情報から郵便番号を検索します。郵便番号=IF([@住所]="","",WEBSERVICE(...
View Article数式/関数:月齢を指定してカウプ指数を計算する
子どもが産まれたばかりなもので、カウプ指数から肥満度を計算するのに数式でどうやるか考えてみました。カウプ指数の計算は、BMI値と同じなんですが判定基準が異なります。なので月齢に応じた対応表がまずは必要になります。こういう表を作る時に注意したいのは、「後でどういう計算をするか」を先に考えてから作るってことです。時々ネットで見つけた表を見たまんまで作ってから「さて、どうしようか」と悩み出す人がいます。後...
View ArticlePower Query:マージ列の展開時に行の順番がずれないようにする
クエリのマージを実行した後で、結合した列を展開(Table.ExpandTableColumn)した時に、行の順番がずれてしまったことはないでしょうか。例えば下のようにテーブル1とテーブル2をマージして、「テーブル2」列から必要な列を展開すると、「名前」列が元の順番と変わってしまう場合があります。仕様に文句をいっても仕方がありませんので、これが起きないようにするにはどうすればいいかを考えてみました。...
View Article数式/関数:空白行で仕切って連番を入れる
やってみて「あれ?」と思ったので記事にすることにしました。画像のように空白行で区切られたデータの横に連番を振りたい時、先頭が必ず空白行で、範囲に予め数式を入れておけばいいのなら=IF(A1="","",SUM(INDEX(B:B,ROW()-1),1))...
View Article数式/関数:マージと展開を数式でやってみる
「2つのテーブルをマージして必要な値を展開する」って、クエリでやれば超簡単なんですが、これをあえて数式でやってみました。因みにクエリでやるなら「大分類」でマージして「値」を展開するだけです。マウスの操作だけで読み込みまでいけます。書くまでもないんですが、一応コードも書いておきます。クエリ版let ソース = 表1, クエリのマージ = Table.NestedJoin(...
View Article