[[20210317152837]] 『アクティブセルを強調』(ゆき) ページの最後に飛ぶ

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

 

『アクティブセルを強調』(ゆき)

アクティブセルを強調させる方法をご教示ください。

ピボットテーブル内のアクティブセルを強調表示させたいと考えています。
ピボットテーブル内には文字列に全角スペース、半角スペース、スペースが含まれていないセルがあります(本来の数値の分析に使うような使い方ではないのですが、表をツリー形式で簡易的に表示させています)。
この中で全角スペースが含まれているセルで、かつ全角スペースの左側の文字が4文字のセルがアクティブセルになった場合に強調表示をさせたいです。

アクティブセルを強調させる方法は条件付き書式とVBAを組み合わせることで出来たのですが、セルの文字列という条件を組み込めないでいます。

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


こういうことですか?

 If InStr(ActiveCell.Value, " ") = 5 Then
(tkit) 2021/03/17(水) 17:13

tkit様

さっそくの回答ありがとうございます。

条件付き書式に
=AND(CELL("row")=ROW(A1),CELL("col")=COLUMN(A1))

VBAに

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If InStr(ActiveCell.Value, " ") = 5 Then
    Application.ScreenUpdating = True
  End If
End Sub

と入力するとアクティブセル内の文字列が「〇〇○○ △△△〜」というように全角スペースの左側が4文字だった場合に条件付き書式で設定したように強調されます。回答していただいたとおり、強調表示ができました。

追加質問で申し訳ないのですが、強調表示されたセルから条件に当てはまらないセルを選択した場合に、条件に当てはまっているセルがそのまま強調されたままとなってしまいます。
条件に当てはまる場合は強調しつつ、次にほかのセルを選択した場合はその強調表示が解除されるようなことは可能でしょうか。

(ゆき) 2021/03/17(水) 17:29


>アクティブセルを強調させる方法は条件付き書式とVBAを組み合わせることで出来た
無理にとはいいませんが、それを提示できませんか?

>全角スペースが含まれているセルで、かつ全角スペースの左側の文字が4文字のセルがアクティブセルになった場合
逆に考えて、アクティブセルの値が「全角スペースが含まれている、かつ、全角スペースの左側の文字が4文字」だった場合に、作成されたマクロで処理すると考えればよくないですか?
(Selection.Value ではなく ActiveCell.Value ならさほど苦労はしないでしょう。)

ちなみに、↓を参考にしたとかだったりしますか?
[[20200606192625]] 『選択したセル範囲の色づけ』(たなしん)
[[20210210195059]] 『アクティブセルの行を色付けするイベントで一部分』(森野ふくろう)

(もこな2) 2021/03/17(水) 17:57


もこな2様

>>アクティブセルを強調させる方法は条件付き書式とVBAを組み合わせることで出来た
>無理にとはいいませんが、それを提示できませんか?

条件付き書式に
=AND(CELL("row")=ROW(A1),CELL("col")=COLUMN(A1))
と設定して
VBAで
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Application.ScreenUpdating = True
End Sub
とシートモジュールに記載しました。
  Application.ScreenUpdating = True はその都度画面を更新させるためのものと自分では理解しました。

提示していただいた過去ログにもある
https://www.relief.jp/docs/001406.htmlに載っている方法を少しだけいじらせていただき、アクティブセルだけを強調表示するように設定しました(こちらに載っているのは表の中でアクティブセルがわかりやすいよう行と列をクロスで強調するものでした)。
[[20200606192625]] 『選択したセル範囲の色づけ』(たなしん)←もなこ2さんの部分も読ませていただきました。

