ラベル エクセル の投稿を表示しています。 すべての投稿を表示
ラベル エクセル の投稿を表示しています。 すべての投稿を表示

2022/02/05

[Excel BI/Power Query] そのフィルター大丈夫ですか?そのピボットテーブル レポート本当に正しいですか?

かなり前に書きかけていた記事を追記・完成させて公開します。

Excel は大量のデータから欲しいデータを絞り込み、集計をするのは得意とするところですし、それを実現するために、SUMIFS 関数などの「数式・関数」を使ったり、オートフィルターやテーブル機能などの「機能」を使ったり、VBA を使ったプログラミングで実現するなど、さまざまな方法を使うことができます。それらの中でも「ピボットテーブル」は本当によく使います。

今回データを「絞り込む」ということに関して、以前、私自身がはまって、その理由が小一時間わからず、あらためて Excel の機能の特性を勉強させられたので、共有したいと思います。特に、ピボットテーブルと取得と変換 (Power Query) のクエリエディタを組み合わせて使っている方は、データの絞り込みの仕組みの違いを意識していないと、以下のような思わぬところで落とし穴にはまるかもしれません。

データソースからデータを絞り込む方法 - ピボットテーブル

実際の元データは4年分の勉強会開催のデータでしたが、ここでは簡単なサンプルを使って説明します。ピボットテーブルの元データとなるデータソースは外部の Web サーバー上から取り出すテーブルですが、Excel 上にサンプルのテーブルを作り、それを元データとするピボットテーブルを作成します。
テーブルからピボットテーブルを作成する
このケースであれば、全部で9件分のデータをピボットテーブルでは「タイプ」のAからFにまとめて集計しています。元のデータソースは「テーブル」で作成しているので、11行目に新しいレコードが追加されても、ピポットテーブルは「更新」するだけで、元データソースの範囲を再指定することなく、追加された新しいレコードを含めた集計結果をピボットテーブルで返します。(これも知らない人が多いので注意です!)
元のデータソースにレコードを追加して、ピボットテーブルでレポートを更新する
いつもやっている、見慣れた操作とその結果です。
このピボットテーブルレポ―トから、タイプの A と B の集計の必要がない場合は、ピボットテーブルの「フィルター機能」を使うと思います。ピボットテーブルで絞込みをするための方法は2つの方法があって、1つは行ラベルにある矢印ボタンからフィルターを設定する方法、もう1つはピボットテーブルのフィールドリストにある「フィルター」を使って絞り込む方法です。ここでは行ラベルのボタンを使ってフィルターをかけてみます。
行ラベルのボタンでフィルターを設定する
何も問題ありませんよね。
「このレポートを作成・提出して終わり」といった Excel の使い方であれば、ピボットテーブルを使って作成するレポートはここで終わりだったと思います。

自分のケースの場合は、上記のサンプルのように Excel のテーブルが元データソースではなく、WebサービスからAPIで取得するものでした。その為、データを取得し、絞り込むところは取得と変換(旧Power Query)のクエリエディタで行っていました。結果、元のデータソースに日々データが追加されるような場合でも、不要なデータ(上記の例ではタイプAとB)を「Power Query エディタ-」で除外し、取得と変換の「更新」ボタンで最新データを取りこんで、新規に追加されたデータをピボットテーブル レポートに表示していました。

さて、サンプルに戻り、上記のケースと同様の状況を作ってみます。データソースのテーブルに新しいデータを追加して、ピボットテーブルを更新してみます。ピボットテーブルではAとBを除くフィルターが設定されている状況です。
データを更新、追加してピボットテーブルを更新する
タイプGの30、Bの30、Hの100を追加します。ピボットテーブルを更新することで、Bはフィルターでチェックを外しているので、集計対象になりません。Gは40から70に更新され、総計も110から140になりました。
ところが、Hのレコードはピボットテーブル レポートに反映されません。

この絞込みのフィルターの条件は「AとBをはずす」ではなく、絞り込むときに存在していたA,B,C,D,E,F,Gからチェックが付いている「C,D,E,F,Gだけを選ぶ」なのです。よって、新規にデータソースに追加されたHはピボットテーブル レポートに反映されないのです。

私がはまったのはまさにこのケースで、「ちょっと楽してピボットテーブル レポートの列フィルタで絞り込み」した結果、除外ではなく、そこに表示されているものだけを選択する、になってしまったため、その後でデータ/ レポートの更新を行っても、追加された新しいタイプのレコードはピボットテーブルに反映されない状態になったのでした。

クエリエディターの絞込みは「除外」(注:基本は・・・です)

ややこしいのは、この Excel の絞り込みの操作と、クエリ エディターでの操作がほぼほぼ見た目が同じということです。クエリエディタで行のフィルターをかける操作は、ピボットテーブルと同じような操作で、列名にあるボダンを使って指定できます。
クエリエディタ―の列名ボタンからフィルターを設定する
繰り返しになりますが、ピボットテーブルのフィルター設定と同じ操作でも、上記の場合、その意味は違っていて、■(すべて選択)が押されている状態から A, B を外した場合は、まさに「AとBを外す」という条件になります。詳細エディターで確認すると、以下のようなM言語による式が記録されています。

フィルターされた行 = Table.SelectRows(変更された型, each ([タイプ] <> "A" and [タイプ] <> "B"))

上記の式では、Table.SelectRows に それぞれの行の[タイプ]がAではなく、かつ、Bでもない、という条件を引数として与えています。<>は「等しくない」を表します。

よって、全件が入っている元データから「取得と変換」のクエリ エディターを使って行の絞り込みを行い、その絞り込んだ結果を使ってピボットテーブルを作る方法は、レポートに新しいタイプの新規の行がきちんと追加されているので、問題ありませんでした。この使い方の多くは、レポートに不適切なレコードが入ってきたら、クエリエディターのフィルターオプションでそのタイプを除外するように設定して、必要なデータのみレポートで利用していました。

トラブルのケースでは、ついうっかりピボットテーブル側で行の絞り込み条件を設定しそのままにしてしまい、たまたま元のテーブルに新しいタイプのレコードが追加されたことを「知っていた」ので、ピボットテーブル レポートが正しくないことに気が付きましたが、これ、実際のデータは数万件で、毎月追加される件数もかなりの数ですから、気が付かないことのほうが多いかもしれませんね。

しかし、このトラブル、これで終わりではなかったのです。

クエリ エディターの絞り込みは必ず「除外」ではなく選択する数による

ところが、別件でまたピボットテーブル レポートに新しいデータが追加されないケースに遭遇しました。今度はピボットテーブルの列フィルタは使っていません。そこでクエリ エディターを見ると、なんと除外ではなく、Excel のピボットテーブルのフィルタ同様に「選択」になっていました。


= Table.SelectRows(変更された型, each ([タイプ] = "C" or [タイプ] = "D" or [タイプ] = "E" or [タイプ] = "F" or [タイプ] = "G"))

上記の式では、タイプがCまたはDまたはEまたはFまたはGと等しいもの、という指定になっています。これでは11種類めの新規のタイプが追加されてもクエリ エディターによる絞り込みテーブルには追加されず、ピボットテーブル レポートにも追加されません。

サンプルの10種類のタイプをもつレコードを用意して検証してみると以下のような結果になりました。

除外が1つの場合
= Table.SelectRows(変更された型, each ([タイプ] <> "A"))

除外が2つの場合
= Table.SelectRows(変更された型, each ([タイプ] <> "A" and [タイプ] <> "B"))

