[[20180918091628]] 『アクティブセルを目立たせるマクロで質問です。』(名無し) ページの最後に飛ぶ

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

 

『アクティブセルを目立たせるマクロで質問です。』(名無し)

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

  Dim highlight As Integer
  highlight = 35 '黄色にする

  Cells.Interior.ColorIndex = 0
  Rows(Target.Row).Interior.ColorIndex = highlight 
  Columns(Target.Column).Interior.ColorIndex = highlight 
End Sub

セルの行、列に色を付けるマクロをネットから探してきたのですが、
このマクロで元からセルに付いている色を消したくない場合はどうしたら良いでしょうか。

印刷時もこの行、列に色がついたままでしょうか?

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


その方法では塗りつぶしを行っているため元の塗りつぶしは消えてしまいます。
事前に直前の情報を退避しておけば対応できるかもしれませんが・・・

名前定義+条件付き書式を使う方法もあります。
https://hamachan.info/win7/Excel/active.html
メリット
・「元に戻す」機能が使えなくならない。
・(たぶん)こっちのが軽い
・塗りつぶし色情報を消さずに表示を上書きできる。
デメリット
・切り取り・貼り付けで条件付き書式が壊れる。
・あちこちの機能を使うので設定が面倒
・複数行のとき一行目しか着色出来ない。

あとRelaxTool(フリーのアドイン)の中にオートシェイプを使って目立たせる機能が付いてたような・・・。

どの方法も色が付いたままだと思うので、Workbook_BeforePrintイベントでゴニョゴニョする必要がありそう。
(名無し) 2018/09/18(火) 09:42


  Cells.Interior.ColorIndex = 0
  これを消して、

  Rows(Target.Row).Interior.ColorIndex = highlight 
  Columns(Target.Column).Interior.ColorIndex = highlight 
  これを「もともと色が付いて無かったら」というIF文の中に入れればOKです。

(TAKA) 2018/09/18(火) 09:45


TAKAさん

成る程、選択中の行列でも前の色を残したまま表示したいという解釈も出来ますね・・

> Cells.Interior.ColorIndex = 0 これを消して、
それだと直前に選択していた行列の塗りつぶしが解除されなくなりません?

> これを「もともと色が付いて無かったら」というIF文の中に入れればOKです。
それだと1セルづつ判定が必要になりますよね?
表が小さければ良いのですが、大きな表になると重くなりそうなのでちょっと心配です。
(私も検証してないので違ったら申し訳ございません。)
(名無し) 2018/09/18(火) 09:57


あああ、、そういうことですか、、、

 エクセルって最初から選んだところ色変わりません??
(TAKA) 2018/09/18(火) 10:01

名無しさん

条件付き書式の方は以前使っていたのですが、毎回使うシートに条件付き書式の入力が必要なのが使いずらかったのでこちらを検索しました。
まさしくデメリットで書いて頂いた通りです。

Workbook_BeforePrintイベントでゴニョゴニョ・・

やはりマクロ理解していないと設定は難しそうですよね。。

TAKAさん

試してみたいのですが、

 Rows(Target.Row).Interior.ColorIndex = highlight 
  Columns(Target.Column).Interior.ColorIndex = highlight 
  これを「もともと色が付いて無かったら」というIF文の中に入れればOKです。
はマクロの中のどこに入れたら良いでしょうか?

(名無し) 2018/09/18(火) 10:44


別案です。 あらかじめシートのコピーをとっておき(使うのは色だけなので、内容は古くてもOK)、こっちから色だけコピーすることで色を戻してはいかがでしょうか。
 Dim R As Long
 Dim C As Long

 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Const COPYSHEET = "Sheet1 (2)"
    Const highlight = 35

    Application.ScreenUpdating = False
    If 0 < R Then
        Application.EnableEvents = False
        Sheets(COPYSHEET).Rows(R).Copy
        Rows(R).PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Sheets(COPYSHEET).Columns(C).Copy
        Columns(C).PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Target.Select
        Application.EnableEvents = True
    End If
    R = Target.Row
    C = Target.Column
    Rows(R).Interior.ColorIndex = highlight
    Columns(C).Interior.ColorIndex = highlight
    Application.ScreenUpdating = True
 End Sub
(???) 2018/09/18(火) 10:54

 >はマクロの中のどこに入れたら良いでしょうか?

 いや、、忘れてください、、
 行の中で色が付いてるセルと色が付いてないセルを判定するので
 そんな単純じゃなかったです。
(TAKA) 2018/09/18(火) 10:59

書き忘れ。

ThisWorkbookのWorkbook_SheetSelectionChangeにコードを書くと、全シートで色替えしてしまうので、シートのバックアップ案ではコピー先もクリックで色が壊れてしまいます。 なので、THisWorkbookではなく、シートモジュール(例えばSheet1)の Worksheet_SelectionChangeに書くことで、シートを1つにできます。
(???) 2018/09/18(火) 11:01


???さん

別案のシートコピーで試してみます!
わかりました、ワークシートモジュールに書いてみます。
ありがとうございます!

TAKAさん

