Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

エクセルVBAのイベントで質問です。

ある範囲のセルの色をダブルクリックにより変えていますが、 下の("D5:D50,F5:F50,K5:K50,M5:M50"))の範囲を例えばSheet1の A2以下に始めの範囲、B2以下に終りの範囲を下に書いていって、 対象とする範囲を可変にしたいのですが、どのようにすれば いいでしょうか。 例えば("D5:D50,F5:F50,K5:K50,M5:M50"))であれば A2に「D5」 B2に「D50」 A3に「F5」 B3に「F50」 などとセルにセル番地をいれておいて、コードを変えなくても シート上で範囲を変えていけるようにできないでしょうか。 やり方があれば教えてください。 よろしくお願いします。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim r As Range Set r = Intersect(Target, Range("D5:D50,F5:F50,K5:K50,M5:M50")) If r Is Nothing Then Exit Sub With r.Interior If .ColorIndex = xlNone Then .ColorIndex = 3 ElseIf .ColorIndex = 3 Then .ColorIndex = 4 ElseIf .ColorIndex = 4 Then .ColorIndex = xlNone End If End With Cancel = True End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

おはよう御座います ちょっとコード間違ってました >A2に「D5」 B2に「D50」 とあったので、合わしたつもりが Set r = Intersect(Target, Range(Range("a2").Value & ":" & Range("a3").Value)) では無く Set r = Intersect(Target, Range(Range("a2").Value & ":" & Range("b2").Value)) でした ごめん >例えばイベント範囲をG1:H9と一列飛んでJ1:K9としたい場合にも 対応できるでしょうか? を >A2に「D5」 B2に「D50」 >A3に「F5」 B3に「F50」 の方法で実現するんならば Set r = Intersect(Target, Range(Range("a2").Value & ":" & Range("b2").Value & "," _ & Range("a3").Value & ":" & Range("b3").Value)) で A2に「G1」 B2に「H9」 A3に「J1」 B3に「K9」 と言うことに成ります さらに、範囲の増減があった場合に不便なので Set r = Intersect(Target, Range(Range("a2").Value)) に置き換えて A2に G1:H9,J1:K9 と入力します こちらの方が、範囲の増減がしやすいのでお薦めです 例えば A1:C9 を追加したい場合 A2を A1:C9,G1:H9,J1:K9 とするだけですよ 説明わかりにくいですかね

newme
質問者

お礼

hige_082さんおはようございます。このようにしたいと思っていました。 Set r = Intersect(Target, Range(Range("a2").Value & ":" & Range("b2").Value & "," _ & Range("a3").Value & ":" & Range("b3").Value)) のところが全くわかりませんでしたが、このコードをお手本にして 範囲選択できるところを増やしていきたいと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3 さんのコードでよいのでしたら、こちらの解釈とは、かなり違うようですね。 >その指定した範囲をダブルクリックしたときに色が変わるように >したい、色を変えたい範囲が今後増えたり、範囲が変わっても >対応ができるようにしたいのです。 ということで、書き換えたのです。本来、ダブルクリック・イベントでは、1セルしかありません。範囲に対して作業するような書き方がありましたので、ダブルクリック・イベントに、複数のセルに対して可能するように設けました。 ダブルクリックだけでは、不可能なはずです。お求めになっていることに対して、私は、どうやら理解していないようですし、良く分からなくなりました。たぶん、この先、説明を受けても理解できる自信がありません。 なお、初歩的なことですが、モジュールの先頭に Dim ur As Range Dim TargetRange As Range を、モジュール・スコープの変数の宣言をしないと、イベントは正しく稼動しません。

すると、全ての回答が全文表示されます。
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

こんな感じでしょうか? ’------------------------------------------------------------ Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim r As Range Set r = Intersect(Target, Range(Range("a2").Value & ":" & Range("a3").Value)) If r Is Nothing Then Exit Sub With r.Interior If .ColorIndex = xlNone Then .ColorIndex = 3 ElseIf .ColorIndex = 3 Then .ColorIndex = 4 ElseIf .ColorIndex = 4 Then .ColorIndex = xlNone End If End With Cancel = True End Sub ’------------------------------------------------------------ Set r = Intersect(Target, Range("D5:D50,F5:F50,K5:K50,M5:M50")) を Set r = Intersect(Target, Range(Range("a2").Value & ":" & Range("a3").Value)) にしただけです ということは Set r = Intersect(Target, Range(Range("a2").Value)) としておいて セルA2に D5:D50,F5:F50,K5:K50,M5:M50 もありです 色々アレンジしてみてください

