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

締切り済みの質問

VBAのプログラムでうまく動かなくて困っています。

VBA初心者です。
エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。

(内容)
セル
   E H J L N P R・・・
8行目100 200 50 40 30 80
9行目130 350 10 50 60 120 110



(1)列Hの値が列Eの値より大きい場合その下に行を追加します。
(2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。
上のセルの1行目の内容でいいますと、
(1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加
(2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。

以下が私が書いたプログラムです。
Sub test()
Dim x As Integer
Dim s As Integer
Dim t As Integer
x = Range("B8").End(xlDown).Row
r = Range("J8").End(xlToRight).Column
'8行目から最終行までループ
For i = x To 9 Step -1
If Cells(i, 5) < Cells(i, 8) Then

☆【For r = y To 11 Step -2
Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2)
If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For
Next】

Rows(i + 1).Insert Shift:=xlDown
'超えたセルをコピーして、1行下の"J列以降"に代入

x = x + 1
End If
Next i
End Sub

上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

投稿日時 - 2009-06-07 04:18:12

QNo.5023325

すぐに回答ほしいです

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

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

回答(3)

ANo.3

#2です

とりあえずこんな感じですか
いえることは、ちゃんと変数の役割を決めておくことですね

Sub test()
 
 Dim ir As Long '行番号
 Dim ic As Long '列番号
 Dim iv As Long '作業用
 Dim ws As Worksheet 'ワークシート
 
 Set ws = ActiveSheet
 
 '8行目から最後まで (Excel2003までは65536行)
 For ir = 8 To 65536
  'E列とH列を比べ、H列がでかいなら
  If ws.Cells(ir, 5).Value < ws.Cells(ir, 8).Value Then
   '行の挿入
   ws.Rows(ir + 1).Insert xlDown
  
   '列のチェック J列=列番号は10
   'Excel 2003までは256列
   iv = 0
   For ic = 10 To 256 Step 2
    iv = iv + ws.Cells(ir, ic).Value
    'E列の値を超えたなら抜ける
    If iv > ws.Cells(ir, 5).Value Then Exit For
   Next
   'とまった列から最後の列までをコピーする
   ws.Range(ws.Cells(ir, ic), ws.Cells(ir, 256)).Copy ws.Cells(ir + 1, 10)
   '次の行は無視するため足しておく
   ir = ir + 1
  End If
 Next
End Sub

投稿日時 - 2009-06-07 16:20:48

お礼

phoenix343さん、親切にありがとうございました。
正常に動きました。
書いていただいたプログラムを見て、処理の流れを確認します。
本当にありがとうございました。

投稿日時 - 2009-06-07 16:46:54

ANo.2

(1)
E H J L N P R・・・
8行目 100 200 50 40 30 80
9行目 130 350 10 50 60 120 110



(2) 列Hの値「200」が列Eの値「100」より大きいのでその下に行追加
E H J L N P R・・・
8行目 100 200 50 40 30 80
9行目
10行目130 350 10 50 60 120 110



(3) セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。
E H J L N P R・・・
8行目 100 200 50 40 30 80
9行目 x x 30 80 ←xは便宜上つけた空白の意味。
10行目130 350 10 50 60 120 110



(4)コレ以降は?10行目に行くのか、、

というふうに例を挙げてってください

今のままでは何もアドバイスできません。

投稿日時 - 2009-06-07 10:24:43

補足

ご回答ありがとうございます。
phoenix343さんが書いてくださった(1)~(3)のとおりです。
(4)コレ以降は?10行目に行くのか、、>
10行目以降に続きます。

投稿日時 - 2009-06-07 12:35:46

ANo.1

どのような処理をしたいのかいまひとつ把握できません。もっと分かるように説明してください。

・計算前の状態
・期待する計算結果
・実際に計算して得られる結果(これが期待通りでないので質問しているはず)

最低限この3つは提示可能なはずですのでお願いします。

コードについてもそれぞれの変数がどの役割をしているのか分かりません。変数を1文字にするのではなく、役割を明確に示す名前をつけるようにするとよいでしょう。

r = Range("J8").End(xlToRight).Column
ここでrを求めているのに
For r = y To 11 Step -2
ループの変数に使ってしまっています。yの値も求められていないのでここは 0 To 11 Step -2 となってFor自体が実行されません。

Cells(s, t).Value = ...
sとtについても具体的に値が格納されていないので、Cells(0, 0)を参照しているだけです。

For i = x To 9 Step -1
x = x + 1
Forに入ったあとでxを+1にしてもFor~Nextのループ回数が増えるわけではありません。


もういちど、きちんと整理してコードを書いてみたほうがよいでしょう。

投稿日時 - 2009-06-07 09:42:41

あなたにオススメの質問