• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい)

エクセルマクロで複数列のセルを選択した時でも正しく動作する方法

このQ&Aのポイント
  • エクセルマクロを使用して、複数列のセルを選択した場合にも正しく動作するようにする方法を探しています。
  • 現在、3列目に入力された値によって15列から17列の値を自動入力するマクロを作成しましたが、1列目から3列目までのセルにペーストすると正しく動作しない問題があります。
  • 修正方法を教えてください。

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

  • ベストアンサー
回答No.1

>If Target.Column <> 3 Then Exit Sub これだと、変更した領域の左上隅のセルが「3列目以外」だと何もしません。 >1列目から3列目のセルにペーストすると であれば、変更した領域の左上のセルが「1列目」つまり「3列目以外」ですから、何もしません。 ですので「変更領域の左隅が3列目より右にある」または「変更領域の右隅が3列目より左にある」と言う判断をしなければなりません。 また「変更された範囲が複数列に渡る場合」を考慮して「For Eachの中で、r1が3列目を指している時だけ処理する」という制限も必要です。 その2点を踏まえて修正すると、以下のようになります。 Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column > 3) Or (Target.Column + Target.Columns.Count < 4) Then Exit Sub For Each r1 In Selection If r1.Column = 3 Then If r1.Cells(1, 1) <> "部品表" Then Cells(r1.Row, 15) = "-" Cells(r1.Row, 16) = "-" Cells(r1.Row, 17) = "-" End If End If Next End Sub

toshi_2000
質問者

お礼

ありがとうございます。 意図した動作になりました。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

修正例: private sub Worksheet_Change(byval Target as excel.range)  dim h as range  application.enableevents = false  on error resume next  for each h in application.intersect(target, range("C:C"))   if h <> "部品表" then    h.offset(0, 12).resize(1, 3) = "-"   end if  next  application.enableevents = true end sub 今は >3列目のみのセルをペーストすると の部分を  If Target.Column <> 3 Then Exit Sub のようにして担保しています。 いまのマクロは比較的間違いのない,そこそこ良いプログラムになっています。 それを直そうというのですから >正しく動作します 「正しい」とは一体どういう動作なのか,漏れや間違いの無いようちゃんとあなたが見直さないといけませんね。

toshi_2000
質問者

お礼

回答ありがとうございます。

関連するQ&A

専門家に質問してみよう