除外が3つの場合
= Table.SelectRows(変更された型, each ([タイプ] <> "A" and [タイプ] <> "B" and [タイプ] <> "C"))

除外が4つの場合
= Table.SelectRows(変更された型, each ([タイプ] <> "A" and [タイプ] <> "B" and [タイプ] <> "C" and [タイプ] <> "D"))

除外が5つの場合(ここで条件式が変わる)
= Table.SelectRows(変更された型, each ([タイプ] = "F" or [タイプ] = "G" or [タイプ] = "H" or [タイプ] = "I" or [タイプ] = "J"))

以降除外が9までは「=」の指定

除外が10個の場合=すべて除外 (また <> が使われる)
= Table.SelectRows(変更された型, each ([タイプ] <> "A" and [タイプ] <> "B" and [タイプ] <> "C" and [タイプ] <> "D" and [タイプ] <> "E" and [タイプ] <> "F" and [タイプ] <> "G" and [タイプ] <> "H" and [タイプ] <> "I" and [タイプ] <> "J"))

なるほど、過半数以上になると条件式が「反転」するようですが、みなさん、これ、意識してますか? 

これ以来、自分は行のフィルター設定をいぢる場合は、ドロップダウンで表示されるGUIを使って指定しても、かならず fx の数式の条件が = なのか、<> なのかを確認するようになりました。

行フィルターを使用している、みなさんのクエリ エディターやピボットテーブル レポート、本当に新しいレコード含まれていますか? 

ちょっと怖いですね。

以上、参考になれば幸いです。

2021/07/18

[Excel] よく使うエクセルのショートカットキー

Excelあるあるで、ショートカットキーの一覧がほしい、というリクエストは多いのですが、正直一覧を手に入れて使えるようになりました!という人はあまり見たことありません(苦笑)

Ctrl+C, Ctrl+V のコピー & ペーストのショートカットキーはExcel以外の場面でも使う鉄板としても、自分が今でも Excel を使っている時に多用するショートカットキーはいくつかあります。ただ、基本的にショートカットキーはその人のExcelの使い方に依存するので「自分の仕事で繰り返し使う機能はどれか?」を把握することが大事です。そこから仕事を楽にするためにショートカットキーを確認して、なんども使う練習をして覚える人が多いと思います。

自分がよく使うショートカットキー(順不同)

Ctrl+↓、Ctrl+↑

マウスをガシガシ、マウスホイールをグリグリし続けなくても、データの一番上、一番下に移動することができます。正確にはデータの「かたまり」の一番上、一番下になるので、途中に空白のセルがあればそこでとまります。Shiftと組み合わせての範囲指定もよく使います。

Ctrl+T

モダン Excelのベースである「テーブル」作成のためのショートカットキー。テーブルについては過去の投稿でいくつも取り上げていますのでそちらも参照ください。

テーブルのすすめシリーズ

http://road2cloudoffice.blogspot.jp/2014/10/vlookup.html
http://road2cloudoffice.blogspot.jp/2014/10/blog-post.html
http://road2cloudoffice.blogspot.jp/2014/10/blog-post_31.html
http://road2cloudoffice.blogspot.jp/2014/11/blog-post.html
http://road2cloudoffice.blogspot.jp/2014/11/blog-post_7.html
http://road2cloudoffice.blogspot.jp/2014/11/office-365-sharepoint.html

Ctrl+チルダ(~) (Ctrl+Shift+[へ])

このショートカットキーは、使っている人を見たり、話題にしたりする人をあまり見たことがないのですが、自分はほんとうに良く使います。それはワークシートの再利用をしているせいなのかもしれません。セルに数字をいれたら、前の設定があって「%」表示になっちゃった、という時に標準書式形式に戻すために使います。数字入れたら、「1900/1/2」などの日付になった場合も標準書式に戻すのに有効です。 

Ctrl+1

セルの書式設定のダイアログを表示するためのショートカットキーです。セルの書式設定はダイレクトに指定する方法がいくつかあって、たとえば数字の3桁カンマ表示なら Ctrl+Shift+1 ですが(そしてたまに間違える)、書式設定はさまざまな設定ができるので、Ctrl+1 でダイアログを表示してそこから選ぶ、という使い方をしています。

Ctrl+; と Ctrl+: の組み合わせ

現時点の日時を入力するために使います。Ctrl+; で日付を入力し、同じセル内で半角スペースを入力してすぐに Ctrl+: を使って時刻を入力します。自動的に yyyy/m/d h:mm の書式になります。

Ctrl+D

下方向にコピーです。使わない日はない、というほど使います。Ctrl+C, Ctrl+V より使うかもしれません。テーブル形式のデータを扱っていると、Ctrl+R(右方向にコピー)を使うことはないはずです。

これもよく「上のセルの値をコピーする」と紹介されていることがありますが、それよりも「同じ値を複数行に下方向にコピーする」という使い方です。

Ctrl+Shift+L

昔からあるフィルターのオン・オフのショートカットキーですが、モダン Excel で表形式のデータでもよく使うようになりました。モダン Excelではデータは「テーブル」になっているので、基本的にはフィルター機能はオンになっている状態です。Ctrl+Shift+Lを使う場面は、テーブルのフィルターを使って複数の列で絞り込みを指定しているものすべてを解除したい時に、Ctrl+Shift+Lをつかって全フィルターを解除して、再度ショートカットキーでフィルターをオンにする、という使い方が多く、テーブルの絞り込み条件解除に使います。フィルター機能のオン、オフだけのために使うことはないです。

Ctrl+H(またはCtrl+F)

モダン Excel ではテーブルのフィルターを使った検索が主流になるとはいえ、やはり「検索と置換」ダイアログはよく使います。

Ctrl+Alt+F5

ExcelでPower Queryを使っている人であればよく使うであろうショートカットキーだと思います。[データ]タブの[クエリと接続]の[すべて更新]に相当します。

Ctrl+S

たぶん、一番最初に全員が覚えるべきショートカットのひとつ。上書き保存です。

以上、自分がよく使うショートカットキーでした。

2021/07/10

[Excel BI] 集計をするのに扱いづらいデータの直し方(データの取得と変換)

 久しぶりの前回の投稿で「ピボットテーブルが使えない原因のほとんどは元データにあって・・・・」と書きましたが、この使えない原因というのは「データが汚い」と呼ばれる状態であって、Excel に限った話ではありません。

先日 #ohayo_aws で ETL (Extract, Transform, Load) のサービス関連 (AWS Glue Databrew など)で「朝から汚いデータの話をしてはいけない」」みたいな話題になりましたが、データを集計したり、分析する人たちにとっては、汚い元データとの格闘の逸話は数多くあるようです。

Excel の世界でも「データクレンジング」と呼ばれ、昔からこの手の処理はありました。データをきれいにするためにいくつかの関数や機能を駆使してきましたが、今は「データの取得と変換」による機能(または、Power Query エディターの M言語)を使うのが モダンExcel になると思います。さらりとどんなやり方があるか、旧来のExcelの機能を含めておさらいしてみましょう。

Excelの機能 「検索と置換」は Ctrl+H

Ctrl+Hは「検索と置換」ダイアログの「置換」タブを表示させるショートカットキーで、これをつかって、汚いデータの文字または文字列の置き換えをします。ワークシート上に汚いデータがあることが分かっていて、ピンポイントで変換したいときはこれが直感的でかつ一番簡単な方法です。


