
ワークシート上の名前を定義された特定の個所(結合セル)を選択すると、その部分が黄色く変わるマクロです。
一応、動くのですが、例えば印刷範囲を選択などしてしまうと印刷範囲すべてが黄色くなってしまいます。
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
No.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
No.5
- 回答日時:
こんばんは。
今、私のほうでは、余裕がないので試行錯誤するということが出来ません。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) のような措置を加えなくてはならないように思いますが。
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
No.4
- 回答日時:
ちょこっと手抜きしてありますが、、質問の件であれば上手くいきます。
'----------------------------------------------------------
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
'----------------------------------------------------
以上です。
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でした。
No.3
- 回答日時:
いまいち不明な部分がありますので、細かいことまで考えてしまいます。
(^^;;;会社名_____物件___
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 を選択したら、色付けしない
そこら辺りが明確に分かると回答しやすいかも。
何度も有難うございます。(o。_。)oペコッ
一つの「名前の定義」には範囲は一つしかありません。
例えば、A1:C1を結合して「会社名」
A2:C2を結合して「電話番号」
A3:C3を結合して「物件」
E1単独セルで「日付」
E2単独セルで「売上高」 といった感じです。
ですから「会社名」を選択すれば「会社名」(A1:C1結合セル)が、「日付」を選択すれば「日付」(E1単独セル)が黄色になり、選択されていない名前の定義は白くなって欲しいのです。
ご教示のコードでもそれは実現していますが、仮にシート全体を選択すれば、すべての名前の定義が黄色くなります。
こんな場合や、複数の名前の定義を選択したような場合には、イベントが発生しないようにしたいのです。
よろしくお願い申し上げます。
No.2
- 回答日時:
こんにちは。
名前-登録を使用しているので、厳密には状況は読めないのですが、たぶん、複数の場所を選択するときには、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
ありがとうございます。
Target.Interior.ColorIndex = 6 は
myRng.Interior.ColorIndex = 6 ですよね?(そうしないと選択した部分が全部黄色になります)
で、それでやったのですが、やはりPrintAreaを選択すると会社名,日付,物件,電話番号,売上高,店名,担当者がすべて黄色になってしまいます。(それらはすべてPrintArea内です)
No.1
- 回答日時:
>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は変数で受けた方がベターだと思われます。
以上。
さっそくありがとうございます。
ご指摘ありがとうございます。そのとおりでした。
ただ、ご教示のコードでも、仮に全セル選択や印刷範囲選択をやった場合、Range( "会社名,日付,物件,電話番号,売上高,店名,担当者")のすべてが黄色になってしまいます。
名前を定義された6つある結合セル範囲のなかのどれか一つだけが選択された場合のみ、このマクロが作動するようにするにはどう書けばよいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) エクセルのイベントプロシージャーでF列の最終行のセルの入力をトリガーにしたいのですが 1 2022/10/14 09:36
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) エクセル VBAで複数セル選択時エラーになる問題 3 2022/10/04 02:40
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで連続データから、数...
-
excelで、スクロールをすると限...
-
Excel 小さくなったスクロール...
-
セルをクリックすると付箋のよ...
-
複数のセルの入力内容を一度に...
-
エクセル 画面上の行数を調節...
-
EXCEL アルファベットと数字の...
-
エクセルの画面で十字マークが...
-
エクセル 数値を全て「1」にす...
-
Excelで表のデータを並び替えた...
-
excelで1行ごとに一気に削除す...
-
エクセルでカーソルが四方に矢...
-
エクセルで、結合したセルを選...
-
列選択で勝手に広範囲に範囲選...
-
エクセルで任意のセルをクリッ...
-
エクセルVBAリストボックスに表...
-
Excelでセル範囲指定でデータを...
-
ピポットテーブルエラー解決方法
-
セルを斜めに選択してカットする
-
フィルタを解除した後の表示位置
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
excelで、スクロールをすると限...
-
エクセルで連続データから、数...
-
EXCEL アルファベットと数字の...
-
複数のセルの入力内容を一度に...
-
エクセルの画面で十字マークが...
-
Excel 小さくなったスクロール...
-
セルをクリックすると付箋のよ...
-
エクセル 画面上の行数を調節...
-
エクセル 数値を全て「1」にす...
-
エクセルでハイパーリンクのU...
-
excelで1行ごとに一気に削除す...
-
エクセルで、結合したセルを選...
-
Excelで表のデータを並び替えた...
-
エクセルで任意のセルをクリッ...
-
エクセルVBA 複数行にまたがっ...
-
エクセルでカーソルが四方に矢...
-
エクセルで0を除いて昇順に並...
-
Excel選択を繰り返すとセルの色...
-
ピポットテーブルエラー解決方法
-
エクセルで1つおきに列を削除...
おすすめ情報