ラベル 日付 の投稿を表示しています。 すべての投稿を表示
ラベル 日付 の投稿を表示しています。 すべての投稿を表示

2016/10/25

[ピボットテーブル] 日付 時刻 の自動グループ化を無効にする

過去に何度か取り上げているこの話題ですが、いつの間にか Excel 2016 のオプションで、この日付/時刻列の自動グループ化のオフ/オンの設定が可能になっていました。


以前は、グループ化された直後に Ctrl+Z で解除をしていました。

https://road2cloudoffice.blogspot.jp/2016/04/excel-2016.html

または、レジストリでオフにする方法が紹介されていました。

ピボットテーブルで時間グループ化をオフにする

Excel 以外のデータソースに接続して、データモデル経由でピボットテーブルを利用する場合は必要な機能ですが、ワークシートだけの利用だと、ちょっと使いづらく、やはりコンテキストメニューからのグループ化のほうが使いやすいんですよね。

2016/04/30

Excel 2016 のピボットテーブルの自動時刻グループ化機能のグループ化を解除する

Excel 2016 の追加更新機能で Automatic Time Grouping (時刻のグループ化) 機能があります。

日付データをピボットテーブルのフィールドリストにあるレイアウトセクションの列や行にドロップすると、年・四半期・月に最初からグループ化してくれる機能です。

それまでは、ピボットテーブルの行や列のラベルフィールド上で、右クリックメニュー(コンテキストメニュー)から [グループ化] を選んで、年や月でグループ化していました。

日付の場合は、この操作なしにグループ化されるようになりました。

とはいえ、会計年度が1月~12月でない場合が多い日本の場合は、四半期のグルーピングが邪魔ではないでしょうか。実践ワークシート協会の会計年度は10月~9月なので、一般的に多い4月~3月ではないのですが、それにしても第1四半期は1月~3月ではありません。

ということで、この四半期のグループ化を外すことが多いのですが、これまで、自動的にグループ化され作成されたフィールドをレイアウトセクションから外す、という作業をするか、ラベルフィールド上のコンテキストメニューで [グループ解除] を選択していました。


この解除作業、上記の手順ではなく、日付フィールドをピボットテーブルに配置して自動時刻のグループ化された直後に Ctrl + Z で解除されることを知りませんでした・・・

以下は配置直後に Ctrl+Z をしています。


操作直後の Ctrl + Z で解除って、他にもあります。

ハイパーリンクです。

メールアドレスが多いでしょう。もちろん、URLのハイパーリンクも、入力直後の Ctrl+Z で解除されます。

ハイパーリンクはオートコレクトのオプション設定で「オフ」にすることができます。


では、時刻のグループ化をオフにするオプションがあるか調べたところ、Excelのオプションにはオン・オフをする項目はありませんでした。

どうしてもオフにしたい、という場合はレジストリの変更となります。(今の時代にそれですか!)

Windows版Excel 2016のピボットテーブルで時間グループ化をオフにする
https://support.office.com/ja-jp/article/6be5afed-348c-4db2-9f87-5ac262d67b3f

2016/10追記 さすがに Excel のオプションでオフにできるようになりました。


以上、Excel 2016で追加されたピボットテーブルの時間グループ化/時刻のグループ化機能の話題でした。

2016/01/12

曜日と表示形式とTEXT関数とFormat関数

実践ワークシート協会主催の Excel VBA セミナーでは、講師の田中先生が毎回必ず聞く質問がいくつかありますが、そのうちの一つが「曜日を表す表示形式」に関連する内容です。

Excel VBA セミナー ベーシック
http://officetanaka.net/seminar/seminar1.htm

なぜ VBA セミナーで表示形式?と思われるかもしれませんが、VBA プログラミングにおいて、日付=シリアル値から曜日を知るためには、曜日を返す専用の関数はなく、表示形式を利用して曜日を判定しなくてはならないからです。その関数が Format 関数です。

Format関数 (Excel VBA の関数)
http://officetanaka.net/excel/vba/function/Format.htm

この Format 関数はワークシート関数の TEXT 関数とほぼ同じ動きをします。

