【お題】NEW演歌

以下のプログラムは、1年間の価格合計を求めるプログラムです。
これを実行するとうまくいくこともありますが、エラーが起きることもあります。

どうやら下記コードが原因のようなのですが、間違いがわかりません。
Target.Offset(0, 1).Value = run * (13 - month)
どこが間違っているのでしょうか。

また最終的に、A行かB行のどちらかが更新されたときにこのプログラムを
実行させたいのですが、方法がわかりません。

無知な質問ではありますが、どなたか教えてください。

---------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim month As Integer
Dim run As Integer

If Intersect(Target, Range("A25:A35")) Is Nothing Then
Exit Sub
Else
If Target.Offset(0, -2).Value <> "" Then
month = Target.Offset(0, -2).Value
month = month - 3
If month = -2 Then
month = 10
ElseIf month = -1 Then
month = 11
ElseIf month = 0 Then
month = 12
End If
run = Target.Offset(0, 0).Value
Target.Offset(0, 1).Value = run * (13 - month)
End If
End If
End Sub

A 回答 (2件)

そのコードは例ですか?


>これを実行するとうまくいくこともありますが、エラーが起きることもあります。
そんな事はありません。実行時は必ずエラーです。
A列から (0, -2)オフセットできません。

>、A行かB行のどちらかが更新されたときに..
A:B列だと解釈して処理する『サンプル』としては以下

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rs As Range
  Dim r As Range

  On Error GoTo errHndlr
  Set rs = Intersect(Target, Range("A1:B100"))
  If Not rs Is Nothing Then
    Application.EnableEvents = False
    'Deleteなどの複数セル処理を禁止するなら _
     rs.Countを調べてIf分岐。
    For Each r In rs
      '同じ処理をするならCase分岐不要。
      Select Case r.Column
      Case 1
        'A列の処理をここに書く。
      Case 2
        'B列の処理をここに書く。
      End Select
    Next
  End If

errHndlr:
  Application.EnableEvents = True
  Set rs = Nothing
  If Err.Number <> 0 Then
    MsgBox Err.Number & "::" & Err.Description
  End If
End Sub
    • good
    • 0

エクセルVBAであれば、(他の言語は別と思うが)月数だけを採り上げて計算するのでなく、


下記のように実際の日を作って、関数を利用するほうが良いと思う(理由は経験からです。どちらでも正しく思考して、コードを
書けば問題ないが、数直線的思考をする、エクセルの日付シリアル値は考えやすく誤りがないと思う)
例データ
A列    B列=3ヶ月前の月数字
2011/9/16
2011/10/2 7
2011/11/3 8
2011/12/4 9
2012/1/510
のように日は適当な日(日は指定ないときも構成的に1日にするとか)にして、エクセルの日付シリアル値にして、月数字から3を引いて
Month(x) - 3
その月でまた日付シリアル値をだし、その日付シリアル値の月数字を Month(・・・)で出す。
Sub test01()
For i = 1 To 5
x = Cells(i, "a")
Cells(i, "B") = Month(DateSerial(Year(x), Month(x) - 3, Day(x)))
Next i
End Sub
これは十分テストされたマイクロソフトのエキスパートが考えた仕組みにのッかっているので安心だ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報