ここから質問投稿すると、最大4000ポイント当たる!!!! >>

VBA勉強中の者です。
早速ですが、質問させて頂きます。

A1からC3に数値があります。
なるだけCellsプロパティを使用し、直接的なセルのアドレス指定をせずに
A1+A1をA5、B1+B1をB5、C1+C1をC5、
A1+A2をA6、B1+B2をB6、C1+C2をC6、
A1+A3をA7、B1+B3をB7、C1+C3をC7、と返したいのです。

コードは以下の通りです。
Sub test()
Dim rng1 As Range

Dim aaa As Integer
Dim i As Integer
Dim bbb As Integer
'-------------------------
For aaa = 1 To 3
'-------------------------
For bbb = 5 To 7
'-------------------------
For i = 1 To 3
'-------------------------
Set rng1 = Cells(aaa, i)
Cells(bbb, i) = Cells(1, i) + rng1
MsgBox (Cells(1, i) + rng1)
'-------------------------
Next i
'-------------------------
Next bbb
'-------------------------
Next aaa
'-------------------------
End Sub
数値を返すセルを指定するコードが間違っていると思われ、
複数のセルに同じ数値を何度も返してしまいます。
数日間調べつつ改善しましたがどうしても解決できず、どなたかご助力お願い致します。

A 回答 (2件)

今のループ構造では


 aaaがまず1になったところで
  bbbを5から7までイチイチ繰り返し
   つまりbbbが5の状態でiを1から3まで繰り返し
   続けてbbbが6でiを1から3まで繰り返し
   続けてbbbが7でiを1から3まで繰り返し
 ようやくaaaが2になってまたbbbの5から7とiの1から3を全部繰り返すのを,aaaが3になるまで全て行う

という具合になっています。

明らかにbbbのループが無意味なので,たとえばこんな風に行います。

sub macro1()
 dim h as range
 dim r as long
 dim c as long

 for c = 1 to 3
  set h = cells(1, c)
  for r = 1 to 3
   cells(r + 4, c) = cells(r, c) + h
  next r
 next c
end sub



#余談
range("A1")のような指定の仕方を「A1型式」
cells(1, 1)のような指定の仕方を「R1C1型式」
と言います。どちらも「セルのアドレスを直接指定している」という事では全く同じです。



参考:部分的に「セルのアドレス直接指定しない」で行う例
sub macro2()
 dim h as range
 for each h in range("A1:C3")
  h.offset(4) = h + cells(1, h.column)
 next
end sub
    • good
    • 0
この回答へのお礼

早々のご回答有難う御座います。
内容を確認した結果、完璧な動作を確認しました。
こんなにもシンプルでわかりやすく、更にデータが増えたとしても
コードは増やさなくても良い、とても素晴らしい内容だと感じました。
また、まだまだ知識の乏しい私には余談にある内容もありがたく感じました。
keithinさん同様、素晴らしい回答を頂いた方もいらっしゃいましたが
よりお早い御回答を頂けましたのでベストアンサーとさせて頂きます。
有難う御座いました、今後とも宜しくお願い致します。

お礼日時:2011/07/01 15:23

一例です。



Sub その1()
For i = 5 To 7
For j = 1 To 3
Cells(i, j) = Cells(i - 4, j) + Cells(1, j)
Next
Next
End Sub

3列程度なら1ループでも良いのではないでしょうか。
Sub その2()
For i = 5 To 7
Cells(i, 1) = Cells(i - 4, 1) + Cells(1, 1)
Cells(i, 2) = Cells(i - 4, 2) + Cells(1, 2)
Cells(i, 3) = Cells(i - 4, 3) + Cells(1, 3)
Next
End Sub
    • good
    • 0
この回答へのお礼

ご回答頂きまして有難う御座います。
両方とも完璧な動作を確認しました。
その1のコードは素晴らしくシンプルで驚きました。
その2のコードは仮にデータが増えた場合はコードが長くなってしまいますが
ForNextを一度しか使用しなくても同じ結果が出せる事、まさに目から鱗です。
両方とも実用性が高くベストアンサーにしたい所ですが、同様にシンプルで
わかりやすいコードを、よりお早く御回答して頂いた方がいらっしゃったので
今回はそちらの方にしたいと思います。
しかしながら貴重なお時間を頂き勉強させて頂きまして有難う御座いました。
今後とも宜しくお願い致します。

お礼日時:2011/07/01 15:19

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


このカテゴリの人気Q&Aランキング