明示的に全角の文字を半角に置き換え指定したり、一文字だけでなく、文字列を指定して他の文字や文字列にも置き換えることができます。株式会社を㈱にするなども可能です。(それがいいかどうかは別として)

機能として意外に見落としがちなのは、この検索と置換を使って汚いデータの文字・文字列の「削除」もできることです。たとえばハイフン「-」を消したい場合は、検索する文字に「-」を入れて、置換後の文字列に「なにも入れない」状態で置換を行うと文字列から「-」を削除してくれます。

この機能は半角ブランクや全角ブランクも「文字」として扱ってくれます。よって、全角ブランクを半角ブランクにしたい場合は、検索する文字列に全角ブランクを、置換後の文字列に半角ブランクをいれて置き換えることができます。ただし、いずれも何も表示されていないのでちょっと不安になりますよね。

この「検索と置換」機能と同じ動きをする Excel 関数は REPLACE のような気がしますが、SUBSTITUE 関数のほうが期待される同じ動きだと思います。

SUBSTITUE関数

ただ、データクレンジングで Excel の関数の出番はあまりないと考えた方がいいです。セルに埋め込む関数を使ってデータをきれいにすると、ネストされた複雑な数式となり、さらに、そのセルにどんな数式/関数が入っているかをチェックする手間を考えると、表形式で多くのデータを持つテーブルを関数と数式で修正する方法はあまり効率的ではありません。

データの取得と変換によるデータクレンジング

Excel のデータの取得と変換により、Web サーバーやクラウドからデータを取得する場合でも集計のためにデータを加工することがあります。あまり想定したくないですが、手によるフリーテキスト入力で発生しがちなケースも含めて、その対応方法を紹介します。

URLの処理 スラッシュ(/)無しあり、半角ブランク

サンプルテーブル1

Webサイトやページの特定をするのに URL の情報を扱うことがありますが、その時にURL文字列の最後にスラッシュ (/) があるケースとないケースがあります。扱うデータとしてあった方が良いか、ない方がよいかを判断して加工する、さらにAPIによる取得ではなく、画面のスクレイピングをして取得する場合などは前後に半角スペースが入ってしまう場合もあり、半角スペースの削除をしたい、そんな場合です。
[2022年追記:このケースの場合のPowerQueryでの最適な方法は Excel のフラッシュフィルに似た機能の「列の追加」の「例からの列」ですが、テキスト処理の考え方として参考にしてください。]

上図サンプルテーブルのような表またはテーブルのURLの部分を加工したい場合、モダン Excel であれば「データの取得と変換」機能を使って加工します。加工したいテーブルにアクティブカーソルがある状態で、リボンの「データ」タブにある「データの取得と変換」から「テーブルまたは範囲から」を選びます。


モダン Excel ではデータソースとしての表は「テーブル」にしてください。そうしなければ、マイクロソフトが今さらに今後提供してくるさまざまな機能が使えない、と断言できます。テーブルについては過去にもこのブログで多く言及していますので、そちらを参考にしてください。

テーブルのすすめ - 集計行 ここから他のテーブル説明投稿のリンク参照できます

Power Query エディターが立ち上がります。ここで加工をします。
なんとなく「変換」タブに該当する機能がありそうで選んでみますが、リボンには多くの機能があって、なかなかそれらしい機能をすぐに見つけられないかもしれません。

Power Query エディター [変換]タブ表示

今回操作(加工)したいのは「URL」の列なので、「URL」列を選択した状態(=緑色のなっている状態)で、リボンの「テキストの列」にある「書式」にある「トリミング」を選びます。

Power Query エディタ「変換」「テキストの列」「書式」「トリミング」

トリミングの上にカーソルを置くと、ツールチップ(説明)が表示されますが、そこには「選択されている列の各セルから先頭と末尾の空白文字を削除します。」とあります。Excel 関数の TRIM と全く同じではありませんが似たようなスペースの処理をしてくれます。
なお、うれしいことに半角ブランクだけでなく、全角のブランクも削除してくれますし、ブランクが2つ、3つと複数あってもすべて削除してくれます。

ちなみに「クリーン」も不要な文字を消してくれますが、ツールチップには「選択されている列に含まれる印刷不可能な文字を削除します。」とあります。具体的にはTabや改行コードです。SharePoint リストからデータを取得したときに Tab が入っていたことがありました。 Excel のテーブルや表であればAlt+Enterによる「改行コード」が含まれている可能性があります。見た目変わらないのに、テキストとして同じ判定をしてくれない、、という場合はこの「クリーン」を試してみてください。

サフィックス機能だけではスラッシュ対応ができない場合

同じく「書式」には「サフィックスの追加」があるので、これを使って URL の最後に "/" をつけられそうです。サーバーやクラウドサービスのデータを取得するようなケースではデータに揺らぎがない場合が多く、例として勉強会情報の connpass から取得する URL は / が最後につくけど、Doorkeeper から取得する URL には / がつかない、といった具合です。この場合は connpass からの URL データは最後の / を取り除くか、または、Doorkeeper からの URL データには「サフィックスの追加」機能を使って / を追加するかのどちらかで、スラッシュのある、なしを統一させることができます。

困るのが「ゆらぎ」がある場合ですよね。あるデータはスラッシュがついて、あるデータはつかない、という場合です。

 やりかたはいくつかありますが、あまりコードを書かずに、Power Queryの機能、ダイアログによる設定だけでやる方法を紹介します。

[列の追加] タブの [カスタム列の追加] と [重複する列]

Power Query エディターはリボンから機能を選択していき、一連の処理を行うことができます。この「一連の処理」は Power Query エディター画面右にある [クエリの設定] ウィンドウの [適用したステップ] に記録されていきます。これは裏側ではM言語というプログラミング言語ですべて記述されています。[ホーム] タブの [クエリ] - [詳細エディター] で確認することができます。

Power Query 詳細エディター

繰り返しになりますが、この詳細エディターは Power Query のM言語で記述されているので、そのお作法に則れば直接、自由に処理を書くことができます。ただ、自分はこの Power Query の詳細エディターを使った記述はあまり使わず、おすすめしないことにしています。というのも、エディターの機能としてはあまりに貧弱すぎるのと、たぶん設計思想としては直接M言語によってフローや機能を書かずに、ダイアログで操作を記録・記述することを優先しているように感じるからです。

よって、最低限のコード記述で、詳細エディターを使わず、リボンからの機能選択の方法で「最後にスラッシュがなければスラッシュを追加する」という処理を追加します。

1) 加工用の列のコピーを作る (重複する列)
2) コピーの列を使って「最後の1文字」を抜き出す
3) カスタム列の追加で、新たに列を追加する
4) 追加列の処理を IF 文を使って最後の文字判定がスラッシュでなければ URL にスラッシュを追加すると設定する

以上が流れになります。

1) 加工用の列のコピーを作る (重複する列)
ブランクの削除のトリムや、制御コード削除のクリーンは、オリジナルの列を指定して機能を適用しましたが、最後の1文字を抜き出す、などでオリジナルの列はそのままにしたい場合は「列の追加」タブの全般の「重複する列」を使います。最終的にこの列は削除してしまうので列名にこだわりはいらないですが、以下ではわかりやすくするために列の名前を入れています。

重複する列を使って列のコピーを行う

2) コピーの列を使って「最後の1文字」を抜き出す
判定列を選択している状態で、「変換」タブの「テキストから」の「抽出」にある「最後の文字」を適用し、文字数カウントで1を設定して、最後の1文字を抜き出します。

