重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

ワークシート上の名前を定義された特定の個所(結合セル)を選択すると、その部分が黄色く変わるマクロです。
一応、動くのですが、例えば印刷範囲を選択などしてしまうと印刷範囲すべてが黄色くなってしまいます。

If Target.Count >1 then Exit Sub だと、結合セルに名前を定義しているので、一ヶ所だけ選択しても色が変わらなくなります。
   If Selection.Areas.Count >1 then Exit Sub だと、一遍に連続した範囲を選択してもAreasは1ですからだめです。
   Range( "会社名,日付,物件,電話番号,売上高,店名,担当者")の6つの名前を定義された結合セル範囲のなかのどれか一ヶ所だけが選択された場合のみ作動するようにするにはどう書けばよいのでしょうか?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Set Rng = Range( "会社名,日付,物件,電話番号,売上高,店名,担当者")
If Intersect(Target, Rng) Is Nothing Then Exit Sub

Rng.Interior.ColorIndex = 2
Selection.Interior.ColorIndex = 6

End Sub

A 回答 (6件)

こんにちは。


>If Target.Count >1 then Exit Sub だと、結合セルに名前を定義しているので、一ヶ所だけ選択しても色が変わらなくなります。
>If Selection.Areas.Count >1 then Exit Sub だと、一遍に連続した範囲を選択してもAreasは1ですからだめです。
ここの着眼点は間違ってないですね。
単純にRng(.Cells).Countで判定すれば良いと思います。(縦方向の結合セルにも対応)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim Rng As Range
  
  With Range("XXX,YYY,ZZZ")
    .Interior.ColorIndex = xlNone
    Set Rng = Intersect(Target, .Cells)
  End With
  If Not Rng Is Nothing Then
    If Rng.Count = 1 Then Rng.Interior.ColorIndex = 6
    Set Rng = Nothing
  End If
End Sub
    • good
    • 0
この回答へのお礼

end-uさま、ありがとうございました。

完璧です。助かりました。

お礼日時:2008/04/10 09:39

こんばんは。



今、私のほうでは、余裕がないので試行錯誤するということが出来ません。VBAでは、不得意とする、「結合セル」と「名前登録」の両方があるのでは、難しいです。

>PrintAreaを選択すると
なぜ、それが関係しているのか分からないです。

myRng.Areas(1).Cells.Count = 1
選択した範囲のセルの数が、1個ではないわけですから、myRng.MergeCells が、True になるということですね。そこらへんが、こちらの想定した内容とは、想像が付きません。Version が違うと、判定が違ってくるのかな?何か、ありえないような気がしてくるのです。

Set myRng = Intersect(Target, rng)

こちらでは、内容は読めませんから、早い話、ここで、内容をチェックして、その内容から、どういう性質のものを除外するのを決めればよいのではないでしょうか?

たとえば、MsgBox myRng.Address で、違う内容を判定する材料を決めればよいと思います。

ただ、結合セルも単純にひとつの範囲でないとすれば、それは、難しいですね。そういう、「名前登録」というもので判定する、設定範囲任せのマクロを作ったことがありません。前にも書いたような気がしますが、Select した範囲から、逆に名前を判定するというようなことは、ひどくややこしいと思います。私なら、何らかの状況によっては、それは、エラーを招くので、そのようなコードの作り方はしないというだけです。

それに、
Target.Interior.ColorIndex = 6 が、その手前で、正しく除外しているなら、MyRng もTarget も同じはずですね。

Target で、色が全部変わるというのは、除外判定の論理が違っていることでしょうけれども、myRng.MergeCells が、True で、抜けてしまうということを考えると、今の段階では、見当が付かないです。Null で抜けてしまうとしたら、n = MyRng.MargeCells -> (Not IsNull(n) And n) のような措置を加えなくてはならないように思いますが。
    • good
    • 0
この回答へのお礼

Wendy02さま、何度も有難うございます。
以下のコードで目的を達しました。
いつもお世話様です。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim myRng As Range
Dim rng As Range
Set rng = Range("会社名,日付,物件,電話番号,売上高,店名,担当者")
Set myRng = Intersect(Target, rng)
If Not myRng Is Nothing Then
' If myRng.MergeCells Or myRng.Areas(1).Cells.Count = 1 Then
If myRng.Count = 1 Then
rng.Interior.ColorIndex = xlNone
myRng.Interior.ColorIndex = 6
End If
End If
Set myRng = Nothing
Set rng = Nothing
End Sub

お礼日時:2008/04/10 09:34

ちょこっと手抜きしてありますが、、質問の件であれば上手くいきます。



'----------------------------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim Rng As Range
 Dim myRange As Range
 Dim N As long

 Set Rng = Range("会社名,日付,物件,電話番号,売上高,店名,担当者")

 Rng.Interior.ColorIndex = xlNone

 Set myRange = Intersect(Target, Rng)
  If myRange Is Nothing Then Exit Sub
  With myRange
   For N = 1 To .Cells.Count - 1
    If .Cells(N).MergeArea.Address <> .Cells(N + 1).MergeArea.Address Then Exit Sub
   Next N
  End With