>逆に考えて、アクティブセルの値が「全角スペースが含まれている、かつ、全角スペースの左側の文字が4文字」だった場合に、作成されたマクロで処理すると考えればよくないですか?
まさしくその通りで、条件付き書式を使用すると勝手に決めん込んでしまっておりました。
そのため、すべてをVBAで書いてしまえばよかったことに気づくことができました。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)

 Application.ScreenUpdating = False

 Dim LastColumn As Long
 Dim LastRow As Long
  LastColumn = Cells(4, Columns.Count).End(xlToLeft).Column
  LastRow = Cells(Rows.Count, "B").End(xlUp).Row

 Dim ICFcode As Range
  Set ICFcode = Application.Intersect(ActiveCell, Range(Cells(4, "B"), Cells(LastRow, LastColumn)))

  If Target.Count > 1 Then
   Exit Sub
  End If

  If Not ICFcode Is Nothing Then
            If InStr(ActiveCell.Value, " ") = 5 Then
                Cells.Interior.ColorIndex = 0
                Target.Interior.ColorIndex = 8
            Else
                Cells.Interior.ColorIndex = 0
            End If
    End If

 Application.ScreenUpdating = True
 End Sub

として自分のやりたいことは実現できました。選択時にわずかな画面更新の字眼科あるのが気になります。ただ、VBAについては皆様のコードや記録したコードをいじる程度の事しかできないため、書き方が自己流めちゃめちゃでもっとシンプルでスマートなコートを書けるように勉強したいと思います。
もしよろしければ、

 Dim LastColumn As Long
 Dim LastRow As Long
  LastColumn = Cells(4, Columns.Count).End(xlToLeft).Column
  LastRow = Cells(Rows.Count, "B").End(xlUp).Row
 Dim ICFcode As Range
  Set ICFcode = Application.Intersect(ActiveCell, Range(Cells(4, "B"), Cells(LastRow, LastColumn)))
の部分はピボットテーブル(B4セルがピポットテーブルの左上端でここは固定)の範囲を指定するために書いていますがここの部分をもっと良い書き方等あれば教えていただけるとありがたいです。もちろん他の部分もご指摘いただけると勉強になります。
(ゆき) 2021/03/18(木) 14:06

 一時的にエラー無視にしてTableRange1を取得してみるとか。どうでしょ?

    Private oldAc As Range
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim Ac As Range
        If Not oldAc Is Nothing Then oldAc.Interior.ColorIndex = 0
        On Error Resume Next '----------------------------------------
        Set Ac = Intersect(ActiveCell, Target.PivotTable.TableRange1)
        On Error GoTo 0 '---------------------------------------------
        If Ac Is Nothing Then Exit Sub
        If InStr(Ac.Value, " ") = 5 Then
            Ac.Interior.ColorIndex = 8
            Set oldAc = Ac
        End If
    End Sub

(白茶) 2021/03/18(木) 19:08


質問者さんが最初に利用していたアンドリューさんの方法がよいと思うんですが…
条件付き書式の設定を手作業からイベントマクロに変更してみました。
ただ、ピボットのどのイベントが適切か、わかりませんでした。

 Private Sub Worksheet_PivotTableChangeSync(ByVal Target As PivotTable)
    Dim adr As String

    adr = Target.TableRange1.Cells(1).Address(0, 0)

    With Target.TableRange1
        .FormatConditions.Delete
        .FormatConditions.Add Type:=xlExpression, _
            Formula1:="=AND(CELL(""row"")=ROW(),CELL(""col"")=COLUMN(),FIND("" ""," & adr & ")=5)"
        .FormatConditions(1).Interior.ColorIndex = 8
    End With
 End Sub

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = True
 End Sub

(マナ) 2021/03/18(木) 22:00


↑マクロで条件付き書式を設定しましたが、
もし、ピボットの範囲が固定なら
あるいは、可変でも、少し広めにして構わないなら、
手作業での設定をおすすめします。

(マナ) 2021/03/18(木) 22:21


白茶様

コードの提示ありがとうございます。
ピボットテーブル内の範囲のみに動作するように範囲指定したらよいか悩んでおりました。
>On Error Resume Next '----------------------------------------
>Set Ac = Intersect(ActiveCell, Target.PivotTable.TableRange1)
>On Error GoTo 0 '---------------------------------------------
の部分は大変勉強になりました。

ぜひ勉強のために解説をお願いしたいのですが、
If Not oldAc Is Nothing Thenの部分は、セルを選択したらoldAc.Interior.ColorIndex = 0
セル以外の図形などだったら何もしないと捉えてよろしいでしょうか。