抽出の最後の文字を使って1文字抜き出す

3) カスタム列の追加で、新たに列を追加する
カスタム列の追加を工夫することで、詳細エディターをできるだけ使わずに処理をすることが可能になると思います。Excel でいうところのセルの数式を作成して、追加する列のすべての行(セル)に適用するイメージです。この数式で他の列や、あらかじめ作成しておいたカスタム関数などを再利用することができます。この操作は 以下の 4) にまとめます。

4) 追加列の処理を IF 文を使って最後の文字判定がスラッシュでなければ URL にスラッシュを追加すると設定する

今回は、判定列により抜き出したテキストがスラッシュでなければスラッシュを追加し、スラッシュであればURLそのまま、という処理にします。

カスタム列を追加して if then else 式を設定

なお、カスタム列の式を入れるボックスも関数の入力補助機能などがあるのでいろいろ試してみるのが良いでしょう。if then else でのエラーでよく出て最初なにやらさっぱりわからないのが、「トークン Eof が必要です。」です。これは If などで大文字(Upper Case)を使っている時にでます。記述はすべて小文字(Lower Case)にすれば大丈夫です。

最後に「判定列」を削除し、オリジナルを削除し、カスタム列の列名を「URL」にして保存します。

後処理

Power Query エディター、データの取得と変換機能を使わなくても、従来通りのTRIM関数やIF関数とMID関数を使って数式をセルに埋め込んだり、VBAを使うと同じ処理はできます。そちらのほうが早い!という方は無理に覚えなくでもいいでしょう、、、と言いたいところですが、ぜひがんばって Power Query を習得してください。よく知っている人ほど、この Power Query を中心とした モダン Excel のすごさを体感できると信じています。

自分の学びとしては、カスタム列、カスタム関数、今回は紹介していませんが条件列を工夫することで、詳細エディターで M言語を直接書きたくなる衝動を抑えることだと思います。マクロ記録のように操作を記録させるほうが多くの人に受け入れらやすいのは確かだと思います。(ただし、VSCodeが詳細エディターにとって変わる日がきたらその限りではないでしょう!)

最後に、これらの知識は 2016年くらいからあまり変わっていません。業務でも Power Query を使っていますので、機能追加などがあればチェックしていますが、チェックしきれていない可能性もあります。もし、新機能が出て、もっと簡単に同様のことができるようであれば、是非共有してください!

この記事がなんらかの参考になれば幸いです。

[追記] 2021.07.11
モダンじゃないExcelでできて、モダンなExcel (Power Query) で簡単にできなくて工夫せざるを得なかったことがあります。ワークシート関数の ASC と JIS に相当する機能やM言語関数が無いため、半角文字を全角に(JIS関数)、全角文字を半角に(ASC関数)するためにカスタム関数を作りました。VBAのようにPower Queryからワークシート関数の呼び出しができればいいのですが、それは私の知っている範囲だとできません。
とはいえ、0から9までの数字、アからンのカタカナ、aからz、AからZ、括弧( やはてな? やエクスクライメーション(びっくりまーく)!などの一部の記号の置き換えを書けばいいのです。これに対応する関数が出てこない原因はマイクロソフトへの日本のマーケットの影響が小さくなったとかネットで言われますが、それよりも、そもそもこのような全角、半角混在の入力ができることが問題で、直すのであれば、そちらを直すべきなんだろうなぁ、と思います。

2021/06/25

[Excel BI] ピボットテーブルで全体に対する%を計算する

ピボットテーブルを使いこなせたら、ものすごい時間短縮になり、仕事の結果も出る!と考えている人は多いと思います。ピボットテーブルが使えない原因のほとんどは「元データ」にあって、それで行き詰まる人が多い、というのはよく聞く話なんですが、逆に、もし元データに問題がなかったらすべてうまくいくのか?というと、実はそうでもありません。

やり方さえ知っていれば超時間短縮になるのに、といつも思うのがピボットテーブルの「全体に対する(占める)割合(%)の計算方法」です。ピボットテーブル作成までできているので、本当に「あとちょっと」なんです。

以下のようにピボットテーブルの外で計算しているワークシートを見ました。数式の =E2/$E$6 が総計に対する割合を計算しています。$は相対・絶対参照云々、、、ということを言いたいわけではないんです。


Excelの素晴らしいところは創意工夫と時間をかければ何とかなるところです。しかし、そのため知っていれば楽になる本来の使い方を知らないまま、無駄に時間をかけてしまうこともしばしばあります。(余談ですが、同じ結果が出る違うやり方があったり、追加された新機能で今まで苦労してたことが楽になった、など、経験者でもそれ知らなかった、なんてことはザラなので、知らないことを卑下することはありません!)

上記のやり方でレポート終了、今後そのワークシートを再利用しないのであれば、これでも全然問題ないのですが、例えば、製品Eが追加された、Bが無くなった、などのデータの追加・更新がはいった時は行数が変わるので計算式を調整する必要があります。1つや2つなら目で確認できますが、1000個ある内の20個くらいが入れ替わる、という状況では目で追うこともできません。それを関数やマクロでチェックする、、、なんていう斜め上の方向に行く前にピボットテーブルの機能を見直してください。めんどくさいなぁ、と思うことはだいたい実現されています。

ピボットテーブルで列に対する割合を計算する

上の図のように総計 30 を 100% として、各項目 A, B, C, D の占める割合 % を出したいパターンは使うケースがかなり多いと思います。とても簡単なので是非覚えてください。

ポイントはセルの書式設定と一緒で「データの見せ方を変えてあげる」なんです。

通常のデータと、割合のデータの2つが必要なので、以下のように個数の列を2つ作ります。


個数のフィールドを同じように値のボックスに何個でもドロップすることで同じ列を作成できます。次にこのように作った「合計/個数2」の列を%の見せ方に変えます。その列にあるセルの上で右クリックをして、右クリックメニュー(コンテキストメニュー)を表示します。


上のメニューの下から4番目にある「計算の種類」を選択します。


ここで「うぁ、、何選べかいいかわからない」となりそうですが、列に対する比率を計算するので、「列集計に対する比率」か「親列集計に対する比率」のいずれかです。とりあえず、「行集計に対する比率」を選んでください。


あとは、セルの書式設定で小数点以下の桁数を調整してもよし、値フィールドの設定から表示形式を調整し小数点以下の桁数を1などにすれば以下のようになります。


いろいろな計算オプションがあるのは、いろいろなケースに対応するためです。たとえば、以下のようなピボットテーブルの場合はどうでしょう。


単純に総計の 30 に対して占める割合であれば、先ほどの「列集計に対する比率」でOKです。でも、だいたいビジネスの世界では以下のように「キッチン用品」とか「庭用品」で小計をしたりします。同じように事業部毎だったり、リージョン・地域ごとだったりします。
(せっかくなので、その小計の出し方を含めてアニメーションGIFにします)



別の計算の種類を選ぶことで、カテゴリ(キッチン用品、庭用品)を100%にして各項目の割合を出すこともできます。いろいろ試してみてください。

忙しいビジネスパーソンこそピボットテーブルを習得すべき

ビジネスパーソンのための、、、というお題で極論すれば、Excelは関数、ましてやマクロやVBAを覚える前に、ピボットテーブルだけを覚えれば、大体の計算はできます。なぜならビジネスの基本のデータは「表」形式であり、表をベースにした計算が求められるからです。

Excelの機能としての「テーブル」、それらを成形・集計するピボットテーブル、さらにクラウドやサーバーからデータを取りこむExcelの「取得と変換」、グラフはExcelの機能としてはかなり複雑で難しいのですが、それでも最新機能で必要なところだけ押さえることでかなりのことができると思います。

あまた機能を内蔵しているExcelはその学習コストがあまりに高い、大きいです。よりに自分に必要な機能を厳選して、それらの機能習得に時間やお金をかけることが望まれます。

何らかの参考になれば幸いです。

過去の投稿ですが、知識としてはまだ使えますのでお時間があればどうぞ参照ください。

[Excel BI]ピボットテーブルで予算と実績を管理する
https://road2cloudoffice.blogspot.com/2019/09/excel-bi.html

[Excel] テーブルのすすめ ピボットテーブルとリレーションシップ

[Excel] テーブルのすすめ 集計行
https://road2cloudoffice.blogspot.com/2014/10/blog-post_31.html

2018/06/13

[Excel 取得と変換] カンマで区切られた複数回答結果を集計する

ネット上でアンケートを作成して、スマホやパソコンで答えてもらい、その結果をCSVなどで受け取るサービスってよくありますよね。身近な(でも、意外に使われていない)サービスとしては、Excel Onlineのアンケート機能(最近は Excel Survey という名称のようですが)、なんてものがあります。([追記 2022.3] Excel Survey はサービス終了し、Forms へ統合されました)

ラジオボタンやドロップダウンリストで複数の選択肢から1個だけ選択させる、という設問は、結果が1つだけなので、1セルに1つの値が入りますが、複数回答可能な設問になると、1つのセルに複数の値が入ります。アンケートの結果として手に入れた表が以下のようになります。
セル内でカンマで区切られた複数回答の例
これも「集計・分析しづらい表」の代表例とも言えます。今回はこの複数回答結果のような、1セルにカンマなどの区切り文字で複数値が含まれているデータを簡単に Power Query (Excel であれば取得と変換)で集計する方法をご紹介します。ワークシート関数を駆使しなくても、VBAを使わなくても、Excelの新しい機能である「取得と変換」(Power Query)を知っていれば対応可能です。
上記の例の場合、ビール、ウィスキー、ワインが選ばれた数を知りたい、そこから、東京でビールを選んだ人はどのくらいいるのか、性別で見た時に、、、という分析をしたいわけですよね。こういう分析は、やはりピボットテーブルが使いやすいと思います。

セルの中の区切り文字でセルを分割する

Power Query - 取得と変換を使わなくても、[データ]タブの[データ ツール]グループにある「区切り位置」の機能を使えば、カンマ区切りの1セルのデータを複数セルに分割することができるのは確かです。

話は脱線しますが、これまでも同じ事ができてるんだから、あえて「取得と変換」 Power Query を使う必要はない、と考えてしまいがちですが、Power BI と Excel の製品動向から考えると、早めに同じ機能なのであれば「取得と変換」の使い方に慣れたほうが得策だと感じています。メリットやデメリットなどいろいろ〇×表で書けると思いますが、一番の違いは、元のデータが Excel のワークシート上に無くてもよい、という点、よって元のデータを直接加工しないで済む、という点だと思います。

実際の手順を追ってみましょう。

1) 元のデータをテーブルにする
モダンエクセルの基本は表形式のデータはテーブルにする、です。Ctrl+Tでテーブル形式に変換してしまいます。

