『アクティブセルを強調』(ゆき) アクティブセルを強調させる方法をご教示ください。 ピボットテーブル内のアクティブセルを強調表示させたいと考えています。 ピボットテーブル内には文字列に全角スペース、半角スペース、スペースが含まれていないセルがあります(本来の数値の分析に使うような使い方ではないのですが、表をツリー形式で簡易的に表示させています)。 この中で全角スペースが含まれているセルで、かつ全角スペースの左側の文字が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