[[20190619213407]] 『条件書式で指定セルが画面内に表示されているか知』(エクセルの背中が痒い) ページの最後に飛ぶ

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

 

『条件書式で指定セルが画面内に表示されているか知りたい』(エクセルの背中が痒い)

条件書式で、指定したセルが画面内に表示されているか知る方法は無いでしょうか?
非表示セルではなく、スクロールや画面サイズ変更で表示外に出たかどうかしりたいです。
やりたいことは、ウィンドウ枠固定で固定表示しているセルの書式を、固定していないセルが画面内に表示されているかどうかで変更したいです。

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


回答はではありません。
というか、わたしにはわからないので他の回答者待ちですが、

画面内に表示されていないセルの表示形式は、どうでもよいのでは???

(マナ) 2019/06/19(水) 22:46


 >ウィンドウ枠固定で固定表示しているセルの書式を、固定していないセルが画面内に表示されているかどうかで変更したいです。 
 なので表示形式を変更するセルはいつも表示されているのでは?
(ねむねむ) 2019/06/20(木) 08:52

 すごい想像ですが、例えばA列を固定しているとして、Z列が見えていない時とスクロールすることでZ列が見えた時とで表示形式を変えたい?
 何か比較したいことがあるのでしょうか?
 目的と具体的な内容もきちんと書けば更なる回答があるかも…?

(コナミ) 2019/06/20(木) 09:11


 VBAで
 ActiveWindow.VisibleRange
 を使うと画面に表示されているセル範囲を取得できるがなんのイベントでひっかければいいのだろうか?
(ねむねむ) 2019/06/20(木) 09:24

ActiveWindowオブジェクトのVisibleRangeまたはScrollRowやScrollColumnプロパティで現在のスクロール状態は調べる事ができます。 しかし、ユーザーがシートをスクロールさせた事はExcelがVBAに何も教えてくれないので、一定周期で無限に監視するようなコードを仕込むしかないかと思います。

調べた結果はどこかのセルにでも書き出してやるとか、名前定義を更新するとかで、条件付き書式は状態を判断できるでしょう。 しかし、スクロールして状態変化すると、周期が来たときにセル内容を変えるので、人間が手入力しているときは邪魔するかも知れません。 裏でマクロをループさせてまで実現する価値があるように思えないので、どういう利用方法を考えているか教えてもらえますか? 例えば、左上から表示されていなければ色で教える、とかなら、シートがアクティブになると必ず左上を表示するようなマクロを仕込んでも十分に思えますし。
(???) 2019/06/20(木) 10:27


回答ありがとうございます。
簡単にはできそうにないですね。

やりたいことは、連続スクロールさせながらランダムに複数存在する該当セルを、見落とさずにチェックしていきたかったのです。
値を見るだけなら固定領域に引っぱってくれば良いのですが、周囲のセルの値次第で内容を変えたいセルもあるため直接見る必要があります。

該当セルの書式を直接変えて目立たせれば良いのですが、可動領域はデータも多く最終的には条件書式も消す必要があるため、書式の自由が利く固定領域だけでなんとかできないかと思ったのですが甘かったですね。

条件が複雑で検索は役に立たないのですが、VBAでなら該当セルを順番に表示していくマクロが作れそうなのでこっちの方向でやってみます。

(エクセルの背中が痒い) 2019/06/20(木) 21:02


 みなさん書いておられますが、ネックなのは
 >スクロールや画面サイズ変更で
 の部分なので
 例えばスクロールが↑↓キーによるものなら方法はありますけど。
 それで妥協できるかどうかです。
 〜〜〜〜〜〜〜〜〜 ex
 シートモジュール
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     Application.Calculate
 End Sub
 標準モジュール
 Function CHECK(指定のセル) As Boolean
     Application.Volatile
     CHECK = Intersect(ActiveWindow.VisibleRange, 指定のセル) Is Nothing
 End Function

 ワークシート:条件付き書式
 数式で
 =CHECK(A10)'A10:指定したセル
 〜〜〜〜〜〜〜〜〜
 初レスの
 >固定していないセル 
 は 間違いかもと思っているので考えていません。

(チオチモリン) 2019/06/20(木) 21:55


Application.OnTimeを使って、1秒周期でスクロール状態を監視し続ける例なぞ。

シートをアクティブにすると動作開始します。 一度実行した後ならば、Names.Add…の行は削除して構いません。
例えば、C3セルでウィンドウ枠固定してあるとして、実行後、条件付き書式を「=test="$C$3"」の時に着色、等にしてください。(同様に、普通の数式でも状態判定できます)

なお、これは周期監視テスト用のコードなので、 ブックを開くだけで監視開始したいならば、ThisWorkbookのWorkbook_Openにでもコードを書いてください。

 【標準モジュール】
 Public dpNext As Date

 Public Sub sTimer()
    Names("test").RefersTo = ActiveWindow.VisibleRange(1).Address
    dpNext = DateAdd("s", 1, Now)
    Application.OnTime dpNext, "sTimer"
 End Sub

 Sub sStop()
    On Error Resume Next
    Application.OnTime dpNext, "sTimer", , False
    On Error GoTo 0
 End Sub

 【シートモジュール】
 Private Sub Worksheet_Activate()
    Names.Add "test", ActiveWindow.VisibleRange(1).Address
    dpNext = Now
    Call sTimer
 End Sub

 Private Sub Worksheet_Deactivate()
    Call sStop
 End Sub

 【ThisWorkbook】
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call sStop
 End Sub

もっと通常操作に影響しないようにするならば、名前定義が既に存在する場合は現在の状態と比較し、違っているときだけ代入するのが良いでしょう。(実験用手抜きコードなので、変わってても変わってなくても、1秒毎に無駄に上書きしちゃっています)
(???) 2019/06/21(金) 10:14


コメント返信:

[ 一覧(最新更新順) ]


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