2) テーブルからクエリ エディターを開く
変換したテーブルを元データとして、この元データを加工するためにクエリ エディターを開きます。アクティブセルをテーブル内において、[データ]タブの[取得と変換]グループにある[テーブルから]をクリックして、クエリ エディターを立ち上げます。

3) 列を指定して区切り文字による列分割を行う
サンプルデータであれば「好きな飲み物(複数回答可能)」の列を選択(ヘッダーをクリックでOK)し、区切り文字に「カンマ」を選択して列の分割を行います。手順は以下のアニメーションGIFを参考にしてください。
クエリ エディターの [変換] - [列の分割]機能を使って、カンマ区切り文字で列を分割する
集計・分析しやすいデータの持ち方に変換する

上記の列の分割までは「区切り位置」機能と大差ありませんが、取得と変換を使ってほしいのは、この後の「列ピボットの解除」の処理があるからです。
[追記] 列の分割機能の詳細設定オプションで「分割数」を「行」にすることで、以下の列ピボット解除を行わずに、一気に「好きな飲み物列」の各行にデータの展開が可能です。最後にその手順のアニメーションGIFを追加しました。ご指摘ありがとうございます!

データを区切ったまではいいのですが、まだこのデータは分析には向いていません。ビールやウィスキー、ワインといったデータは「好きな飲み物」の列にタテに入ることで、ピボットテーブルを使った分析が可能になります。

この横に並んでいるデータを縦にするのが「列のピボット解除」の機能です。すでにこの機能は以前の投稿で何度も紹介しています。クロス集計表・マトリクス表でデータが提供されてしまうことが多いExcel界隈では、本当にこの機能を知っている、この機能の使い方を熟知しているか、そうでないかで大きな違いがでると思います。

以下、その手順をおったアニメーションGIFです。
列ピボットの解除
ピボットテーブル レポート機能を使って集計する

ここまでデータの整形ができれば、あとはピボットテーブル レポートを使って集計が可能になります。

まずはビール、ウィスキー、ワインそれぞれがいくつ選ばれているかを集計します。もとのデータは1セルにカンマ区切りで入っていたデータを、列分割と列ピボット解除でテーブル形式にしたデータに整形し、ピボットテーブル レポートにします。

以下が、上記のアニメーションGIFの終わりの状態(クエリ エディターで列ピボット解除の状態)からピボットテーブル レポート作成までをアニメーションGIFにしたものです。
ピボットテーブル レポートの作成
あとは、ピボットテーブル レポートの機能を使ってクロス集計による分析が可能になります。地域毎や性別などで、どんな飲み物が選択されたか集計できます。アニメーションGIFの最後のほうではウィスキーを選んだデータのドリルダウンを行っています。ピボットテーブル レポートだからこそできる分析機能ですね。
ピボットテーブル レポートによる集計とドリルダウン
ここまで「一行も」関数を使った数式やVBAのコードを書いていません。

まとめると、データの取得と変換、Power Queryに代表される「ETL機能」を Excel で使うべき理由は、極端なことをいえば「ピボットテーブルで分析しやすいデータを作る」ことかもしれません。集計や分析でピボットテーブルを使いこなす人にとっては無くてはならないものです。

Power Query(取得と変換)とピボットテーブルはセットで覚えてしまうのをお勧めします。

皆さんの業務の参考になれば幸いです。
[追記] 列のピボット解除ではなく、列の分割の詳細オプションで行に展開した場合のアニメーションGIFが以下です。こちらのほうが簡単!
なお、このオプション名の「分割数」ですが、英語版は「Split into」で「分割先」です。このオプション、最初は分割先として列しかなく、最大数を指定していた記憶があり、途中で分割先として「行」が追加されたと思います。その名残りでしょう(要は更新し忘れているのでしょう)

列の分割の詳細オプションを使って、それぞれの行に展開する

[追記 2022/2] カンマで区切られた複数回答を複数行にして行を増やしたくない、以下のような結果がほしい、という参照記事を見かけました。上のやり方にもうちょっとだけ手を加えると自分の好きな集計結果にできるので追記します。

上記のサンプルを例にすると、以下のような表がほしいようです。
ビール   3
ウィスキー 4
ワイン   4

