[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『条件書式で指定セルが画面内に表示されているか知りたい』(エクセルの背中が痒い)
条件書式で、指定したセルが画面内に表示されているか知る方法は無いでしょうか?
非表示セルではなく、スクロールや画面サイズ変更で表示外に出たかどうかしりたいです。
やりたいことは、ウィンドウ枠固定で固定表示しているセルの書式を、固定していないセルが画面内に表示されているかどうかで変更したいです。
< 使用 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
調べた結果はどこかのセルにでも書き出してやるとか、名前定義を更新するとかで、条件付き書式は状態を判断できるでしょう。 しかし、スクロールして状態変化すると、周期が来たときにセル内容を変えるので、人間が手入力しているときは邪魔するかも知れません。 裏でマクロをループさせてまで実現する価値があるように思えないので、どういう利用方法を考えているか教えてもらえますか? 例えば、左上から表示されていなければ色で教える、とかなら、シートがアクティブになると必ず左上を表示するようなマクロを仕込んでも十分に思えますし。
(???) 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
シートをアクティブにすると動作開始します。 一度実行した後ならば、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.