• ベストアンサー

Range型とチェンジイベント

特定のセルに値を入力されると、対象セルの横のセルに数式を代入するエクセルを組んでいます。 セルの内容がクリアされた場合は数式もクリアする形で考えているのですが、 ドラッグしてまとめてクリアすると[型が一致していない]というようなエラーが出てしまいます。 入力されたセルの監視はRange型の変数を用い、ターゲットセルが範囲内にいるかどうかで分岐させています。 対処法をご存知であれば、ご指導よろしくお願いします。 以下にソースを抜粋いたします。 ---------------------------- Set Name_R = _ Worksheets("main").Range(Cells(6, 3), Cells(Point, 3)) Set NT_R = Intersect(Target.Cells, Name_R) If NT_R Is Nothing Then ' Application.EnableEvents = True GoTo Name_END Else If Target.Cells.Value = "" Then Target.Cells.Offset(0, 2).FormulaR1C1 = "" Target.Cells.Offset(0, 3).FormulaR1C1 = "" Target.Cells.Offset(0, 11).FormulaR1C1 = "" ' Application.EnableEvents = True Else Target.Cells.Offset(0, 2).FormulaR1C1 = Range("Z6").FormulaR1C1 Target.Cells.Offset(0, 3).FormulaR1C1 = Range("AA6").FormulaR1C1 Target.Cells.Offset(0, 11).FormulaR1C1 = Range("AB6").FormulaR1C1 ' Application.EnableEvents = True End If End If Name_END: ----------------------------

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

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

こんばんは。 >以下にソースを抜粋いたします。 ということは、もっと他にもコードがあるということですね。ちょっと、どうなるか分からないです。 イベントの場合は、出だしぐらいは見せてくださいね。そうしない、それを想定して書かなくてならなくなります。 それと、以下の部分が良くありません。マクロを不安定にさせてしまいます。ただ、今回は、そのままにしています。R1C1にする必要があるのか、良く分かりません。本来は、FormulaLocal の方がよいのですが、数式の受け渡しそのものなら、Formla プロパティだけでも良いです。 >Target.Cells.Offset(0, 2).FormulaR1C1 = Range("Z6").FormulaR1C1 >Target.Cells.Offset(0, 3).FormulaR1C1 = Range("AA6").FormulaR1C1 >Target.Cells.Offset(0, 11).FormulaR1C1 = Range("AB6").FormulaR1C1 それと、Point という識別子があったような気がしますから、定数(Const)をiPointにさせて頂きました。 また、「_ 」アンダーバーは、経験的に読みにくく編集しにくくなるので、変えました。 ループは以下のようにすればよいのですが、Target をそのまま、ループに当ててしまうと、不要な部分も含まれる可能性がありますので、Intersect で、重なる部分だけを変数に取りました。 '------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)   Const iPoint As Long = 20   Dim NtR As Range   Dim c As Range   Set NtR = Intersect(Target, Range("C6", Cells(iPoint, 3))) 'クロスレンジ   If NtR Is Nothing Then Exit Sub   Application.EnableEvents = False   Application.ScreenUpdating = False   For Each c In NtR '←ここ     With c       If .Value = "" Then         .Offset(, 2).ClearContents         .Offset(, 3).ClearContents         .Offset(, 11).ClearContents       Else         On Error Resume Next 'エラー発生の可能性あり         .Offset(, 2).Formula = Range("Z6").Formula         .Offset(, 3).Formula = Range("AA6").Formula         .Offset(, 11).Formula = Range("AB6").Formula         On Error GoTo 0       End If     End With   Next c   Set NtR = Nothing   Application.ScreenUpdating = True   Application.EnableEvents = True End Sub ----------------------------------------

iai_x-sel
質問者

お礼

丁寧な回答、ありがとうございます。 勉強になりました。 回答していただいたソースで正常に動作しましたので、意味を理解したうえで使用させていただきたいと思います。 ソースの抜粋に関してですが 今回相談させていただいたソースとは別の条件を見て分岐させる、という内容のもので、 今回のソースとは関連が無いために省きました。 誤解を招く記述、申し訳ありませんでした。 またR1C1形式についてですが 左辺についてはR1C1形式にする必要がありませんでした。 不勉強、申し訳ありません。 右辺についてはZ6~AA6にvlookup関数が格納されており C6,C7,C8・・・に入っている値を見て所定の内容を表記させるものとなっているためR1C1形式にしています。 本当にありがとうございました。

その他の回答 (1)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = "" Then MsgBox "Hello" End Sub とやっただけで、エラーが再現しますね。 理屈は説明できませんが、複数セル選択の場合、Target.Valueは配列ですので、 Target.Value = "" の代入のイコールは成立し、VBAは配列の各要素に""を代入してくれるのですが、 If Target.Value = "" の論理演算のイコール(C言語なら==と2個書くところ)は、許容しませんという事じゃないでしょうか。 下記のような方法ではいかがですか。ご参考まで。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim myRange As Range Application.EnableEvents = False For Each myRange In Target If myRange.Value = "" Then myRange.Offset(0, 1) = "" Next myRange Application.EnableEvents = True End Sub

iai_x-sel
質問者

お礼

ご回答ありがとうございます。 >複数セル選択の場合、Target.Valueは配列ですので 付け焼刃で作成しているので、こういった内容は知りませんでした。 勉強になります。 ありがとうございました。

関連するQ&A