集中するためにやっていること

お世話になります。いつも助けていただいています。表題の件につきまして,教えていただければと思います。

Range(Worksheets("sheet1").Cells(1, 2), Worksheets("sheet1").Cells(101, 14)).FormatConditions.Add(Type:=xlExpression, Formula1:="=CELL(""ROW"")=ROW()").Interior.Color = rgbPowderBlue

をVBAから書き込んでいますが,書き込む方法によって挙動がちがうようですので,アドバイスいただければと思います。その都度,条件付き書式設定の「ルールの管理」で確かめてみると,書き込みは行われているようです。

this workbook に

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Worksheets("sheet1").Cells.FormatConditions.Delete
Range(Worksheets("sheet1").Cells(1, 2), Worksheets("受付名簿").Cells(101, 14)).FormatConditions.Add(Type:=xlExpression, Formula1:="=CELL(""ROW"")=ROW()").Interior.Color = rgbPowderBlue
End Sub

のように記載した時だけ思った動作になります。

これを,sub にして,標準モジュールに記載し,

sub きょうちょう()
  Worksheets("sheet1").Cells.FormatConditions.Delete
Range(Worksheets("sheet1").Cells(1, 2), Worksheets("受付名簿").Cells(101, 14)).FormatConditions.Add(Type:=xlExpression, Formula1:="=CELL(""ROW"")=ROW()").Interior.Color = rgbPowderBlue
end sub


this workbook から下記のように

Private Sub Workbook_Open()
call きょうちょう
End Sub

呼び出すと,条件付き書式に書き込みはあるようですが,思った動作になりません。

該当のSheet1には,

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Application.ScreenUpdating = True
End Sub

の記述いづれもしてあります。アドバイスいただけるとたすかります。

質問者からの補足コメント

  • お騒がせいたしました。

    大きな勘違いをしていました。

    Workbook_SheetSelectionChange は,Worksheet_SheetSelectionChange の間違いでした。

    思い込みで,細かい部分に目がいきませんでした。

    この変更で,思った動作になりました。

      補足日時:2025/01/11 20:21

A 回答 (2件)

>該当のSheet1には,


>Private Sub Workbook_SheetSelectionChange(ByVal Sh ~

これは、Sheet1のシートモジュールに、Workbook_SheetSelectionChangeイベントプロシジャを記述しているってことですか?
そもそもWorkbook_SheetSelectionChangeイベントプロシジャは、ThisWorkbookモジュールに記述するものなので、シートモジュールに書いても動かないような気がする。

質問の記載ミスでしょうか?
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

どうやら勘違いしていたようです。

Workbook→worksheet ですね

お礼日時:2025/01/11 13:47

こんばんは



なさりたいことが記述されていないので目的がよくわかりませんけれど、選択セルの行を色付けしたいってことでしょうか?


古い記事だと、CELL関数で第二引数を省略すると
 CELL("row")=row()
で、選択セルの行がTRUEになるようなことがかかれていますが、当方の環境ではそうはなりませんね。
最後に計算が発生した際のActiveCellが計算の対象となるようです。

一方で、Changeイベントで再設定しようとしているようですが、その方法を取るのなら
 >ScreenUpdating
ではなく、対象範囲に対して、
  Range.Calculate
を行えば、ActiveCellに対して再計算してくれるようになり、(多分)ご希望の動作になるのではないかと思います。
(ご希望が何なのかわからないので、推測ですけれど・・)

さらに言うなら、どうせChangeイベントで処理するのなら、条件付き書式などは使わずに、イベント内で対象セルに色付けをすれば済む話ではないでしょうか?
ただし、もともと色付けされているセルがあるような場合には、色付けをキャンセルする際に元の色に戻す必要が出てくるので少々厄介ですが、色付けセルがなければ一番簡単な方法と思います。

既存で色付けセル等が存在する場合には、当該セル範囲の書式を記録しておいて元に戻すという方法も考えられますが、少々面倒です。
当該行にだけ条件付き書式で色付けをするという方法も考えられますが、他に条件付き書式が設定されている場合にはキャンセルする際に設定した条件だけを削除しなければならないので、こちらもやや面倒です。
(ご提示のように、全部キャンセルしても良いのなら、面倒もなく簡単ですが)

作業セルを使っても良ければ、非表示の作業セルを空きセルに用意しておいて、事前に条件付き書式で
 Row()=作業セル
を設定しておき、Changeイベントで「作業セルにActiveCellの行番号を記入する」ようにしておけば、条件付き書式をいじる必要がなくなるので簡単になります。

なお、仮に条件付き書式を利用するにしても、ご提示のように
 >Private Sub Workbook_Open()
 >call きょうちょう
 >End Sub
のようなことを行うと、そのシートでは別の条件付き書式を設定してもキャンセルされてしまうことになりますけれど・・・
(実質的に、他の条件付き書式を利用できなくなる)


ちなみに、以下は、他のセルは色付けをキャンセルしても良いと想定した場合の一例です。
(シートのSelectionChangeイベントに設定します。)
(ご提示の条件付き書式は邪魔をするので、削除してください。)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Const Carea = "E1:H10" ' ←色付けの対象セル範囲

Range(Carea).Interior.Color = xlNone
If Not Intersect(ActiveCell, Range(Carea)) Is Nothing Then _
Intersect(ActiveCell.EntireRow, Range(Carea)).Interior.Color = rgbPowderBlue
End Sub
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

やりたかったのは,何よりも,VBAより条件付き書式を設定することです。

その過程でいろいろやりましたが,大きな勘違いで,おかしな動作をするのは当たり前でした。

worksheet と 記述 すべきところを workbookと記述していまして。

これで大きな疑問が解消です。

条件付き書式設定では,アクティブセルを含む行(列)を強調視することです。アドバイスの通り,条件付き書式を使わないと,アクティブセルの記憶,もとのアクティブセルの色を戻す,等と,処理ば煩雑になるので,条件付き書式をえらんだところです。

お騒がせしましたが,自己解決しました。

お礼日時:2025/01/11 20:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A