リストHOME  リスト便利テク集

便利テクその6(ラインカーソル)

内容

 前回に引き続き、今回も【条件付き書式】の機能を使ったテクについて、説明したいと思います。但し、今回は、単純に【条件付き書式】だけではなく、【VBAプログラム】との組み合わせに挑戦してみたいと思います。


 作成するのは、以下のようなラインカーソルです。皆さん、エクセルで、ある行を編集中に、『どこを編集しているのか分かりにくい。』と思ったことはありませんでしょうか?


 今回は、そんなお悩みを解決するため、以下のように選択中の行を強調表示する仕組みを実装してみたいと思います。


ラインカーソル

エクセルファイルのダウンロード


 上図のラインカーソルの簡単な仕様を以下とし、この機能を【条件付き書式】【VBAプログラム】により、実装してみましょう。プログラムと聞くと難しそうと感じる方もいらっしゃると思いますが、非常に簡素なプログラムで実装できますので、是非挑戦してみてください。


手順

手順1 選択行の判定

 まずは、【条件付き書式】で強調表示を行うための、条件式を設定したいのですが、それを行うには、現在編集中の行位置を判定するための関数が必要となります。従って、先にVBAプログラムにて、編集中の行位置を判定するユーザ定義の、関数を作成します。


 リボンの【開発】タブから、【コードの表示】を選択します。次に、標準モジュールを追加し、そのモジュールに以下のプログラミング・コードを追加します。


 【開発】タブが表示されていない方は、設定の変更が必要ですので、『オープンソース』のエクセル設定を参考にして、設定を変更してください。


※標準モジュールには、適当な名前を設定してください。今回のサンプルでは、名前を mdl_line_cursol としています。


'mdl_line_cursolモジュール
Option Explicit


'現在選択中の行かどうかを返却します。
Public Function IS_ACTIVE_LINE(ByVal rg As Range) As Boolean
    IS_ACTIVE_LINE = (ActiveCell.Row = rg.Row)

End Function

 まず、Option Explicitの行ですが、Explicitは、直訳すると、曖昧さのないという意味です。これを記述しておくと、プログラミングの記述に厳密さが要求されるようになり、実行もしくは、コンパイル時に、プログラミングの文法ミスをメッセージ表示してくれるようになります。


 次に、IS_ACTIVE_LINE関数ですが、これは、引数で渡された、セルrg(Rangeオブジェクト)が、選択行に該当するかどうかを判定する関数です。選択行に該当する場合は、True、該当しない場合は、Falseを返却する仕様となっています。


 ここでは、編集中の行かどうかを判定するのに、ActiveCellオブジェクトを使用して判定しています。ActiveCellオブジェクトは、現在選択中のセルを扱うために標準で用意されたオブジェクトで、プロパティに行数を示す、Rowプロパティが存在しますので、それを利用して判定しています。


 オブジェクトや、プロパティという言葉が出てきましたが、オブジェクトとは簡単に言うと、『データ構造や、手続き(処理)をひとまとめにしたもの。』といえます。また、プロパティとは、そのオブジェクトが保持しているデータに対して、アクセスするためのインターフェースで、これを利用することで、値を設定したり取得することが出来ます。この際に、オブジェクトの内部で、何かしらの処理を伴う場合もあります。

※オブジェクトやプロパティという言葉は、『オブジェクト指向』というプログラミングの考え方(手法)で、定義されている用語です。


 このIS_ACTIVE_LINE関数を、手順2で、【条件付き書式】の設定に使用します。


手順2 強調表示

 続いて、【条件付き書式】により、選択行の強調表示設定を行いたいと思います。表の項目(フィールド)名が記述された先頭行は、今回は、強調表示の対象外にしたいと思います。ですので、2行目以下のセル(表内)を、どこでも良いので、選択してみてください。ここでは、A2セルを選択して、話しを進めていきます。


 A2セルを選択後、リボンの【開発】タブを選択し、【条件付き書式】をクリックします。ポップアップメニューが表示されますので、【新しいルール】を選択してください。

条件付き書式


 以下の画面が表示されますので、ルールの種類の項目の、【数式を使用して、書式設定するセルを決定】を選択してください。

条件付き書式


 書式設定の項目に、手順1で作成した関数を利用した下記の式を入力します。



