• 締切済み

VBAについて

以下のプログラムは、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

みんなの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.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

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

エクセルVBAであれば、(他の言語は別と思うが)月数だけを採り上げて計算するのでなく、 下記のように実際の日を作って、関数を利用するほうが良いと思う(理由は経験からです。どちらでも正しく思考して、コードを 書けば問題ないが、数直線的思考をする、エクセルの日付シリアル値は考えやすく誤りがないと思う) 例データ A列    B列=3ヶ月前の月数字 2011/9/1 6 2011/10/2  7 2011/11/3  8 2011/12/4  9 2012/1/5 10 のように日は適当な日(日は指定ないときも構成的に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 これは十分テストされたマイクロソフトのエキスパートが考えた仕組みにのッかっているので安心だ。

関連するQ&A

専門家に質問してみよう