TEXT関数 (Excel ワークシート関数)
http://officetanaka.net/excel/function/function/text.htm

そして、このFormat関数やTEXT関数を使う上で知っておかなければならない知識が「書式記号」です。

曜日の鉄板ネタとして、書式記号の a を使って、aaa や aaaa で日本語での曜日をシリアル値から表示できます。ddd や dddd を使えば英語での曜日をシリアル値から調べることができます。

曜日を表示する
http://officetanaka.net/excel/function/tips/tips38.htm

曜日の表示で WEEKDAY関数と CHOOSE関数を使った数式を見ることがありますが、TEXT関数が一番簡単だと思います。ただし、aaa といった書式記号を覚えていなくてはなりません。

この書式記号、書式設定のユーザー定義書式でも使います。
セルを選択して Ctrl+1 でセルの書式設定ダイアログボックスが表示され、表示形式で書式記号を使って、セルに入力された表示方法を制御します。



セル内に入力されたデータがシリアル値になっていれば、このように曜日を調べることが可能です。シリアル値はExcelが内部で持っている万年カレンダーのようなもので、曜日のみならず、うるう年も管理しているので、うるう年の計算をしてチェックするような必要はありません。

Office TANAKA サイトも上記のURLページ以外にも多くの表示形式の記事があります。それだけ、表示形式や書式記号は深い、と言えるでしょう。

さて、冒頭に田中先生が表示形式についてかならず質問する、と書きましたが、この表示形式・書式記号の aaa を知っている人が年々「減って」きています。Excel 鉄板ネタの一つなのですが、本当にこれを知っている人が減っているのです。

あらためて、きっちりと伝えるべき技術は定番として伝え続けなければならないんだ、と感じる1件です。

ちなみに Power Query で日付から曜日を判定するには、WEEKDAY関数と似たような動きをする Date.DayOfWeek がヘルプの数式カテゴリから見つかりますが、ワークシート関数同様に TEXT 関数に相当するメソッドを使ったほうがよさそうです。Date.ToText で "ddd" で書式設定して日本語の曜日を表示させることが可能です。



Date.ToText のヘルプ
(Power Query が機械翻訳で電源のクエリになっているのはご愛嬌)

なお、この曜日については SharePoint のリストでも同様の動きと扱いをすることができます。これもチェックですね。

ExcelユーザーのためのSharePointリスト「集計値」列

2015/03/20

Excel Preview (Office 2016 Preview for Business - Excel 2016)

Office 2016 Preview (for Business) の公開およびダウンロードが開始された。

CNET|Japan
マイクロソフト、「Office 2016」とビジネス向け「Skype」のプレビュー版をリリース

現段階の Excel では以下の変更点がトピックだろう(Preview 版であるため、今後変更が加わる可能性はまだ多いにある)
なお、この Preview 版はいわゆる「Office 365 ProPlus」であり、Office 365 ユーザーが利用できる Office であることに注意されたい。特に Power BI 系についてはエディションにより使える機能が変わる。2016 でもその制限が継承される可能性が高いかもしれないからだ。

[追記] Power Query のシステム前提条件が v2.22 以降かわりました。こちらを参照ください[追記おわり]

[データ] タブに統合された Power Query

現バージョンまでは Power Query はマイクロソフト ダウンロード サイトからダウンロードするアドインの扱いだが、2016 からは [データ] タブに統合されている。
アドインからもなくなり、Excel に完全に統合された形になっている。

2016PowerQueryRibbon

xl2016A

xl2016B

xl2016C

xl2016D

なお、Power Pivot や Power View は現時点でのプレビューではアドイン扱いで、Excel 2013 と大きな違いはなさそうだ。

xl2016E

ただし、オプションの [詳細設定] – [データ] に「データ分析機能をオンにする」というチェックボックスが追加されており、このチェックボックスで Power Pivot のリボンのタブの表示・非表示が可能になっている。

xl2016F

データモデルでもピボットテーブルの 日付のグループ化 が可能に

このタイミングで、この機能が利用可能になったのは、相当ユーザーからの要望が多かったのか、最初から計画されていて技術的目処がついたのか、いずれにせよ Excel ユーザーにとっては非常にうれしい機能追加である。