=IS_ACTIVE_LINE(A2)


 これは、A2セルが、編集中の行に該当するかどうかを判定し、該当する場合は、True、該当しない場合は、Falseを返します。また、表全体に同等の設定を行いたいのですが、A2が他のセルに変わった場合、IS_ACTIVE_LINE関数の引数に渡すセルは、行・列ともに相対参照となりますので、A2の箇所には、$を付与しないでください。


 上記で、Trueが返却された時に、該当行を強調表示にしたいので、書式ボタンを押下し、以下の画面を表示します。 まず、【フォント】タブを選択し、フォントのスタイルを太字に設定します。

強調表示-太字


 次に、【罫線】タブを選択し、線のスタイルを実線、線の色を赤色、罫線に下線を指定します。

強調表示-赤色下線


 【塗りつぶし】タブを選択し、背景色の項目を、薄い赤色に設定します。設定に問題がなければ、【OK】ボタンを押下します。

強調表示-薄い赤色背景色


 以上で、A2セルの強調表示の設定が出来ましたので、【OK】ボタンを押します。

強調表示-赤色下線


 A2セルの強調表示設定が完了したので、表全体にこの設定を適用します。適用先を表のヘッダ部分を除いた$A$2:$D$14を、指定し、【OK】ボタンを押下します。

強調表示の適用 border=


 以上で、強調表示のための【条件付き書式】の設定が完了しました。


手順3 【条件付き書式】の再計算

 手順2までの設定を行った状態で、表の選択行を変更してみてください。選択行が変わっても、思ったように、選択行が強調表示されないことが分かります。


 これは、【条件付き書式】を設定した時だけ、条件式が判定され、強調表示がなされていることが、原因です。ですので、もう一工夫必要で、それは、選択行が変更されたときに、条件式が、再計算されるような仕組みを、VBAにて、組み込む必要があります。


 エクセルシートにおける選択位置が変わった時に、VBAでは、呼び出されるイベントが用意されています。これは、Worksheet_SelectionChange関数として、VBAに組み込むことが可能です。

Worksheet_SelectionChangeイベント


 リボンの【開発】タブの【コードの表示】をクリックし、該当シートを選択します。続いて、Generalの項目をWorksheetオブジェクト、Declarationsの項目を、SelectionChangeイベントに設定します。すると、上図のように、Worksheet_SelectionChange関数として、イベントのスケルトン(骨組み)が挿入されます。


 スケルトンが挿入されましたら、以下のようにコードを実装してください。



Option Explicit

'現在選択中の行
Private CurrentRow As Long


'選択セルが変わった時に呼び出されるイベント
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    '選択行が変更された場合
    If CurrentRow <> Target.Row Then
        '式の再計算
        Me.Calculate

    End If
    
    '現在選択中の行を保存
    CurrentRow = Target.Row
    
End Sub


 コードの内容を簡単に説明すると、シートにおける選択位置が変わった時に、再計算されるようCalculate関数を呼び出しています。Meとは、自分自身すなわち、ここでは、サンプルの表を記述したWorkSheetオブジェクトのことになります。


 同じ行でも、異なるセルを選択すると、このイベントが呼び出され、同一行にも関わらず、再計算されてしまいますので、前回呼び出されたときの、行位置を保存し、それと同じ行だった場合には、再計算しないようにしています。無駄な処理をすることで、エクセルのパフォーマンスが低下してしまうことを回避しています。


 以上で、強調表示の実装が全て完了しました。行位置を色々変更して、確認してみてください。



その5  <  >  その7



所感

 強調表示することで、非常に見やすくはなりますが、デメリットが幾つかあります。



 ですので、ある程度、編集が確定した表データで、閲覧することが、主な目的の場合に、今回のテクを利用すると非常に有効だと思います。


 MSがエクセルの標準機能で、このようなラインカーソルに対応してくれることを非常に望みます。



サンプルデータについて

 サンプルのデータは、私の創作によるものです、サンプルデータに含まれる個人・団体名などの情報は、実在の人物とはまったく関係ありません。



連絡先

 ご意見・ご要望等ありましたら、画面最下部のメールアドレスまでご連絡ください。




カレンダーフォーム・ページのフッター
管理者のメールアドレス