またはそこからビールを選んだ人だけの表
ビール Aさん
ビール Bさん
ビール Cさん

これは「集計結果の表」で、考え方としては本ブログでそれそれの行に展開したデータ(テーブル)をデーターソースとして、関数やフィルター機能などを使って集計するのですが、ピボットテーブルさえ覚えてしまえば、このような集計はあっという間にできます。
PowerQuery(取得と変換)でデータソースを整理して、集計はピボットテーブルで処理するのがモダン Excel の呼吸 壱の型みたいな鉄板だと思います。
以下ではデータソースとなるテーブルから「ピボットテーブル」を追加し、飲み物でまとめたレポートを作成します。そしてビールの行の数字をダブルクリックして、ビールを選んだ人の表を作成しています。

Power Query を使ってデータベースにある大量のデータを処理してレポート作成をする業務になればなるほど、Excel のセル関数を使う場面は少なくなり、データソースであるテーブルにフィルターをかけて「生データを眺める」こともデータ量が多いので現実やらなくなります。逆に SUMIFS 関数など知らなくてもいいので、ピボットテーブルさえできれば、集計は可能ですし、教育コスト(習得まで時間がかかる)が高いVBAを学ばなくても、必要な表をピボットテーブル上でダブルクリック(ドリルダウンと呼びます)で一瞬で作成できます。

暴論ですが、(元データが比較的整い、綺麗なデータを扱うことができる)ビジネスパーソンは関数やVBAをやらなくてもいいので、Power Query とピボットテーブルの機能をマスターすると、かなりデータ抽出、集計およびレポートの時短が可能になり、間違いも少なくなると思っています。

2018/03/04

[Excel 取得と変換] クロス集計表やピボットレポートをシンプルな表(テーブル)に変換する

何度かこのブログで紹介していますが、Excelの新機能(と、もう言えない?)の「取得と変換」は、これまでの「外部データの取り込み」を置き換えるだけではありません。

先日、ある方から相談を受けたのが、クロス集計表と呼ばれる表をデータ分析のためにクロス集計ではないシンプルな表形式データ(テーブル)に変換するものでした。その方は手作業でその変換をしていたのですが、テーブルのサイズが大きくなったり、繰り返しの作業になると手では無理、なんとか自動化できないか?というものでした。

これ、今は取得と変換のクエリエディターの「列ピボットの解除」を使えば、VBAを使わなくても変換ができます。

取得と変換のこの「クロス集計を解除する」言い換えれば「列ピボットを解除する」機能は、まだまだ認知が低いようです。Excelのテーブル機能と合わせて、取得と変換のクエリエディターは、業務でデータ分析をする人(もっと言えば、Excelを使ってレポートを作る人)にとって知っていて損はしない機能だと思います。また、PowerBIを使いこなすためのベースとなる知識のひとつです。

クロス集計表とは質問やデータのカテゴリを縦・横に「クロスさせて」数値を集計した表です。多くの人が意識しないでレポートの表を作ると、このクロス集計表になっていることが多く、Excel初級講座などでも、まずこのクロス集計表を作らせる演習が多いのも事実です。以下の表は、支店と製品のカテゴリを、月別の数値とクロスさせた表です。
クロス集計表の代表例 支店カテゴリ(縦)と月別の数値(横)をクロスさせた表
データ分析という観点からはツッコミどころが満載の表で、これを分析元のデータの表として作ってはいけないのですが、反面、数値を理解しやすい表なのです。この表はレポートとしての「最終形」と言えます。繰り返しになりますが、この表から別の分析をするといった作業には向かないのです。

分析のためのシンプルな表とは、縦・横のカテゴリでクロスしていない表で、以下のような表です。
シンプルな集計前の表形式のデータ
前置きはここまでにして、クロス集計表を「取得と変換」の「クエリエディター」の「列ピボットの解除」などの機能を使って、シンプルな表形式データに変換する手順をご紹介します。

以下は一連の作業を記録したアニメーションGIFです。
クロス集計表を取得と変換クエリエディターを使ってピボット解除する
以下、アニメーションGIF内の手順です。

1. クロス集計表をテーブルに変換する
リボン[挿入]のテーブルから変換できます。ショートカット Ctrl+T も使えます。
変換したいクロス集計表のセルを選択するだけで自動的に範囲が選択されます。
なお、集計行・集計列はいりません。アニメーションGIFでは、自動選択で集計行ははずれましたが、集計列を含んでテーブル変換したので、クエリエディターで集計列の削除をしています。

2. テーブルを指定してクエリエディターを立ち上げる
上記で作成したテーブルのいずれかのセルが選択されている状態(=アクティブセルをテーブル内のセルにする)にして、[データ]タブの「取得と変換」の [テーブルから] をクリックして、クエリエディターを立ち上げます。

クエリエディターはExcelとは別のウィンドウです。クエリエディターで指定した編集・操作の結果をExcelのワークシートに反映させることができます。元のデータを書き換えたりしないので安心してください。

3. 不要な列を削除する
集計列はいらないので「小計」の列を選択して、右クリックメニューの[削除]を使って列の削除をします。
このあたりの操作感はほぼExcelと一緒です。また、慣れてきたら要らない列を削除する方法から、必要な列を指定して残す方法も試してみて下さい。実際の業務では「必要な列だけを指定して残す」ほうが使い勝手が良いです。

4. 列ピボットを解除する
クロス集計表で慣れていると「何がダメなのかわからない」「どの列が列ピボットなのかわからない」と感じる人がいるようです。
仕方ありません。最初にExcelを習うときのサンプルの表はクロス集計表になりがちで、それは「罫線」のひき方、小計セルで使うSUM関数、さらには同じ値が連続したセルの結合方法(最悪・・・)を教えるには最適な表だからです。

Accessなどのデータベース製品を勉強した人にとっては、テーブルや表のことを言っているので理解しやすいと思いますが、Excelは上記のような教え方をされるため、ここの理解が第一関門かもしれません。このあたりは別途「テーブル」や「フィールド」、「レコード」といったキーワードで勉強してみてください。テーブルにおいては、1月、2月、3月、、、は月が「横に並ぶ」、東京、大阪、名古屋など地域や都市が「横に並ぶ」、製品A、製品B、製品Cなど同じ性質で種類の違うものが「横に並ぶ」ことはありません。それらは「月」や「地域」や「製品」の列にして扱います。

そうすると同じような行が増えるから「見づらい」という人もいますが、その感覚正しいです。そこから見やすく集計するから大丈夫です。また、何度も繰り返し同じ値のセルが続くからといって「結合セル」は使わないでください。(ワークシートでテーブルに変換済みだと結合セルは使えなくなりますが。)

サンプルのアニメーションGIFでは、「支店」と「製品」の列は列ピボットではなく、「1月」「2月」「3月」の列だけが列ピボットです。これらをまとめて「月」の列にしたいので、「1月」から「3月」の列を選択して、「列ピボットの解除」を行っています。解除した列は「属性」になっていますが、後で「月」などの名前(フィールド名)に変更可能です。

5. 空欄に値を埋める
列ピボット解除によって、元の行の直後に新しい行が追加されます。その時の空欄のセルに何を入れるかを指定します。アニメーションGIFの例では「支店」の列(フィールド)に空欄ができてしまいました。このような場合、「下方向にフィルする」を使って空欄に必要なデータを入れることができます。

6. ワークシートに結果を戻す
ここまでの操作は「クエリエディター」ウィンドウでの操作です。この結果をワークシートに戻すために、クエリエディターウィンドウの[ファイル]タブの[閉じて読み込む]や[閉じて次に読み込む]を使って、ワークシートに結果を戻します。