以前の投稿の「リレーションシップとデータモデル」で、データモデルから作成されたピボットテーブルでは「日付のグループ化」や「集計アイテム」、「集計フィールド」が使えないことを紹介したが、集計アイテムや集計フィールドは Power Pivot と使うことで代用が可能であるが、日付のグループ化は Excel でありながら日付=シリアル値の操作性とは全く異なるため違和感(というか、使いづらい。。。)を感じていた。

リレーションシップを張ったテーブルをピボットテーブルにして、日付のグループ化はもちろん、SharePoint データ接続でデータモデルから直接ピボットテーブルを作成しても日付のグループ化が可能であることは確認できた。SharePoint リストは日付をシリアル値として持っているので、DateTime 型の SharePoint Access アプリ テーブル(SQL Azure テーブル)からデータ接続でピボットテーブルを作成し試してみたが、同様に日付のグループ化は可能だった。今後は「階層」を使わずグループ化ができるのは大きなメリットであろう。

xl2016G

この数日触ってみた感じでは 2013 と 2016 では大きな違いは見当たらない。What’s New を見ても現時点では Excel においては違いはあまりないと言ってよさそうだ。

What’s new in Office 2016 Preview (office online 英語)

ただ、やはり BI まわりの機能強化が多い。

英語ブログであるが、以下は Excel に関する新しい機能を紹介しているので、参照されたい。

Chris Webb’s BI Blog – What’s New The Excel 2016 Preview For BI?

ユーザーが利用するデスクトップ版については、正直のところあまり大きな変化がないのかもしれない。
Office 2016 についてはタッチ版ユニバーサル アプリである Office for Windows 10 のほうが今後話題になることが多いだろう。

Office for Windows 10 と Office 2016 の発表(2015/1/23)

2015/01/27

Power Query を使って絞り込んだデータを取得する - 日付編

SharePoint リストなどからデータを取得し、Excel で加工、集計をする場合、おおよそ全件データを取得し Excel のテーブルにデータを展開してから、ピボットテーブルを使ったり、ワークシート関数を使うことが多いと思う。現在 Excel は百万行を超えるレコード(行)を扱うことができるため、実務上はほぼ問題ないが、場合によっては、絞り込んだデータのみを扱いたいときがある。

過去のデータは一切関係なく、たとえばセミナー申込みの管理などで今日(または指定日)以降に実施される予定コースの登録者アイテムのみが欲しい、といったケースだ。後工程でデータの加工、集計をするのだが、そこで絞り込みを行うのではなく、必要なデータ「だけ」がテーブルに存在していたほうが都合がよい場合だ。

SharePoint リスト接続は全件データをテーブルもしくはピボットキャッシュに取り込む。Office データ接続は上記に加えてデータ モデルに全件データを読み込んでから、Excel 側での処理が行われる。

OLE DB クエリ接続もしくはモデル OLE DB クエリ接続の Power Query の場合も、基本的には全件データを Power Query に取り込んでいる。しかし、Power Query の場合は、Power Query エディターを使って、データの絞り込みや、並べ替え、カスタム列の追加を行ってから Excel に渡すことができる。

(注) SharePoint リスト接続、Office データ接続、OLE DB クエリ接続、モデル OLE DB クエリ接続については、こちらの投稿を参考にしていただきたい。

Power Query のクエリ エディターの画面で絞り込みを行っているところ
絞り込んだデータをどうしても欲しい場合は、Office データ接続によるデータ取得ではなく、Power Query を使わざるを得ない。2015年1月の段階では、Power Query のモデル OLE DB クエリ接続は Excel Online でのデータ更新ができない制限があるが、この制限の実務上の問題がなければ、Power Query を使うことになる。

日付による絞り込み

絞り込みの条件はさまざまあるが、今回は上述のように「日付」に注目して、その絞り込み方法を紹介したい。
とはいえ、Excel ユーザーのとっては有難いことに、Excel のオートフィルターを使った絞り込みと同等の操作を行うことで実現が可能だ。

