耐性数値の表示を実装し、早速色々と見ているのですが、一つ問題が。「こころセットの表示と離れすぎていていて、どのこころセットを選択しているのかわからない!
そんな時に役立つのがワークシートのチェンジイベントとオートシェイプ。オートシェイプで作成した「塗りつぶし無色の赤色枠(以下赤色枠シェイプ)」を、選択セル変更に追随して際立たせたいセル位置に表示させればよいのです。
早速実装してみます。コードを書く場所は、いつものモジュールではなく、シート上のイベントをフックできるワークシートモジュールであることに注意が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
'選択枠の追随表示 Private Sub Worksheet_SelectionChange(ByVal Target As Range) '枠シェイプがなければ抜ける Dim WakuName As String On Error Resume Next WakuName = ActiveSheet.Shapes("選択枠").Name On Error GoTo 0 If WakuName = "" Then Exit Sub With Target If .Row >= 5 And .Row <= 104 And .Column >= 10 And .Column <= 99 Then With ActiveSheet.Shapes("選択枠") .Visible = True .Top = Cells(Target.Row, 2).Top ' If Target.Column <= 26 Then ' .Width = [J1].Left ' Else ' .Width = [Z1].Left ' End If End With Else ActiveSheet.Shapes("選択枠").Visible = False End If End With End Sub |
Targetには、選択したセルがRange型で格納されます。その位置であるTopプロパティを使って、赤色枠シェイプの位置を指定することで、選択したセルに追随して赤色枠シェイプが表示されます。こころのステータスを選択している時だけ、この赤枠色シェイプが表示されるよう、Visibleプロパティも指定します。このコードではコメントカットしていますが、赤色枠のWidthプロパティを指定することで、任意の位置まで赤色枠を右に伸ばすことも簡単に行えます。
冒頭の赤色枠の存在有無判定処理、当該シートは、「戻る」と入力されたセルのハイパーリンクで別のシートに飛ぶように設定されていて、その対策です。ハイパーリンクで別シートに飛ぶ際、当該セルが選択されて、Chengeイベントが走りますが、ハイパーリンクによる別シート選択が先に実行されるため、飛んだ先のシートに、赤色枠がない場合エラーが発生してしまいます。そこで、事前に、現在選択されているシートに「赤色枠があるか」を判定して、ない場合は抜けるという処理です。
1 2 3 4 5 6 |
'枠シェイプがなければ抜ける Dim WakuName As String On Error Resume Next WakuName = ActiveSheet.Shapes("選択枠").Name On Error GoTo 0 If WakuName = "" Then Exit Sub |
想定しているシェイプのNameプロパティを取得し、それが取得できなければ、そのシェイプは存在していないと判断、処理を抜けます。存在していないシェイプの名前を取得する処理でのエラーに備え、
1 |
On Error Resume Next |
エラー発生時でも処理が続行するようにしていますが、エラーが想定される処理コードの直後にこれを入れて、以降のプログラムが正常に動作するようにしています。
1 |
On Error GoTo 0 |
さて、どんな感じになったでしょうか。
おお、これで、どのセットを選択しているか、一目でわかるようになりました。
コメント