そうなんですね、わかりました。
ご思考いただきありがとうございました!
(名無し) 2018/09/18(火) 11:44


 列、行単位で選択できなくなるけど。
 更に、Shift、Ctrlキーを併用したセルの選択ができなくなる。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Acadd = ActiveCell.Address
 Application.EnableEvents = False
 Union(Target.EntireRow, Target.EntireColumn).Select
 Range(Acadd).Activate
 Application.EnableEvents = True
 End Sub

 >・複数行のとき一行目しか着色出来ない。

 アクティブセルは、1つしかないけど??
(BJ) 2018/09/18(火) 11:59

BJさん
仰る通りです。選択セルと勘違いしていました。

あと質問者と同じ名前を使っていたようでみなさんを混乱させて申し訳ございません。私は一旦撤退します。
(名無し) 2018/09/18(火) 12:06


???さん

シートコピーでうまくいきました!
後で書いてくれた BJ さんの方法がシート増やさず楽なので使わせていただくことにしましたが、そういう方法もある事を今後覚えておきます、ありがとうございました。

BJさん

印刷にも支障なく目立つようになりました、ありがとうございます!
できれば解説を簡単にでも良いのでお願いできないでしょうか。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)'セルの選択範囲を変更したときに実行する処理
Acadd = ActiveCell.Address'アクティブなセルの位置を取得
Application.EnableEvents = False'イベントを???
Union(Target.EntireRow, Target.EntireColumn).Select
Range(Acadd).Activate'セルをアクティブにする
Application.EnableEvents = True’イベントを???

部分ずつネットで調べただけなので意味もわかっておらずすみません。

名無しさん

ニックネームが被ってしまっていたのですね、すみません!
思考ありがとうございました。

(名無し) 2018/09/18(火) 13:46


なるほど、BJさん案は自分で塗らず、デフォルトの選択状態の色変わりを利用しているわけですね。 セルを汚さないし、秀悦だと思います。

ロジックは、縦1列+横1行をまとめて選択状態にしているだけです。 Application.EnableEvents は、その選択によって更にSelectionChangeイベントが発生してしまう事を抑止しています。
(???) 2018/09/18(火) 13:57


1行1列ではないですね。選択した行数列数に追従するので、より汎用的です。すばらしい!
(???) 2018/09/18(火) 14:02

黙ると言ったけどBJさんの案がとても素晴らしいのですが、
ユーザーが自由に切り替えができないのは不便だなと思い、
Ctrlキーでスイッチできるようにしてみた。

【シートモジュール】

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If GetKeyState(VK_CONTROL) = 1 Then     '←追加
        Dim acadd As String
        acadd = ActiveCell.Address
        Application.EnableEvents = False
        Union(Target.EntireRow, Target.EntireColumn).Select
        Range(acadd).Activate
        Application.EnableEvents = True
    End If                                  '←追加
End Sub

【Module1】
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Const VK_CONTROL = &H11

これでデメリット解消ではないでしょうか!
(名無し@回答者) 2018/09/18(火) 14:21


わたしだけ質問がよくわかってないのかもですけど、書きぶりから、今は"条件付き書式"を使っていないようなので、アクティブセル(選択セルではないんですよね?)に色を塗る程度であれば、

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Cells.FormatConditions.Delete

        With ActiveCell
            .FormatConditions.Add Type:=xlExpression, Formula1:="=TRUE"

            '実行環境で「ColorIndex」の35が黄色なのか要確認
            .FormatConditions(1).Interior.ColorIndex = 35
        End With

    End Sub

みたいな感じでいけちゃいませんか?

(もこな2) 2018/09/19(水) 12:58


 例えばF10セルを選択した場合、F列のセルおよび10行のセル(十字になる)に色を付けたい(もともと色がついている場合は
 そのことがわかるように)だと思うが。
(ねむねむ) 2018/09/19(水) 13:18

普通はフォーカスしているセルに色が付きますが、これを目立たせるために、行、列に色を付けて、十字型にしたい、というのが主目的だろうと思います。 クリックしたセルを中心に十字。 プレゼンなんかで利用するのでしょう。 なので、塗るのは1行全部と1列全部であり、塗らずにこれを実現してしまうBJさん案が最速だし、内部書式のカウントも進まないので綺麗、という感じですね。

もこな2さん案を十字に適用したとして、実際に塗ってしまう私の案よりはマシだけど、全く塗らない案には敵わない、という感じでしょうか。 他に条件付き書式を使っていると駄目、という欠点もありますし。

そして、BJさん案の欠点である、セルの編集ができなくなってしまう点は、デザインモードにしてマクロを動かなくした状態にするだけで良いのではないかなぁ、と思います。
(???) 2018/09/19(水) 13:31


あぁなるほど。お二方のフォローで理解しました。

要は、今のエクセルでも行と列の見出し?の部分が色が変わってくれるけど、もっとみやすく、昔のlotus 1-2-3みたいな感じで表示してほしいってことでしたか。

そうなると、行列まるごと選択状態にする案って妙手ですね。
今度、同僚に、私が考えたって教えよう(違っ

蛇足ですが、スイッチ追加案は、操作(プレゼン?)してるうちにどっちのモードか忘れそうなので、シート見出しの色を変えるとか、トグルボタンを設置するとか視覚的にわかるようにしたほうがいいかもなんて思いました。
(もこな2) 2018/09/19(水) 20:51


コメント返信:

[ 一覧(最新更新順) ]


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