Power Query エディターの「日付/時刻フィルター」
Excel オートフィルターの「日付フィルター」
Power Query の場合、このオプションに加えて関数を使って指定することが可能なのが特徴だろう。特に「今日」より~ という指定が可能なことだ。

Excelのオートフィルターでも今日より後、といった「今日」という指定は可能だ。
しかし、この「今日」のボタンを押すと、「2015/1/25」といった今日の文字の値が入力される。Excel のオートフィルターという使い方では問題ないが、データ接続のデータ更新により SharePoint リストなどのデータ ソースからデータを抽出する場合は「今日」は「その日」でなければ困る場合が多い。
Power Query エディターの日付/時刻フィルターの「今日」や「明日」の扱いは、Excel のオートフィルターとは異なる。
「今日」を指定しても Excel のように日時を指定するのではなく、Data.IsInCurrentDay([実施日]) という関数を使って配列(複数件データ)を取得して、それをテーブルに展開するのだ。

Power Query エディターの日付/時刻フィルター オプションの「今日」
「今日」を指定したときの式
この指定であれば、データ更新をすると「その日」のデータを持ってくることができる。

関数を使った指定

上図のように、Power Query エディターで絞り込みなどをすると、その操作はすべて「式」として記録さている。

たとえば、「今日より以降(後)のデータ」を指定するときは、オプションのダイアログから「次の値より後...」で「今日」を入力することができない。
Power Query 行のフィルター選択
 ここで日を指定すると数式は以下のようになる。

今日よりも後を指定したいのであれば、赤い線の部分が「今日」になればよい。
ワークシート関数の Today() や Now() に相当するものが入ればよさそうなことは想像に難くない。
それが、DateTime.LocalNow() 関数だ。

実際に数式を直接書き換えてみた結果が以下だ。
ダイアログからは DateTime.LocalNow() 関数はバリデーションチェックによって入力ができないが、数式バー(のようなもの)では直接入力、修正が可能なのだ。

シリアル値ではない日付形式

Excel における日付や時間(時刻)の扱いは「シリアル値」を使っている。Excel ではないプラットフォームではシリアル値が使われていないため、日付・時間の扱いには注意が必要になることが多い。

Power Query では「DateTime」型が基本である。 DateTime 型は Date 型と Time 型から成り立っている。たとえば既出の DateTime.LocalNow() は DateTime 型を返す。

DateTime.LocalNow()  ->  2015/01/07 11:47:45

ここから日付だけを抜き出したい場合は、Date プロパティを参照する。

DateTime.Date(DateTime.LocalNow())  -> 2015/01/07

時間だけを抜き出したい場合は、Time プロパティを参照する。

DateTime.Time(DateTime.LocalNow())  -> 11:47:45

年や月や日を抜き出す場合、ちょっとしたテクニックが必要になる。
DateTime 型に含まれる Date 型からプロパティ参照する。そして、Year や Monty、Day プロパティを参照すると、その戻り値は「数値」になる。

Date.Year([申込日])  -> 2015
Date.Month([申込日])  -> 1
Date.Day([申込])  -> 7

ゼロパディングしたい場合、1月は 01、7日は 07 の場合はテキストに置き換える必要がある。戻り値は「数値」なので、以下のようにする。

Number.ToText(Date.Day([申込]), "00")  -> 07

もちろん、12 や24 の場合も問題ない。

ならば、DateTime から ToText を使えばよさそうだと思うだろう。
しかし、en-us, ja-jp などのカルチャが関係しそうな記述がヘルプにあるのだが、 フォーマットオプションについては期待する動きを見つけられていないので注意されたい。(現状、私は使用していない)

DateTime.ToText([日付], "yyyy")  -> 2015 (文字列)
DateTime.ToText([日付], "yy")  -> 15 (文字列)

DateTime.ToText([日付], "d")  -> 2015/01/07 (文字列)


最後にシリアル値であれば 1 をプラスすることで1日後となるが、DateTime の場合は、AddDays メソッドを使う。

Date.AddDays([申込日], 2)  ->  2015/1/9 (申込日が 2015/1/7の場合)
Date.AddDays([申込日], -30)  ->  2014/12/8 (申込日が 2015/1/7の場合)

