• 締切済み

エクセル SelectionChangeイベントにおけるIF関数について

Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = Range("A1") Then Range("H2:H10").Copy Range("B2:B10").PasteSpecial Paste:=xlPasteAll 'A1選択時、H2:H10範囲をコピーして、B2:B10にペイスト ElseIf Target.Address = Range("A2") Then Range("H11:H19").Copy Range("B2:B10").PasteSpecial Paste:=xlPasteAll 'A2選択時、H11:H19範囲をコピーして、B2:B10にペイスト ElseIf Target.Address = Range("A3") Then Range("H20:H28").Copy Range("B2:B10").PasteSpecial Paste:=xlPasteAll 'A3選択時、H20:H28範囲をコピーして、B2:B10にペイスト Else Range("B2:B10").Select Selection.ClearContents With Selection .MergeCells = False 'セルを結合する .ShrinkToFit = False '縮小して全体を表示する .HorizontalAlignment = xlGeneral '横位置 .VerticalAlignment = xlBottom '縦位置 .Font.Size = 12 '文字サイズ .Font.Bold = False '文字太字 .Interior.ColorIndex = 0 .Borders.LineStyle = False End With 'A1A2A3以外のセルを選択時、B2:B10範囲の値及び書式設定をすべてクリアする End If End Sub 上記SelectionChangeイベントがうまく動作しません。 どこが問題かご教示ください。 もし可能であれば、正解文をご教示頂けると大変助かります。 よろしくお願いします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.6

>If Target.Address = Range("A1") Then の前に Msgbox Target.Address と入れてみてご覧。どう表示されるか。$A$1のような文字列が表示されるだろう。それとRange("A1")ーー>Range("A1")の値(VALUEの省略形)と比べてどうする。意味を成さない。質問者の誤解がある。

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

こんばんは。 私は、あまり丁寧に教えるつもりはないけれど、あれこれ言ったら、混乱してしてしまいますのでポイントだけ書きます。 If Target.Address = Range("A1").Address Then   と If Target.Address = "$A$1" Then どちらが良いかというと、文字列のままのほうがよいです。 VBAでは、文字を省略したり、短くする原則があります。ただし、読みにくくするのは、あまり勧められませんが、それは、ベテランでも議論の残るところです。また、Me キーワードは、私は、通常、インテリセンスで通常使わないプロパティを出すときに使いますが、原則論としては使いません。 'A1A2A3以外のセルを選択時、B2:B10範囲の値及び書式設定をすべてクリアする 私は、Clear メソッドはあまり使いません。ClearContents か、ClearFormats のどちらかですから、以下は、二つを使いました。 '---------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range)   Application.EnableEvents = False   With Range("B2:B10")     If Target.Address = "$A$1" Then       Range("H2:H10").Copy .Cells     ElseIf Target.Address = "$A$2" Then       Range("H11:H19").Copy .Cells     ElseIf Target.Address = "$A$3" Then       Range("H20:H29").Copy .Cells     Else       .ClearContents       .ClearFormats     End If   End With   Application.EnableEvents = True End Sub

nkgw_4a_t
質問者

お礼

ご回答ありがとうございます。 値及び書式設定をクリアするのに、.ClearContents .ClearFormats を使えるのですね。大変勉強になりました。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

取り合えず 'A1選択時、H2:H10範囲をコピーして、B2:B10にペイスト ならば If Target.Address = Range("A1").Address Then ・・ として比較してください。 だけど、その部分を訂正して試しましたが、何をやりたいのかわかりませんでした。 コピィしたあとにRange("B2:B10").PasteSpecial Paste:=xlPasteAll を実行したときに、再度、イベントが実行されて、結局、B2:B10もクリアされてしまいます。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = Range("A1").Address Then Range("B2:B10").Value = Range("H2:H10").Value 'A1選択時、H2:H10範囲をコピーして、B2:B10にペイスト ElseIf Target.Address = Range("A2").Address Then Range("B2:B10").Value = Range("H11:H19").Value 'A2選択時、H11:H19範囲をコピーして、B2:B10にペイスト ElseIf Target.Address = Range("A3").Address Then Range("B2:B10").Value = Range("H20:H28").Value 'A3選択時、H20:H28範囲をコピーして、B2:B10にペイスト Else Range("B2:B10").Clear 'A1A2A3以外のセルを選択時、B2:B10範囲の値及び書式設定をすべてクリアする End If End Sub としてみましたが、ご希望の操作でしょうか?

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

