• ベストアンサー

VBA

今、エクセルのVBAの勉強をしているのですが・・・なかなか思うように行きません(-_-;)どなたか教えてくださいませんか?たとえなのですが、A列とB列に数が入っていてc列にA列とB列の合計を順番に表示させたいのです。なおかつA列が空白の時終わる。処理をさせたいのですが。簡単にカウンタを使ってやりたいのですが 何かの本でカウントはI=1+I あと空白はdo until を使ってた気がします。質問の内容の書き方がへたくそでわかりにくいとは思いますがよろしくお願い致します。なかなか理解力がない私ですがお願いします

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

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

Sub test01() i = 1 While Cells(i, "A") <> "" Cells(i, "C") = Cells(i, "A") + Cells(i, "B") i = i + 1 Wend End Sub しばらくは、速いや遅いなど高等なことは考えず、上記のパターンで押し通すことを(私は)お勧めします。 上記のパターンとは (1)セルの値は、iを第何番目の行を表す数字として、Cells(i,”A”)を使う (2)A列のセルの値は、Cells(i,”A”)を、C列はCells(i,”C”)の「表現法」を使う (3)式を設定し、数式などのコピー方式を使わず、値代入法を使う。 (4)1行下の処理は、i=i+1にして、次の繰り返し処理に入る。(ForNextの場合は不要) (5)初期値に設定するべきものと、繰り返しの中で変化させるべきものを区別できるよう勉強する。 (6)その他、変数の定義は宣言するようにする。 インデントは適宜考慮する。(上記では敢えて略) (7)私は、データの入っている最終行を知って、そこまでForNextで繰り返すのが好きですが。

mmopp
質問者

お礼

とても詳しい説明ありがとうございました。僕のような初心者にはとてもわかりやすい説明でした。(^o^)

その他の回答 (7)

  • kimitsjin
  • ベストアンサー率36% (4/11)
回答No.8

No.7 taocatさん。ご指摘感謝します。 いつからか、この書き方をR1C1形式と思いこんでしまっていたようです..........恥ずかしい ^^; でもま、呼び方はともかく、こんな書き方もあるよってことで......

  • taocat
  • ベストアンサー率61% (191/310)
回答No.7

  老婆心ながら、No.5のkimitsjinさんへ一言。 提示のコードはR1C1形式ではありませぬよ。(^^;;;

mmopp
質問者

補足

みなさんはどうやって、勉強されたんですか?またおひまな時にでも、こうしたよ!とかこんなやり方いいよって方法が在りましたら、教えてくださいm(__)m

回答No.6

データの列の途中に空白が入っていても途中で終わらせたく場合は、 (行の挿入などで意識せず空白を作ってしまった 「0」を入力し忘れた など) Dim myMaxrow As Long Dim myZrow As Long Dim i As Long --------------------- Sub データの最終行(myZrow As Long) myMaxrow = ActiveSheet.Rows.Count myZrow = Cells(myMaxrow, 1).End(xlUp).Row End Sub でデータの最終行を変数に登録しておいて、 (myMaxrow = ActiveSheet.Rows.Countで  エクセルのバージョンに関係なく  ワークシートの最終行番号を取得します) Sub 合計() Call データの最終行(myZrow) i = 2 Range("C2").Select Do Until i > myZrow   Range("C" & i).Value = Range("A" & i).Value +Range("B" & i).Value ActiveCell.Offset(1).Select i = ActiveCell.Row Loop End Sub とするか、 別のシートに「=A2+B2」の計算式を入力しておいて、 "C2:C" & myZrow & "へ一気にコピーするのも (相対番地が変化するのに注意して) 処理が速くて良いと思います。

mmopp
質問者

お礼

なるほど!こんな事もできるのかと思わされました。ただ 僕の頭ではまだ、パニックです。(-_-;)これが理解できるようにがんばってみます。本当に人間頭が悪いと苦労します。(-_-;)ありがとうございました。

  • kimitsjin
  • ベストアンサー率36% (4/11)
回答No.5

No.1 papayuka さん, No.2 matrix4 さんの 回答の補足(?)です。 まったく好みの問題ですが、 セルや範囲の参照はR1C1形式の方が すっきりする場合もあるかもしれません。 特に列方向にループする処理では楽だと思います。 使う使わないは別にして こんな書き方もあることを知っておいても 損は無いと思います。 Cells(行No,列No) Range(左上セル,右下セル) 例えば B5セルは Cells(5,2) B5~E8の範囲は Range(Cells(5,2),Cells(8,5)) No.1 papayuka さんのプログラムをこの形式で書くと 以下のような感じです。 Sub Test1() Dim i As Long  i = 2  Do While Cells(i,1) <> ""    Cells(i,3) = Cells(i,1) + Cells(i,2)    i = i + 1  Loop End Sub Sub Test2() Dim i As Long  For i = 2 To Range("A65536").End(xlUp).Row    Cells(i,3) = Cells(i,1) + Cells(i,2)  Next i End Sub

mmopp
質問者

お礼

初心者にやさしい説明ありがとうございます。とても参考になりました。(>_<)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

dim i,x i=0 set x = range("A1") do until x.offset(i,0).value = "" x.offset(i,2).value = x.offset(i,0).value + x.offset(i,1).value i=i+1 loop でいいと思います。

mmopp
質問者

お礼

ほんとうに色々な考え方ができるのですねーとても参考になりました。ありがとうございます

  • matrix4
  • ベストアンサー率16% (118/704)
回答No.2

詳しくは、わかりませんが Sub Test2() Dim i As Long For i = 2 To Range("A65536").End(xlUp).Row Range("C" & i).Value = Range("A" & i).Value + Range("B" & i).Value Next i End Sub の部分で、i=2 が i=1にすると A1から、合計するような・・

mmopp
質問者

お礼

・・からがとても気になりました。(-_-;)でも参考にさせていただきます。ありがとうございました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

ループは Do は For です。For 方が速いと聞きます。 A2~A列の値が入っている最後のセルまで、途中に空白セルがなければ下記は同じ動きをします。 Sub Test1() Dim i As Long  i = 2  Do While Range("A" & i) <> ""    Range("C" & i).Value = Range("A" & i).Value + Range("B" & i).Value    i = i + 1  Loop End Sub Sub Test2() Dim i As Long  For i = 2 To Range("A65536").End(xlUp).Row    Range("C" & i).Value = Range("A" & i).Value + Range("B" & i).Value  Next i End Sub

mmopp
質問者

お礼

迅速なお答え有難うございました。参考にさせて頂きます。m(__)m

関連するQ&A