Power Query で利用できる関数は以下のページにある。解説が親切ではないので、いろいろと試して確認するのがいいだろう。

Power Query fomula categories
https://weu-odcsup.office.com/en-SG/article/Power-Query-formula-categories-125024ec-873c-47b9-bdfd-b437f8716819

2014/11/16

PowerPivot で日付のグループ化

PowerPivot は強力な Excel のアドインであることは以前に紹介した。


ここで紹介したのが PowerPivot はデータモデルを採用しているため、これまでの Pivot テーブルの機能で使えていたものが使えなくなる、その代表が「グループ化」と「集計フィールド、集計アイテム」の追加だ。

コンテキストメニューのグループ化がグレイアウトされ選択できない状態

集計フィールド、集計アイテムがグレイアウトされ選択できない状態

特に日付のグループ化はデータを分析するためには必須である。この対応方法を今回は紹介する。なお、そもそも PowerPivot はマイクロソフト社の SQL Server のデータを Excel で分析するためのアドインとして開発された。そのため、Office や Excel から PowerPivot のテクニックを探すのは正直まだ情報が多いとは言えない。そのため、情報サイトなどで Excel を駆使して代替案を提示している場合が多いのだが、PowerPivot の機能として参照・検索するのであれば、SQL Server 側からの情報として探すと見つかる場合が多い。

日付のグループ化は「階層」を使う

(注) Excel 2016 の Power Query (取得と変換) は、自動グループ化機能が実装されました。

Excel はシリアル値というすばらしい仕組みを内蔵しているため、こと日付に関する処理・操作は非常に簡単に複雑なことができるようになっている。Excel の Pivot テーブルで日付をグループ化する機能などはシリアル値の恩恵を受けている。

一方、シリアル値を持たない通常のシステム、サーバーで日付を扱うには「年」や「月」といったデータを日付形式のデータから抜き出してレコードの別フィールドとして持たせる必要がある。Excel から見れば非常に面倒な処理をしているように思えるが、これは仕方ないとあきらめるしかない。

同様にデータモデルである PowerPivot では日付形式のデータから「年」や「月」を抜き出す必要が出てくる。

[PowerPivot] タブから [管理 データモデル] をクリックして、PowerPivot ウィンドウを開く。
そうするとそのブックに含まれているデータモデルを参照することができるので、該当するテーブルをデータシートビューで開く。


このデータモデルには「日付」があるので、このフィールドから「年」と「月」の列を新たに追加する。PowerPivot の場合はなるべく Excel ユーザーにも使いやすいように Excel に似た UI と関数が用意されている。(ただし、Excel の関数ではない。この PowerPivot で使う Excel のワークシート関数に似た関数を DAX 関数と呼ぶ。)

YEAR関数を使って年を抜き出す。データシートビューはワークシートではないので、関数の入力は直接セル(のようなもの)にできない。関数入力ボックスから行う必要があるので注意されたい。


MONTH関数を使って月を抜き出す。


列名は上書きで変更できるので、年、月とする。
次にこの「年」と「月」を使って、「年月」の階層を作成する。

データシートビューからダイアグラムビューに切り替える。
データモデルにある「年」で右クリックでコンテキストメニューを開き、「階層の作成」を選ぶ。


階層が作成されるので名前を「年月」にする。


「月」をドラッグして「年月」の「年(年)」の下にドロップする。


これで「年月」の階層が作られた。

これで PowerPivot ウィンドウから Pivot テープルを作ると、サンプルとして使った個人売上テーブルに「年月」フィールドが別の枠として追加されているのがわかる。


この「年月」の階層を使えば、日付のグループ化、グルーピングと同じことができるようになる。

以下がその操作だ。



まずは、PowerPivot の使い方などの情報は SQL Server の自習書としてマイクロソフトが公開しているので、本家の情報に目を通していただきたい。

SQL Server 2012 自習書シリーズ
PowerPivot for Excel によるセルフ サービス分析

MSDN PowerPivot for Excel チュートリアル
http://msdn.microsoft.com/ja-jp/library/gg413497(v=sql.110).aspx
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を返上し、アマゾン ウェブ サービス ジャパンに入社、コミュニティプログラム担当として現在に至る。