これでクロス集計表を表形式のテーブルに変換することができます。

このクエリエディターで行った操作は、ブックに保存されます。ブックに保存されているクエリは後から編集することも可能で、なおかつデータの「更新」によって最新の状態にすることができます。取得と変換の最大の強みは、元のデータを柔軟に指定できること(Excelは元より、他のcsvファイル、SharePointやFacebook、他のデータベースなどなど)、元データを変更せずにクエリエディター内で編集・加工すること、その手順をクエリとしてブック内に保存できること、そしてデータの更新を使ってクエリの結果を最新にできること、です。

この機能は覚えていて損はしません。この取得と変換のピボット解除の機能を知らないと、強引に手作業と機能で処理するか、この機能を知らないExcel上級者からVBAでやるしかないね、といったアドバイスを受けることになります。モダンエクセルで本当に知ってほしい機能のひとつです。(しつこいですが、あとはExcelのテーブル機能です。)
https://road2cloudoffice.blogspot.jp/2014/10/vlookup.html

2017/06/15

[Excel] Excel で JSON データを読み込む

この前の投稿でご紹介したように、Power Query が「データの取得と変換」となって Excel の標準機能となり、様々なデータの取り扱いが可能になりました。(2017年6月現在、Office 365 サブスクリプションの 最新の Excel が機能拡張の対象となります)

データの取得と変換である Power Query は、アドイン単体としての機能追加、さらに Power BI Desktop の登場によって、Power BI Desktop の ETL 機能 (Extract, Transform, Load)として拡張が行われてきました。Power Query は、Excel そして Power BI Desktop のデータの取り込み、変換・加工、ロードを受けもつ ETL 機能として今も進化し続けています。

JSON 形式のデータをプログラミングなしで取り込む

この進化し続ける「データの取得と変換」機能で、すぐにでも使ってほしいのが CSV データの取り込み機能ですが、人によっては JSON 形式データの取り込みのほうを重宝するかもしれません。

というのも、JSON 形式のデータ取り込みは、以前からも Power Query を使ってできていたのですが、現在は空のクエリから詳細エディターを開いて Power Query 関数を手で記述することなく、クエリ エディターのクリック操作のみで取り込みが可能になったからです。

また、JSON形式のデータを表形式に変換してワークシート上に読み込むためには、VBAを使う方法がこれまで多く紹介されていましたが、VBAでプログラムすることなく、JSON形式のデータをワークシートに展開することができるようになりました。

Web から JSON でデータを取り込む

実際のところ、JSON形式のデータによるテキスト ファイルをフォルダーから読み込むよりも、Web 上での検索条件設定の結果で、JSON形式のデータが表示されることが多いと思います。

サンプルとして、IT勉強会の告知・募集でお世話になることが多い connpass さんの API を使ってみたいと思います。

https://connpass.com/


connpass さんは、イベントサーチ API を提供していて、検索クエリの条件に応じた一覧を JSON 形式のデータとして取得することができます。

connpass API リファレンス

Web API や REST API でデータ提供サービスをしています、という場合、上記のような API リファレンスのページが必ずありますので、探してみてください。

たとえば "BI" というキーワードでイベントを検索するための URL は以下のようになります。

https://connpass.com/api/v1/event/?keyword=bi

この URL で、以下のような JSON 形式のデータによるレスポンスがブラウザに表示されます。


このデータを、Excel のワークシートに展開できるように2次元の表形式に「変換」して、私たちが読めるようにデータを加工することが、データの取得と変換のクエリ エディターだけでできます。上述のように VBA などでプログラミングをすること無しに可能です。

シンプルなデータの取り込み手順

JSON データの取り込みには2つの方法があります。ファイルから取り込む方法と、Web から取り込む方法です。ファイルから取り込む方法を使っても URL を指定することで Web からの取り込みが可能ですが、今回は「Web から」を使ってみます。


「Web から」のデータ取得は、これまでの Web クエリよりも高機能になっています。HTML ページの table だけではなく、今回のように JSON にも対応しているのです。

connpass の Web API 利用はサインインする必要がありません。以下のダイアログで "PowerBI" キーワードを含むイベントを検索する URL を入力し、OKをクリックします。(上記 JSON サンプルのキーワード "bi" の検索結果の数が多かったので、キーワードを PowerBI に変更しています。注意してください。)


接続が完了するとクエリ エディター ウィンドウが立ち上がり、以下の画面が表示されます。


注意点は、ここでファイルのアイコンの [connpass.com] をダブルクリックしてはいけません。アイコン上でマウスオーバーすると「開くにはダブルクリックします」というツールチップが表示されますが、ダブルクリックすると、現時点ではテキストファイルとして処理されてしまいます。リボンの [変換] タブの [形式を指定して開く] から [JSON] を選んでください



Json 形式で開くと以下のデータが表示されます。


results_returned、events、results_start、results_available の意味は、上述の API リファレンスに解説がありますので、詳細については後で参照してほしいのですが、情報から「指定した(PowerBI)キーワードの検索結果の総数は 19 件で、このファイル(データ)に含まれるのは 10 件、検索開始位置は 1 件目からですよ」という意味です。

あらかじめだいたいの件数がわかっている、もしくは取得する件数に上限を付けることができるのであれば、取得件数を 20 件に指定して全件を一気に取得することができます。PowerBI のサンプルは件数が少ないので、以下の検索条件にしてみます。

条件を変更(URLの変更)のため、クエリの設定の [適用したステップ] の [ソース] の横にある歯車マークをクリックします。


ダイアログの URL を変更します。取り込む件数の上限を 20 とするパラメーターの &count=20 を追記した URL です。


[OK] を押すと、results_returned が 19 に更新されます。


今回は例をシンプルにするために、検索結果で全件を取り込むパラメータを追加しました。また、匿名アクセスで利用が可能なので、認証に関する設定はありません。これらへの設定・対応はもちろん可能です。あらためて別の機会にご紹介したいと思います。

今、この状態は、検索したいキーワードを設定した URL をサーバーに送り、その結果を JSON 形式のデータとして Web 経由で 19 件取得しています。
この表示されているリストの events の List のリンクに、JSON 形式で 19件の検索結果の格納されています。
List のリンクをクリックすると、以下のように List リンク内のリストが 19件のデータとして展開されます。


Record のリンクをクリックすると、クリックした1件分だけの内容を確認することができますが、今回はすべての Record(勉強会)の詳細を一気に展開したいので、ここでリボンにある [テーブルへの変換] をクリックして、19件のレコードを含むリストを、テーブル(表)形式に変換します。すでに1件1レコードとして認識されているので、テーブルへの変換のダイアログのオプションはそのままで、[OK] ボタンをクリックします。


リストだったデータがテーブル形式になりました。


ここで Record リンクをクリックすると1件分のみの展開をしますが、テーブル形式に変換したことによる「列名」の Column1 の横にある [展開] ボタンを押すと、Record に含まれるデータをテーブル形式1件分のデータのみなした場合の列名の一覧が表示されます。ここで取り出す列を絞り込むこともできます。今回はすべての列を選択し、かつ、列名が長くなるので、[元の列名をプレフィックスとして使用します] のチェックをはずして、[OK] ボタンをクリックします。


JSON形式の元データを、21列19行のテーブル形式のデータに変換することができました。クエリ エディターの操作のみで1行もコードを書かずにここまでできました。


