- 締切済み
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
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- end-u
- ベストアンサー率79% (496/625)
そのコードは例ですか? >これを実行するとうまくいくこともありますが、エラーが起きることもあります。 そんな事はありません。実行時は必ずエラーです。 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)
エクセル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 これは十分テストされたマイクロソフトのエキスパートが考えた仕組みにのッかっているので安心だ。