[[20190305103635]] 『グラフをズーム&スクロールしたい』(通りすがりのおっさん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『グラフをズーム&スクロールしたい』(通りすがりのおっさん)

シートには多くのデータがあります。
行は時刻毎の情報で列にはカテゴリ毎の情報が数値で記載されています。
(1行目はタイトル行)

たとえば
    A    B   C  ・・・
1    時刻  Cate1 Cate2
2   10:10  200  1190
3   10:12  221  8872
4   11:00  987   12
5   11:30  121   85



行数列数はデータ取得時に依存しておりますが。シートに収まる範囲です。
列数は多くても100くらいまでです。

このデータを散布図を使ってトレンドグラフを作りたい。
データ点数が多いので処理が重いのは仕方ありませんが、
フリーズしない程度に。

ここでトレンドグラフに期待する事があります。
1、任意のカテゴリで抽出したグラフにしたい
2、複数のカテゴリを同一のグラフ上に描画したい
3、X軸のズームをして特定区間だけ詳細に見たい(マウスぐりぐりまたはスクロールバーにて)
4、X軸をスクロールしてトレンドグラフを動かしたい(マウスぐりぐりまたはスクロールバーにて)

実際に試してみました。
1、2はピボットテーブルで実現できました。
あとはピボットテーブルを自動で生成するマクロの作成ですが
なんとかなりそうです(未着手ですが。)

3,4はセル関数を用いて実現してみましたが、
どちらか一方しかまともうごきませんし、データ数が少なくても処理が重くて話になりません。スクロールバーにも対応できませんでした。
何か名案は無いでしょうか。

ちなみに3,4でやってみた方法とは、X軸の最小値と最大値にしたい値および描画したい幅を別シートのセルに設定し、Name設定したあと、グラフプロパティでName呼び出ししました。そして描画したグラフ内に最小最大の設定用のテキストボックスを作り、そこからセルの値を書き換えるものでした。
(幅を設定すると最大値が変わる、最大値を設定すると幅が変わるようにしたのですが、ずれて描画されてしまう。ここは我慢の範囲とした)

いっその事、exeで作る事も考えましたが、開発環境もなく、Basic以外の言語も得意では無い事および元データの収集の手法としてExcelが適切である面から
Excelにて実現を考えています。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


ピボットグラフは絞り込みに適してますが、スクロールしませんからねぇ。(無理矢理大きくしておき、ウィンドウ枠固定と併用する手もありますが…)他に、私が過去に作った事のある案なぞ。

考え方としては、グラフ描画機能を使わず、グラフ表示したいセル範囲を基準として、自分で座標変換し、図形で描きます。(分布図ならShapes.AddShape、折れ線ならShapes.BuildFreeform) これだと、セル上に置いた図形でしかないので、後はウィンドウ枠の固定機能でスクロールを実現します。 目盛りは、セルに直接文字を入れて実現。 罫線や着色もできますよね。

絞り込みは、元データにオートフィルタをかける事で実現します。 ただし、図形でグラフ案の場合、オートフィルタしても描画が追従しないので、前に描画した線を全部消してから、表示されているデータだけでプロットし直す事になります。
(???) 2019/03/05(火) 14:14


 こんにちは

 時間がかかっている処理はどこでしょうか。
 グラフの拡大縮小やスクロール時のグラフの再描画に時間が掛かっているなら
 なるべく再描画しないようにするのが肝心ですが、どうでしょう。

 ひとつアイディアです。

 グラフを書いた後、グラフの範囲をコピーして、図形のリンク貼り付けします。

 x軸の拡大は、リンク範囲の縮小+画像の幅の調整
 x軸のスクロールはリンク範囲の移動 

 でどうでしょうか。

(でれすけ) 2019/03/06(水) 11:32


???さん、でれすけさん。
ありがとうございます。

グラフシート1枚(実際には数種類のグラフを描画するので数枚ですが)内で
操作ができるものをイメージしていました。

オートフィルタはやってみたのですが、フィルタボタンをグラフシート内に配置するのが大変で
カテゴリー数が固定では無い場合にうまくいかず、イライラして諦めました。

処理に時間がかかる箇所はあちこちありますが、一番かかっているのは
X軸の最大最小値を設定する時です。
描画対象の全データ点数だけ再描画するからかな、とは思っていますが、
ボトルネックは把握できておりません。

一旦図形化する方法は考えていませんでした。
グラフシートではなく、ワークシートに図形を貼りつけるのですね。
オートフィルタとリンクしたコンボボックスを配置して
グラフ化⇒図形化ですね。

Excelで図形を扱うのは慣れていませんので
Shapes.AddShape、Shapes.BuildFreeformおよび
図形へのリンクについては勉強が必要そうですが、
イメージが沸きました。

ありがとうございました。

(通りすがりのおっさん) 2019/03/07(木) 09:07


もひとつおまけで、私がまだやってみた事のない案なぞ。 他の言語でEXEを作るのと変わらないものをExcel VBAで作る方法です。

グラフ表示用に、UserFormを使います。 UserFormにはスクロールバーの表示/非表示機能があるので使うと楽なのですが、内側全体がスクロールしてしまうので、目盛りを表現できないため、使いません。

UserForm には Frame を貼り、Captionを消して、グラフの枠にします。 Frameの上に Image を貼り、適当な白紙画像を読み込んでおきます。 ImageコントロールはPictureSizeModeプロパティでストレッチ指定しておき、コントロールの大きさを変えれば、再描画せずに簡易ズームさせる事もできます。 Image の大きさは Frameより大きくしておき、更に ScrollBar を2つ貼り、縦用と横用にします。 これで、ズームとスクロールは実現できるでしょう。

問題は、Excel VBAにはグラフィック描画に関する命令が無い事です。 なので、普通のVBにはあるLine描画ができません。 そこで、APIのGDI+を活用して線を引くことになるのですが、ウィンドウハンドルを得たり、デバイスコンテキストを得たり、ペン指定して色を変えたりと、ほとんどストレートのC言語で描画するのと変わらない手間がかかるし、難しいのです。

興味があれば、MoveToExやLineTo、CreatePenIndirect等の関数名を手掛かりに、調べてみてください。
(???) 2019/03/07(木) 09:45


???さん。ありがとうございます。
ユーザーフォームは面白そうですね。

カテゴリごとのトレンドを図として作成しておき、
透過処理してユーザーフォームに貼りつける事で重ね書きに対応する。
巨大な図の一部を表示する方法でズームとスクロールに対応する。
・・・。なんかできそうな気がしてきました。

図と絵とかは幼少からとにかくその言葉の時点で苦手意識が高いのですが、
頑張る方向性が見えてきた気がします。
(通りすがりのおっさん) 2019/03/07(木) 11:37


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.