こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBA Changeイベントのエラー

エクセルで簡単な計算書を作成しています。(マクロ初心者)
ちなみにこのコードは自分で作成したものではなく、人から聞いていじってみました。

Private Sub Worksheet_Change(ByVal Target As Range)
'一度に複数セルの値が変更された場合は終了
'(A5:C5を選択しDeleteも含みます。)
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Me.Range("H170:K170", "H171:K171","C76")) Is Nothing Then Exit Sub

Application.EnableEvents = False
'数値かつ空白以外の場合
If IsNumeric(Target.Value) And Target.Value <> "" Then
Me.Range("M170").Formula = "=if(iserror(H170*I170*J170*K170),""-"",H170*I170*J170*K170)"
'空白の場合
ElseIf Target.Value = "" Then
Me.Range("H170:K170,M170").Value = "-"
End If
Application.EnableEvents = True


Application.EnableEvents = False
'数値かつ空白以外の場合
If IsNumeric(Target.Value) And Target.Value <> "" Then
Me.Range("M171").Formula = "=if(iserror(H171*I171*J171*K171),""-"",H171*I171*J171*K171)"
'空白の場合
ElseIf Target.Value = "" Then
Me.Range("H171:K171,M171").Value = "-"
End If
Application.EnableEvents = True


Application.EnableEvents = False
'空白の場合
If Target.Value = "" Then
Me.Range("D76:K76","C76").Value = "-"
End If
Application.EnableEvents = True

End Sub

H170、I170、J170、K170のどれかに数値の入力があった場合、M170に計算式を入力。
H170、I170、J170、K170のどれかの値をDELETEキーでクリアした場合、H170、I170、J170、K170、M170に"-"を入力。

その他に似たような処理がたくさん出てくるので、H171の処理とC76をDELETEキーでクリアした場合の処理を自分で考えて作ってみたのですが、うまく実行されません。H171~の処理はうまくいったので単純にコードをどんどん追加していけば動くと思ったんですが、いろいろ調べてもどうも方法がわからず進みません・・・
解決してもらえるでしょうか・・

投稿日時 - 2009-05-14 10:20:35

QNo.4957572

すぐに回答ほしいです

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

こんにちは。

私としては、#1の補足の内容は、あまり理解できていません。

>C76をDeleteした場合、D76:K76, C76に"-"を入力し、値が入力された場合はなにもしないというような処理をしたいです。
Me.Range("D76:K76", "C76").Value = "-" というのは、   Range("C76:K76").Value = " -" という意味だと思います。

>If Intersect(Target, Me.Range("H170:K170", "H171:K171","C76"))
これ自体も、そのままで理解したら、
If Intersect(Target, Range("C79::K171"))
ということだと思います。しかし、どうも違うような気がします。
本来は、ここら辺自体も説明が必要なのです。

もし、エリアが複数に分かれるなら、Range("H170:K170, H171:K171 ,C76") ということです。
もう、ここらは基本的なことですから、あまり細々教えることでもないとは思いますが。

私は、掲示板では、依頼に応じて、何度も作り直すということは、私はしていないのですが、これを見れば分かっていただけると思います。

--------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long
  Dim j As Long
  If Target.Count > 1 Then Exit Sub
  
  If Intersect(Target, Range("H170:K180, C76")) Is Nothing Then Exit Sub
  i = Target.Row: j = Target.Column '行と列数を取得
  Application.EnableEvents = False
  
  If IsNumeric(Target.Value) And Target.Value <> "" And j > 7 Then
    Cells(i, 13).FormulaLocal = _
    "=IF(ISERROR(RC[-5]*RC[-4]*RC[-3]*RC[-2]),"" -"",RC[-5]*RC[-4]*RC[-3]*RC[-2])"
    '空白の場合
  ElseIf Target.Value = "" And j > 7 Then
    Cells(i, 8).Resize(, 4).Value = " -" 'H:K
    Cells(i, 13).Value = " -" 'M
  ElseIf Target.Value = "" And j < 8 Then
    Range("C76:K76").Value = " -"
  End If
  Application.EnableEvents = True
  
End Sub
  

>これを実行すると、"引数の数が一致していません。または不正なプロパティを指定しています。

理由は分かりませんが、別のシートでも、新しいブックでもよいので、貼り付けて試してみてください。

投稿日時 - 2009-05-14 16:30:01

お礼

ありがとうございます。
思ったとおりに動作しています。

基本が理解できていないまま質問してすみませんでした。
この文も調べて理解を深めようと思います。
色々とありがとうございました!

投稿日時 - 2009-05-14 17:29:40

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

こんにちは。

マクロの修正自体は、
If Intersect(Target, Me.Range("H170:K170", "H171:K171","C76")) Is Nothing Then Exit Sub
    ↓
If Intersect(Target, Range("H170:K170,H171:K171, C76")) Is Nothing Then Exit Sub

後は、内容が確認できない部分があるので、書けません。(Me キーワードは、シート間をまたぐことはないので、特に必要はないです)

>'(A5:C5を選択しDeleteも含みます。)

>Range("D76:K76, C76").Value = " - "

この部分が良く分かりません。C76 に数値を入力したら、D76;K76 までを、どうするのでしょうか。

それと、ひとつのセルに Delete を行うと「-」が全部に入ってしまうのは、ちょっと過激なような気がします。数式で既にエラー処理されているのですから、数式まで削除して、「-」を入れてしまうのでしょうか?

投稿日時 - 2009-05-14 12:54:19

補足

>'(A5:C5を選択しDeleteも含みます。)
すみません無視してください。

>Range("D76:K76, C76").Value = " - "
>この部分が良く分かりません。C76 に数値を入力したら、D76;K76 までを、どうするのでしょうか。

C76をDeleteした場合、D76:K76, C76に"-"を入力し、値が入力された場合はなにもしないというような処理をしたいです。

>それと、ひとつのセルに Delete を行うと「-」が全部に入ってしまうのは、ちょっと過激なような気がします。数式で既にエラー処理されているのですから、数式まで削除して、「-」を入れてしまうのでしょうか?

数式が入力されているセルに直接数値を入力する場合もあり、数式が入っている上から直接値を入力するのはあまりしたくないんです。(数式がマクロで挿入されるので問題は無いんですが、見た目上として)

複数の人間が使う事を想定してまして、直接値を入力できるセルには"-"がデフォで入力してあるのが理想なんです。

さらにすみませんが補足です。
これを実行すると、"引数の数が一致していません。または不正なプロパティを指定しています。"とでて、If Intersect(Target,Range ←ここのRangeが反転します。

これって引数は2つまでしか指定できないってことですよね?
changeイベントを複数回実行できるように組まないといけないってことはわかって試行錯誤しているんですがどうもうまくいきません・・・

投稿日時 - 2009-05-14 13:55:41