MENU  □ MANUAL  □ 新着記事  □ 新規トピック追加  □ トピック一覧  □ SEARCH  □ 過去ログ
ログ内検索
・ キーワードを複数指定する場合は 半角スペース で区切ってください。
・ 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
・ 過去ログから探す場合は過去ログをチェック。
・ 過去ログは番号が大きいほど新しいログです。

キーワード/
検索条件/ (AND) (OR)
検索範囲(現在のログ)
(過去ログ1) (過去ログ2) (過去ログ3) (過去ログ4) (過去ログ5)
(過去ログ6) (過去ログ7) (過去ログ8) (過去ログ9) (過去ログ10)
(過去ログ11) (過去ログ12) (過去ログ13) (過去ログ14) (過去ログ15)
(過去ログ16) (過去ログ17) (過去ログ18) (過去ログ19) (過去ログ20)
(過去ログ21) (過去ログ22) (過去ログ23) (過去ログ24) (過去ログ25)
(過去ログ26) (過去ログ27) (過去ログ28) (過去ログ29) (過去ログ30)
(過去ログ31) (過去ログ32) (過去ログ33) (過去ログ34) (過去ログ35)

過去ログ14 を検索

HIT数 / 7件
NO.106710  スクロールバーによる画面範囲変化の把握
■投稿者/ Rocker
■投稿日/ 2008/02/27(08:09)
□URL/

お世話になります。

画面に表示されたセル範囲だけを正確にリアルタイムで更新する必要が
あります。 それを行うためにVisibleRangeで範囲を特定し処理しています。
ただし問題があります。表示画面の変化をリアルタイムで捉えること
ができないケースがあります。
PageUp/Downキーで画面の上下移動を行ったときはWorkbook_SelectionChage
イベントが発生するのでリアルタイムで画面表示範囲の変化を捉えることが
出来ました。(何故か、Worksheet_Selection_Changeではできない?!)
ところが最もよく使用するスクロールバーでの上下移動、およびと画面表示倍率
(ズーム)はイベントが発生しないためリアルタイムでの更新処理ができない
のです。

ちなみにFormの場合は、ScrollというイベントがありFormにスクロールバー
表示ONにした場合は、Scrollのイベントが発生します。
Formも、EXCELの画面も基本的にはWindowオジェクト(?)なので同じようにScroll
イベントを捉える方法があるのではないかと期待しています。
すくなくとも、スクロール操作を行ったときVBAでそのコードを生成しているので
当たり前ですがEXCEL、VBAはスクロールを内部的には捉えているはずです。
何故Worksheet, Workbookのイベントにスクロールがないことが不思議です。

●質問

1.EXCELのスクロールバーで画面が移動したことをリアルタイムで知る方法
はないでしょうか。

2.同様にズームが変更されたことをリアルタイムで知る方法はないでしょうか。

※以前にも同じような質問をさせていただいたことがありますが、どうしても
あきらめがつかず再度、最新情報をいただきたく投稿させていただきました。

どうぞよろしくお願いいたします。



++++++++++++++++++++
OS      ⇒Windows XP
Version⇒Excel 2003
++++++++++++++++++++
親記事
削除チェック/

NO.106711  Re[1]: スクロールバーによる画面範囲変化の把握
■投稿者/ n
■投稿日/ 2008/02/27(10:34)
□URL/

こんにちは。

>※以前にも同じような質問
この辺りですね。
http://excelfactory.net/excelboard/excelvba/cfs.cgi?word=96783&andor=and&logs=12.txt
http://excelfactory.net/excelboard/excelvba/cfs.cgi?word=97451&andor=and&logs=12.txt
1.については自前のスクロールバーを作って、そのイベントで処理するとか、
あとは常時監視の方法しかないような気がしますが...

>画面に表示されたセル範囲だけを正確にリアルタイムで更新する必要があります。
なぜ?...というかその目的が書いてあれば代案があるかもしれません。
(今のところ私にはありませんが)

2.については、すぐ下のログを参考にどうぞ。
[106678] ワークシートの表示倍率が変更されたとき
http://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=106678&rev=0
記事NO.106710 のレス /
削除チェック/

NO.106713  Re[2]: スクロールバーによる画面範囲変化の把握
■投稿者/ neptune
■投稿日/ 2008/02/27(13:11)
□URL/

こんにちは

スクロールの話ですが、垂直スクロールバーの話をすると、
MSDNの説明をそのまま掲載すると
//////////以下MSDN Platform SDK WM_VSCROLLより引用/////////////
The WM_VSCROLL message is sent to a window when a scroll event
occurs in the window's standard vertical scroll bar.
This message is also sent to the owner of a vertical scroll bar control
when a scroll event occurs in the control.

A window receives this message through its WindowProc function.
////////////引用ここまで///////////////////////
拙い英語力で解釈すると、スクロールイベントが発生すると、WM_VSCROLLメッセージが
Windowに送られます。ってな感じかな?

で、そのメッセージは所有Window又はMainWindowのWindowProc などで捕まえて
必要な処理をする事になります。