また、

        If InStr(Ac.Value, " ") = 5 Then
            Ac.Interior.ColorIndex = 8
            Set oldAc = Ac
        End If

の部分のSet oldAc = Acが分からないでいます。どのような意味合いを持つのでしょうか。

(ゆき) 2021/03/19(金) 17:44


マナ様

条件付き書式をマクロで設定する方法も確かに面白いです。今回のご提案のおかげでピボットにもイベント条件があることを知ることができました。ありがとうございます。
確かに自分で調べた限りではピボットのPivotTableChangeSyncがよさそうで、その時に条件付き書式を設定することでやりたいことは動作してくれました。

ただ、SelectionChangeと違うのかピボットテーブルが変更されないとき、たとえば「マクロが実行され条件付き書式が設定し正常通りに動作→たまたま条件付き書式を手動で消す→ピボットテーブルを選択する」といった時にはイベントが発生しないようです(この作業を行う可能性はかなり低いですが、使用者がたまたまやったらなってしまった)。イベントについては自分自身でもさらに勉強しようと思うきっかけとなりました。

追記していただいたとおり、条件付き書式を使用するのであれば範囲を広めにとるように手作業でしたほうがよさそうですね。
(ゆき) 2021/03/19(金) 17:56


 初回のイベントが発動
        If Not oldAc Is Nothing Then oldAc.Interior.ColorIndex = 0      '最初は前回が無いのでoldAcは未定義→何もしない
            Set oldAc = Ac                                              '今回塗ったセルを次回用に覚えておく
 2回目のイベントが発動
        If Not oldAc Is Nothing Then oldAc.Interior.ColorIndex = 0      '前回塗ったセルの色を消す
            Set oldAc = Ac                                              '今回塗ったセルを次回用に覚えておく
 以下同様
   ・
   ・
   ・

 って感じです。

 現状oldAcは他のプロシージャと共用する訳ではないので↓の様に内側でStatic変数にした方が良いかも

    'Private oldAc As Range   '←ココはやめて
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Static oldAc As Range '←やっぱこっちで
        Dim Ac As Range
        If Not oldAc Is Nothing Then oldAc.Interior.ColorIndex = 0
        On Error Resume Next '----------------------------------------
        Set Ac = Intersect(ActiveCell, Target.PivotTable.TableRange1)
        On Error GoTo 0 '---------------------------------------------
        If Ac Is Nothing Then Exit Sub
        If InStr(Ac.Value, " ") = 5 Then
            Ac.Interior.ColorIndex = 8
            Set oldAc = Ac
        End If
    End Sub

(白茶) 2021/03/19(金) 18:40


>ただ、SelectionChangeと違うのかピボットテーブルが変更されないとき

それが目的です。
マクロが実行されて、「元に戻す」機能が使えないのはイヤですよね。
なので、本当は、条件付き書式の設定にも、イベントを利用したくなかったです。

>たまたま条件付き書式を手動で消す

それは、どうにもならないですね。
ピボットを右クリックし「更新」すれば条件付き書式は復活しますが、
「元に戻す」機能が、リセットされちゃいます。

(マナ) 2021/03/19(金) 19:19


白茶様

詳しい解説コメントを付けていただきありがとうございます。解説の部分と「Private oldAc As Range」「Static oldAc As Range」の違いを提示していただいたことで、変数や定数について学ぶことができました。
変数の使用は今まではDimしか自分では使うことができなかったので、これを機にもう少し幅を持たせられるように頑張ろうと思います。

マナ様
>>ただ、SelectionChangeと違うのかピボットテーブルが変更されないとき
>それが目的です。
そこまで考えてくださっていたなんてまったく気づきませんでした。確かに自分でコードをいじって試行錯誤しているときに元に戻す機能が使えずに手作業で元に戻したりということを何度も経験していました。何でもかんでもマクロでやればいいというわけでもないのですね。やはり使い手のことを考えたものが書けるように勉強していきます。

お二人とも細かな質問にも答えていただき大変勉強になりました。時間を割いていただきありがとうございます。
(ゆき) 2021/03/20(土) 10:41


コメント返信:

[ 一覧(最新更新順) ]


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