newme
質問者

お礼

hige_082さんありがとうございました。シート上から範囲を変えることができました。ひとつだけやり方がわからないことがあります。 離れた範囲の指定ですが、 例えばイベント範囲をG1:H9と一列飛んでJ1:K9としたい場合にも 対応できるでしょうか?何度かいろいろ範囲を入れてやってみたのですが、I列も色が変わってしまいました。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >その指定した範囲をダブルクリックしたときに色が変わるように 通常のダブルクリック・イベントは、範囲を指定しても、それだけでは、セルひとつしか選択できません。それでは、範囲がなくなってしまいます。そこで、イベントを組み合わせますが、私がいつも使っているダブルクリック・イベントでも、確実にセルにヒットしないと、ショートカット(枠線をダブルクリックしてはいけません)が働いてしまいますので、どんなものでしょうね。なかなか、複雑な内容で、実用には少し疑問を持っています。 'シートモジュール Dim ur As Range Dim TargetRange As Range Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)   Dim c As Variant   Cancel = True   If ur Is Nothing Then     If TargetRange Is Nothing Then       Coloring Target     End If   ElseIf TargetRange.Count > 1 Then     Coloring TargetRange   End If   Set ur = Nothing   Set TargetRange = Nothing End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not ur Is Nothing Then Exit Sub MakeRange If Not Intersect(Target, ur) Is Nothing Then   Set TargetRange = Intersect(Target, ur) End If End Sub Function MakeRange() Dim c As Range   For Each c In Range("A2", Range("A65536").End(xlUp))     If ur Is Nothing Then       Set ur = Range(c.Value, c.Offset(, 1).Value)     Else       Set ur = Union(ur, Range(c.Value, c.Offset(, 1).Value))     End If   Next c End Function Sub Coloring(TargetRange As Range) Dim c As Variant   For Each c In TargetRange     With c.Interior       If .ColorIndex = xlNone Then         .ColorIndex = 3       ElseIf .ColorIndex = 3 Then         .ColorIndex = 4       ElseIf .ColorIndex = 4 Then         .ColorIndex = xlNone       End If     End With   Next c End Sub

newme
質問者

お礼

Wendy02さんありがとうございました。そのままコピーして、実行して試させていただきましたが、うまく動作させることができませんでした。やり方が悪いのでしょうか・・・。もう少し考えてみます。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 そこまで出来ているのだから、頑張って自力でやったほうが良いような気もしますが。自分でできるはずです。もしかしたら、違うかもしれませんが、A2 または、A3 をダブルクリックしたら色が変わるようになっています。 '----------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim a As String Dim b As String Dim r As Range Dim c As Variant If Target.Address(0, 0) <> "A2" And _   Target.Address(0, 0) <> "A3" Then Exit Sub   a = Range("A2").Value   b = Range("A3").Value  On Error Resume Next  Set r = Range(a & ":" & b)  If Err.Number > 0 Then Exit Sub  On Error GoTo 0  If Not r Is Nothing Then   For Each c In r   With c.Interior     If .ColorIndex = xlNone Then       .ColorIndex = 3     ElseIf .ColorIndex = 3 Then       .ColorIndex = 4     ElseIf .ColorIndex = 4 Then       .ColorIndex = xlNone     End If   End With   Next c  End If  Cancel = True End Sub

newme
質問者

お礼

ありがとうございました。いつもすばらしい回答拝見しております。 説明不足でしたが、 A2に「D5」 B2に「D50」 A3に「F5」 B3に「F50」 というのは A2に「D5」(範囲のはじまり)、 B2に「D50」(範囲のおわり) 以下にもA列に範囲のはじまり、B列に範囲のおわり を書く欄を設けて、 A2やA3をクリックしたときにイベントが発生ではなくて、 その指定した範囲をダブルクリックしたときに色が変わるように したい、色を変えたい範囲が今後増えたり、範囲が変わっても 対応ができるようにしたいのです。 そこまで、可変に対応するというのはいくらVBAでも・・・ でしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A