[回答番号:No.1] の DOUGLAS_ です。 >上記以外は検証しておりませんので  書き忘れましたが、イベント を組む場合の基本として、コードの前後を Application.EnableEvents = False Application.EnableEvents = True で挟むことも、基本です(どこに書くかはお考えください)。

nkgw_4a_t
質問者

お礼

ご返答遅くなりました。 大変丁寧なご回答ありがとうございました。 No.1,3共に大変参考になりました。

  • Randomize
  • ベストアンサー率70% (38/54)
回答No.2

問題点は2つあります 1個目は3箇所ありますが、 If Target.Address = Range("A1") Then この部分です。左辺と右辺で調べているものが違います。左辺はAddressプロパティーを指定しているのでA1でしたら$A$1が左辺の内容になります。一方、右辺はプロパティーを省略しています。この場合は規定プロパティーとしてValueプロパティーが呼び出されます。よって、A1ですとA1セルに書き込まれている内容が右辺に来てしまいます。 比べるものが違うので一致することはまずありません。それが原因で条件分岐に枝分かれしてくれないのです。3箇所を If Target.Address = Range("A1").Address Then と変更してください。 2個目は潜在的に見えないバグが存在します。これはプログラマーとしてのセンスを感じられるようになると理解できるのですが、H列の内容をコピーしようとしていますよね。でもコピーすると言うことはセルの選択範囲を指定して選択範囲が移動していることになるのです。貼り付けのときも同じです。このときにA1~A3の条件に合わないからElseの処理が行われてしまうのです。ですので問題点1のみを直しても結局は目的の動作ができません。 これを簡単に直すのであればプロシージャーの間はEnableEventsプロパティーをFalseにしてイベントをとめてください。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.EnableEvents = False ・・・・・・・中略・・・・・・・ Application.EnableEvents = True End Sub この2個を改善すると動くようになると思います。 なお、補足。Elseの部分も下のように直すのがベターです。Selectionは極力使わないようにしましょう。 ---------------------ここから------------------------ Else With Me.Range("B2:B10") .ClearContents 'テキストのみを消去する .MergeCells = False 'セルの結合を解除する .ShrinkToFit = False '縮小して全体を表示するのチェックをはずす .HorizontalAlignment = xlGeneral '横位置を「標準」にする .VerticalAlignment = xlBottom '縦位置を「下揃え」にする .Font.Size = 12 '文字サイズ .Font.Bold = False '文字太字を解除する .Interior.ColorIndex = 0 .Borders.LineStyle = False End With 'A1A2A3以外のセルを選択時、B2:B10範囲の値及び書式設定をすべてクリアする End If ---------------------ここまで------------------------ でも、そもそも値と書式の両方をクリアするのであれば Else Me.Range("B2:B10").Clear End If で事足りそうですね。

nkgw_4a_t
質問者

お礼

ご返答遅くなりました。 大変丁寧なご回答ありがとうございました。 大変参考になりました。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

 先ず、お示しのコードは 標準モジュール などではなくて シートモジュール に記述していらっしゃいますよね? If Target.Address = Range("A1") Then の行で [F9] キーを押下して ブレークポイント を設定し VBE を閉じてからマウスで セルA1 を選択してみてください。  すると、VBE が開いて If Target.Address = Range("A1") Then の行が黄色になりますが、このとき、「Target.Address」の上にマウスをあてると Target.Address = "$A$1" と表示されませんか?  ということで、 Target.Address = Range("A1") という表示はおかしいですね。  強いて書けば Target.Address = Range("A1").Address ですが、普通は If Target.Address = "$A$1" Then ですね。  イベントの時は [F8] キーを押下しても ステップ イン デバッグ できないようですので、ブレークポイント を設定しておいて、その後、[F8] キーを押下しながら ステップ イン デバッグ なさってみてください。 >もし可能であれば、正解文をご教示頂けると大変助かります。  上記以外は検証しておりませんので、先ず、上記を直してからご自分で考えてみられてはいかがでしょうか?

関連するQ&A