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

-広告-

解決済みの質問

VBA For~Next 

「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。

01:Cells(16 + i * 4, 1) とすると「i」が大きいときに
  「""」があると16からスタートしない
02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。

For i = 0 To 50 '行
For j = 6 To 28 '列
If wsData.Cells(10 + i, 3).Value = "" Then
wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value
wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value
End If
Next j
Next i

お力添えをお願いいたします。

投稿日時 - 2018-01-13 14:10:58

QNo.9417917

困ってます

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

>01:Cells(16 + i * 4, 1) とすると「i」が大きいときに「""」があると16からスタートしない
意味不明です。
wsInv.Cells(16,1).Value = wsData(10,1).Value
wsInv.Cells(20,1).Value = wsData(11,1).Value
wsInv.Cells(24,1).Value = wsData(12,1).Value
のように転記していると解釈します。(列については考慮していません。)
尚、If 文は For j ~ Next j の外側で良いのではないでしょうか?

wsInvの行番号とwsDataの行番号を別の変数で繰り上げれば混乱が防げます。
次のようにwsInvの行番号を変数rで4ずつ加算すればCellsの行番号をカッコ内で計算する必要が無くなります。
r = 16
For i = 0 To 50 '行
If wsData.Cells(10 + i, 3).Value = "" Then
For j = 6 To 28 '列
wsInv.Cells(r, 1).Value = wsData.Cells(10 + i, 1).Value
wsInv.Cells(r, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value
Next j
End If
r = r + 4
Next i

投稿日時 - 2018-01-13 22:01:49

補足

説明が悪いにも関わらずご検討頂きありがとうございます。
そもそも「wsInv」「wsData」の「j」に関連性がありませんでした。
r = 16・r = r + 4の様な方法で調整した結果、上手く出来ました。
本当にありがとうございました。

投稿日時 - 2018-01-14 10:32:29

ANo.3

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

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

-広告-
-広告-

回答(3)

ANo.2

質問を、学びたてのVBAのコードで説明しないで、初心に帰って、文章や対応表で表現してみたらどうだろう。
列はA列に仮定して、
・最初のセル
・終りのセルと
・間隔(いくつ飛ばし)かを
文章で表現してみること。
ForNextでの表現は、この3要素しかない
そしたら、言っていることがはっきりする。
持ってくるセルの値のある,セルのCells(i.j)の、i,jで代入するセルの行や列
をどう表す(計算する)かは、簡単ではない場合があり、もう少し丁寧な言葉による説明が必要だろう。
値の代入式の左辺と右辺のセルの対応表でも作ってテストすることだ。
例外的に、処理を飛ばすセルはあるのか、なさそうだが。
コーディング時の、自分のやるべき下作業(対応表作成など)を回答として投げているが本来自分で試行することだ。

投稿日時 - 2018-01-13 17:09:49

補足

検討ありがとうございます。

●●●は(i)と別の値を返したいと考えております。
※●●●は16を起点に4づつ増やす。
※(i)が30で条件にヒットした時、●●●の最初は16としたい。

よって、「For k = 0 To 50」とし●●●にCells(16 + k * 4, 1)を代入しましたが「For k = 0 To 50」をどの位置に入れても上手く処理出来ません。
説明が悪く申し訳ございません。

投稿日時 - 2018-01-13 18:48:33

ANo.1

起点を 5 として、何回ループするか?
10回なら

for i=0 to 9
で、5+i*4

ってやるけど、ちょうどGoto と for を使うな、って時代なので

i=0
do{
-----
-----
i=i+1
}while(i<10)

ってやった。

投稿日時 - 2018-01-13 14:27:55

補足

回答ありがとうございます。
do while 勉強してみます。
●●●の値は16を起点に4飛ばしで処理したいです。
表現が判りにくく申し訳ございません。

投稿日時 - 2018-01-13 18:42:55

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-