'''  Rng.Interior.ColorIndex = xlNone
  myRange.Interior.ColorIndex = 6
End Sub
'----------------------------------------------------
 
以上です。
 
    • good
    • 0
この回答へのお礼

onlyromさま、ご教示のコードでうまく行きました。
ありがとうございました。

With myRange
For N = 1 To .Cells.Count - 1
If .Cells(N).MergeArea.Address <> .Cells(N + 1).MergeArea.Address Then Exit Sub
   Next N
End With
myRange.Interior.ColorIndex = 6

の部分を
If myRange.Count = 1 Then myRange.Interior.ColorIndex = 6
としてみてもOKでした。

お礼日時:2008/04/10 09:30

いまいち不明な部分がありますので、細かいことまで考えてしまいます。

(^^;;;

会社名_____物件___
B4(結合) __C4___
B5______C5___
B6(結合) __C6___
B7______C7___
B8(結合) __C8___
B9______C9___


(名前)
会社名(B4:B9)2セルずつ結合
物 件(C4:C9)結合なし


上記のような表の場合でお訊ねします。

●選択範囲に名前付きセルが、1つ、入っていた場合にそのセルに色付けするということですか?

 A8:B10を選択したら、B8(:B9)に色付け
 C9:F10を選択したら、C9に色付け

●それとも完全に名前付きセルのみ、1つ、選択したら色付けということですか?

 B6(:B7)のみ選択したら、色付け
 C8 のみ選択したら 色付け
 B6:C7 を選択したら、色付けしない

そこら辺りが明確に分かると回答しやすいかも。
 
 
    • good
    • 0
この回答へのお礼

何度も有難うございます。(o。_。)oペコッ

一つの「名前の定義」には範囲は一つしかありません。
例えば、A1:C1を結合して「会社名」
A2:C2を結合して「電話番号」
A3:C3を結合して「物件」
E1単独セルで「日付」
E2単独セルで「売上高」  といった感じです。

ですから「会社名」を選択すれば「会社名」(A1:C1結合セル)が、「日付」を選択すれば「日付」(E1単独セル)が黄色になり、選択されていない名前の定義は白くなって欲しいのです。
ご教示のコードでもそれは実現していますが、仮にシート全体を選択すれば、すべての名前の定義が黄色くなります。
こんな場合や、複数の名前の定義を選択したような場合には、イベントが発生しないようにしたいのです。

よろしくお願い申し上げます。

お礼日時:2008/04/09 16:15

こんにちは。



名前-登録を使用しているので、厳密には状況は読めないのですが、たぶん、複数の場所を選択するときには、MergCells プロパティの値は、正しく返らないはずですから、それを応用すればよいのではありませんか?
また、それ以外のArea の場合には、Cells の数を数えればよいと思います。

-------------------------------------

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim myRng As Range
Dim rng As Range
Set rng = Range("会社名,日付,物件,電話番号,売上高,店名,担当者")
Set myRng = Intersect(Target, rng)
 If Not myRng Is Nothing Then
  If myRng.MergeCells Or myRng.Areas(1).Cells.Count = 1 Then
   rng.Interior.ColorIndex = xlNone
   Target.Interior.ColorIndex = 6
  End If
 End If
Set myRng = Nothing
Set rng = Nothing
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。

Target.Interior.ColorIndex = 6 は
myRng.Interior.ColorIndex = 6 ですよね?(そうしないと選択した部分が全部黄色になります)

で、それでやったのですが、やはりPrintAreaを選択すると会社名,日付,物件,電話番号,売上高,店名,担当者がすべて黄色になってしまいます。(それらはすべてPrintArea内です)

お礼日時:2008/04/09 15:48

>Selection.Interior.ColorIndex = 6



こんなことをすれば、選択範囲が無条件に塗りつぶされるのでは?
Intersect(Target, Rng)で取得したセルだけ塗ればいいと思いますが。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim rng As Range
 Dim myRange As Range
 Set Rng = Range( "会社名,日付,物件,電話番号,売上高,店名,担当者")
 Set myRange = Intersect(Target, rng)
 If myRange Is Nothing Then Exit Sub
 rng.Interior.ColorIndex = xlNone
 myRange.Interior.ColorIndex = 6
End Sub
'------------------------------------------

Intersectは変数で受けた方がベターだと思われます。
以上。
 
    • good
    • 0
この回答へのお礼

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

ご指摘ありがとうございます。そのとおりでした。
ただ、ご教示のコードでも、仮に全セル選択や印刷範囲選択をやった場合、Range( "会社名,日付,物件,電話番号,売上高,店名,担当者")のすべてが黄色になってしまいます。

名前を定義された6つある結合セル範囲のなかのどれか一つだけが選択された場合のみ、このマクロが作動するようにするにはどう書けばよいのでしょうか?

お礼日時:2008/04/09 11:33

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