ExcelのWorkSheetの場合、何が必要になってくるかと言うと、
スクロールバーから送られてくる、
・WM_VSCROLL を捕まえて、
・その解析をし、必要な情報を取得する
・処理を行う
と、いう処理が必要です。

で、何が言いたいかと言うと、ExcelにそのWM_VSCROLL を取得してUserに通知
する仕様がないと、自分で実装するしかありません。
 実装するためにはワークシートへのメッセージをフックしてWM_VSCROLLを
検出する必要があります。

メッセージフックはよりWindowsの処理に近いため、危険性が高く、
実行ファイル化できないVBAでは更に危険が増し、自分だけが使い、
どうでも良いようなことをするアプリで使うのはともかく、それ以上の
アプリには使わない方が安全です。

 何かの拍子で、広域変数が初期化されてしまうようなVBAでは使うべきでは
ないと考えます。何かの拍子で最悪ハングアップもあります。
従って、できないと考える方が良いと思います。

※これらの危険性を理解した上で、検証し、VBでActiveX DLL、C++やその他
開発言語でその機能を実装したDll等を作成し、Excelに提供した場合は
その限りではありません。

・・・目的を達成できる範囲で代替処理があるならそれを考えられた方が良いかも??

参考:英語ですが・・・
http://msdn2.microsoft.com/en-us/library/bb787529.aspx
記事NO.106710 のレス /
削除チェック/

NO.106714  Re[3]: スクロールバーによる画面範囲変化の把握
■投稿者/ Rocker
■投稿日/ 2008/02/27(13:49)
□URL/

nさん、neptuneさん、いつもありがとうございます。
そうですか・・だめですか・・ 残念です。絶対必要なイベントだと思うの
のですが・・・ 
ありがとうございました。理屈はわかりました。また、何か考えます。

尚、表示画面だけを特定してリアルタイムで更新しなればならない理由は、
下記のとおりです。何かアイディアがあればアドバイスお願いいたします。

理由:

数千の図形を数千行の各行にあるデータ内容によってリアルタイムで再表示
するためのパフォーマンスアップ対策です。別スレッドでいくつか質問させて
いただき図形の描画の速度も相当向上しましたが、図形を描くのも時間がかかり
ますが、数千の中から更新しなければならない図形を抜き出す方が時間を要する
ことが判明しました。そこで、数千の図形の更新部分の抜き出しはやめて、
すべての図形をすべて消し、必要な部分だけ新しく描画する。つまり、
今見えている画面だけを常に最新化していればユーザーからみたら
どのスクロールしても常にどの画面でも最新化されているように見えるのです。
PageDown,Upではまさに期待したとおりの動きになり、全くストレスを感じません。ただし、スクロールバーで画面を変更すると、何も図形が表示されて
いない画面が出てくることになってしまします。(いずれかのセルを
選択するとすぐに最新化されますが・・・)


よろしくお願いいたします。

記事NO.106710 のレス /
削除チェック/

NO.106715  Re[4]: スクロールバーによる画面範囲変化の把握
■投稿者/ n
■投稿日/ 2008/02/27(14:20)
□URL/

>数千の図形を数千行の各行にあるデータ内容によってリアルタイムで再表示
ここのトリガーでWorksheet_Changeイベントが使えるなら、
セルの変更があった時のみ、再描画が必要な図形のみ再描画すれば良いと思います。
>数千の中から更新しなければならない図形を抜き出す方が時間を要する
...Loopせず、図形の名前で決め打ちすればよいような?
図形作成時に名前を行bノするとか。


この記事にはVBAのコードが含まれています。

緑の太文字→注釈
茶色の太文字→条件分岐
赤の太文字→ループ
青の太文字→その他
記事NO.106710 のレス /
削除チェック/

NO.106719  Re[5]: スクロールバーによる画面範囲変化の把握
■投稿者/ n
■投稿日/ 2008/02/27(14:57)
□URL/

失礼。過去ログのこの部分が関係してますか...
>各行のデータは相互に関連(参照されている)し
>ている場合もあり、ひとつのデータを変更すると数百の行の値が変化するケースもあ
>り、棒グラフを書き終えるまでに十数秒かかる場合もあります。
いっそのことグラフにしてしまうとか。^ ^;

あるいは、見える部分をコントロールしてしまうとか。
元データとは別に、固定のビューエリアをつくって、
あたかもシートの表示範囲を移動、縮尺、拡大させるように操作用のコントロールを配置する。
コントロールのイベントでビューエリアに元データを表示させる。
元データ表示は関数やカメラ機能でもいいかもしれません。
記事NO.106710 のレス /
削除チェック/

NO.106722  Re[6]: スクロールバーによる画面範囲変化の把握
■投稿者/ Rocker
■投稿日/ 2008/02/27(18:03)
□URL/

nさん、アドバイスありがとうございます。参考にさせていただきいろいろ
とトライしてみます。また教えてください。

ありがとうございました。 
記事NO.106710 のレス / END
削除チェック/


パスワード/

- Child SEARCH -