テーブル形式になったデータを Excel 向けに加工する

今回は Excel の「データの取得と変換」を使って connpass から検索結果を JSON 形式のデータで取得しました。その後、ここまでの処理・操作で、データはテーブル形式になりました。それぞれの列名がどのような意味なのか、connpass の API リファレンスのレスポンス フィールドで確認することが可能です。

ここで、必要な列や行のみを残す、といった加工が可能です。ここからの処理は、JSON だから特別、というものはなく、普通のテーブル形式のデータのフィルター オプションを操作する感覚でできるのは、クエリ エディターを使ったことがあれば理解できるでしょう。まだ慣れていない方は Power Query によるデータの加工や絞り込みについて、もう少しだけ情報収集するといいでしょう。

この connpass のデータや、特にサーバーからデータを取得した際に、Excel ユーザーが一瞬「おや?」と思うのは、日付データの扱いです。この日付データのトピックだけで結構長いお話になってしまうので、ここで詳細は割愛しますが、1つだけ意識してほしいのは、サーバーの日付形式のデータは、そのまま Excel で扱うことができない場合がある、ということです。


上記はデータ変換をせずにテーブル形式に変換したJSONデータをワークシートに読み込み、列名 started_at の1行目のセルの書式を表示したものです。2017-05-20T13:00:00+09:00 は勉強会・イベントの開始日のデータですが、Excel は単なる文字列として認識し、日付として扱っていません。
多くの場合、Excel は日付「らしい」文字列のセルへの入力があると、日付データの「シリアル値」に変換し、表示形式によって人間が日付と認識できるデータに見た目上変換します。残念ながら、2017-05-20T13:00:00+09:00 という ISO-8061 形式の文字列は Excel によって日付データと認識されなかった、となります。このままではシリアル値として扱っていないため、日付関連の関数の利用や演算ができません。

そのため、クエリ エディターで Excel が日付として認識できるように加工します。
データをワークシートに読み込む前の、クエリ エディター上で、対象となる日付のデータの started_at の列データを変換します。
started_at の列名をクリックし列を選択した状態で [変換] タブの [データ型の検出] を使ってもいいですし、この日付データ型は [日付/時刻/タイムゾーン] と呼ばれるものなので、列名横のデータ型のボタンを押して、明示的に選択することで変換可能です。[ABC 123] のアイコンが地球儀と時計のアイコンに変わります。


この変換ステップを行うことで、[日付/時刻] に変換できるようになります。[日付/時刻/タイムゾーン] に一度変換しないで、いきなり [日付/時刻] を選択すると Error になるので注意してください。データ型ボタンで [日付/時刻] を選ぶと、列タイプの変更 ダイアログが表示されるので、[新規手順の追加] を選んでください。[現在のものを置換] はタイムゾーン付きのデータに変換したステップを置き換えてしまうのでエラーになります。


このように日付データを変換して Excel のワークシートに読み込むことで、シリアル値として扱うことができます。

日本語データも特に問題なく扱うことができています。イベント(勉強会)の概要データの description は HTMLタグを含むテキストデータとして取り込まれています。ここからまた何らかの判断をしたい場合は、クエリ エディターの詳細エディター上で M 言語を使ってやってもいいですし、ワークシートに取り込んだ後で、関数や VBA を使ってもいいでしょう。


実際は考慮すべき点がいっぱい

今回は JSON 形式のデータでも、取得と変換のクエリ エディターを使うことで、プログラミングすること無しに Excel ワークシートに取り込むことができることを紹介するのが目的でした。しかし、それ以外のところで考慮すべきことが出てくるのが実際でしょう。

たとえば、取得する件数。サービスによっては上限が決まっていて、それ以上のデータの取得は、今回のような件数の指定のほかに、ページ数指定や、オフセット指定を使うことが推奨されます。
Power Query / 取得と変換のクエリ エディターで、詳細エディターを使ってこれらへの対応が可能です。ページ数やオフセットの「繰り返し」の処理は、URLを組み立てる一連のステップを「関数化」して、ページ数やオフセットを引数として渡す、という方法を使います。

この件数の上限への対応は結構「頭の体操」的なアイディアが必要になります。場合によっては CData さんの ODBC ドライバーを使うと幸せになれることがあります。
サイボウズの kintone の API も1回のリクエストあたりのデータ取得件数の上限がありますが、CData さんのドライバーを使うことで、その上限を気にせずにデータの取得が可能になります。

CData ODBC ドライバー一覧
https://www.cdata.com/jp/download/?f=odbc

Power Query/Excel 取得と変換/Power BI Desktop も標準機能としてさまざまなデータソースに対応していますが、CDataさんのような専業メーカーさんの ODBC ドライバーを試してみると、意外な発見や、解決策を見つけることができるかもしれません。

また、匿名アクセスではなく、ユーザー名+パスワード、アプリケーション登録による Web キーの利用など、サービスによって認証の方法はさまざまです。
connpass と同じくらい IT 勉強会の告知・募集・管理ツールで人気がある Doorkeeper の場合は、検索の URL の送信と一緒に Header データに認証情報を入れる必要があります。connpass は「Web から」の「基本」を使いましたが、Doorkeeper は「詳細設定」を使って、Header に認証情報をセットして、検索リクエストを送信する必要があります。Doorkeeper の API の解説には、Power BI Desktop や Excel クエリ エディターの具体的な設定方法や手順はないので、苦労するポイントでしょう。

登録して、Public API Access Token を取得
HTTP要求ヘッダーに Bearer を使ってトークンを追加
正直いうと、Doorkeeper API で Authorization Bearer に行きつくまで結構な時間がかかりました。

長くなりましたが、Excel のデータの取得と変換という新しい外部データ取り込みの仕組みを使うことで様々なデータソースへ接続し、様々なデータ形式のデータを扱うことができます。まだまだ進化中ですが、その方向はなるべくコーディングさせない方向で、JSON形式のデータであっても、コーディングなしでテーブル形式に展開して、ワークシートに取り込むことが可能です。

食わず嫌いせずに、この新しい機能をぜひ使ってみてください。

[追記] 最後まで読んでいただいてありがとうございます。取得と変換の機能の一つの「ピボットの解除」もJSON処理同様これまでVBAでなければできないと言われていた処理です。こちらもおすすめ機能なので是非使ってみてください。
https://road2cloudoffice.blogspot.jp/2018/03/blog-post.html

[追記] REST APIで取れないデータをWebページスクレイピングでとる方法を追加しました。
https://road2cloudoffice.blogspot.com/2020/05/excel-web.html
Powered by Blogger.

自己紹介

自分の写真
1989年新卒で日本IBMに入社しダウンサイジング担当としてホストコンピュータと繋げるオフコン、UNIX、PCサーバーのプロジェクトを担当。1997年 MSKK(現日本マイクロソフト)入社、NT4出荷に伴い企業向けサポート部門のビジネスマネージャーとして Excel 使いとなり、2002年 にMSMVPなどをサポートするユーザーコミュ二ティ部門を設立、部門をリード。2006年にMSKK退職後、企業向けのITトレーニング会社・団体に携わり、2014年頃よりPowerBI勉強会主催メンバーの一人として参画、そのコミュニティ活動で MSMVP for Data Platform PowerBI 2017受賞。https://mvp.microsoft.com/ja-jp/PublicProfile/5002635 同年にMVP Awardを返上し、アマゾン ウェブ サービス ジャパンに入社、コミュニティプログラム担当として現在に至る。