• ベストアンサー

VBA

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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

  • VBAの構文で教えてください

    VBAの繰り返し処理 Do Until ~について教えてください。 シートの行列を全て書いてしまうと長くなるので 少し省略させていただきます。    A  B  C  D 1 2008 1 ○ 2008 2 2008 2 × 2008 このような羅列がデータ検索の際に何行になるかわからない状態のデータがあります。 C 列はBが1の場合○、2の場合は× D 列はAが数字があればそのままコピーするようにくみました。 ここで教えていただきたいのが、現在私はCとDの構文は AまたはBに数字があればC,Dに反映するという構文ではなく C、Dの列の最後まで全て数式を入力する構文にしています。 なので、A,Bに入力があってもなくても数式が飛ぶような構文になっています。 そこで、DO Until ~ を使用し A列が空白になるまで処理を繰り返すとすればいいのかなとおもうのですが、 Dim n as integer n=1 Do Until Sheets("sheet1").Cells(n, 1) = "" 空白までという構文(正しいかはわかりませんが)で行き詰っています。 これ以降のAが空白ならDに貼り付ける、 B列も同様に空白まで検索し○または×に置き換えるとは どのうように組み立てたらいいのでしょうか? また、申し訳ないのですが Cが×ならその列の背景を色づける(今回の場合なら2の列) とことまでしてみたいのですが・・・ このようなことが可能であれば教えていただければと思います。 VBAははじめたばかりで不勉強な点も多々ありますがよろしくお願いします。

  • 2重のDo~Loopは?

    Excel VBAですが、A列にデータが入っています。 A列のデータが変わるまで 処理1 を実行し、変われば 処理2 を実行する。データがなくなれば終了する方法が分りません。宜しくお願いします。 i = 2 Do Until Cells(i, 1) = "" Do Until Cells(i, 1) <> Cells(i - 1, 1) 処理1 Loop 処理2 Loop

  • 【VB】セルが空になるまで処理を繰り返したい

    Excel VBAを使用してです。 列Aにデータがずらっと入っています。 そのデータを列Bに、 Do while ~loop か Do until ~loopを使って データが無くなるまでコピーするという処理を書きたいのです。 VB歴が浅いためひらめきません。よろしくお願いします。m(__)m

  • エクセルVBAについて質問です。

    現在、マクロで重複データを削除する処理しています。 一応動作はするのですが、すごく遅いです。 およそ私のPC(XPのQuadコア)で1行処理するのに約0.85秒かかっています。 データが1万行以上もあるようなときは、何時間もかかってしまいます。 エクセルのデータは、以下のように、 A列とB列に文字列が何行にも渡って入っているものです。 A列   B列 AAA BBB CCC DDD EEE FFF GGG BBB CCC HHH CCC DDD (以下同様) 上のようなシートで、A列とB列の両方について重複する行を削除したいと思っています。 上記例だと、一番最後の「CCC-DDD」の箇所を削除したいです。 そこで以下のようなマクロを組みました。 (1)はじめに重複をチェックする変数(A列・B列)を取得します。 (2)上から順にチェックを開始します。 (3)A列・B列双方が取得した変数と一緒なら重複カウンターに1を加える。 (1回目の出現では削除しない) (4)チェックを続け、重複カウンターが2以上になった行は削除する。 (5)上記を空白行まで繰り返す。 というような流れです。 (マクロ記述の途中部分からです) '重複する行を削除 counter3 = 1 Do search_word1 = Cells(counter3, 1).Value search_word2 = Cells(counter3, 2).Value counter4 = 1 double_counter = 0 Do If Cells(counter4, 1).Value = search_word1 And Cells(counter4, 2).Value = search_word2 Then double_counter = double_counter + 1 If double_counter > 1 Then '二度以上出現した場合から削除する Cells(counter4, 1).EntireRow.Delete counter4 = counter4 - 1 End If End If counter4 = counter4 + 1 Loop Until Cells(counter4, 1).Value = "" counter3 = counter3 + 1 Loop Until Cells(counter3, 1) = "" 初心者なのもので、冗長や不適切な箇所などあるかと思います。 より効率的、あるいは、より早くできる書き方がありましたら、 ぜひともお教え下さい・よろしくお願いします。

  • VBAの記述がわかりません

    エクセル2010を使用してるのですが A列に不規則な空白がある数字があります。 B列にA列の空白を除いた数字を上から詰めて表示させたいのですが VBAの記述がわかりません。 よろしくお願いいたします。

  • Excel VBA のDo Until Loopについて

    こんばんは Excel VBAの初心者です。 Do Until Loopを使って B列の値が変わるところ(下記の表だと、空白からコスモスに変わる、4行目。コスモスからチューリップに変わる6行目。チューリップから菊に変わる8行目。)に行を挿入させたいと思い、下記のマクロを組んだのですが、Do Until Loopが理解できませんでした。 どうしたら良いのか教えて頂けないでしょうか。 宜しくお願い致します。 Excelのシート B1  項目 B2  空白 B3  空白 B4  コスモス B5  コスモス B6  チューリップ B7  チューリップ B8  菊 Sub 行の挿入() Dim y As String Cells(2, 2).Select y = Cells(2, 2).Value Do Until Cells(2, 2).Value <> y ActiveCell.Offset(1).Select Selection.EntireRow.Select Selection.Insert shift:=xlDown Loop End Sub

  • エクセルVBAで質問です。

    エクセルVBAで質問です。 A列   B列 AAAA  1111 BBBB  2222 CCCC  3333 とあります。 上記を AAAA (空白) (空白) 1111 (空白) BBBB (空白) (空白) 2222 (空白) CCCC (空白) (空白) 3333 (空白) A列にB列を挿入し、2・3・5行目に空白のセルを入れていきたいのです。 9000行ぐらいあります。 他の列に A列、B列のものを取得していく形でも構いません。 とにかく、縦1列に並べたいです。 どなたか、ご教授お願い致します。

  • VBAと罫線の作成

    こんにちは。 VBA勉強中で初心者です。 今、以下の上段画像のような表をエクセル2003 で作成しました。 下段画像はVBA実行後の表です。 表は 番号と氏名、合否の結果を入力した ものです。 今、行いたい処理なのですが (1) B列の氏名欄に対応する、連番を A列に表示したい。 (2) さらに、氏名欄が入っている部分を A列からD列まですべてを罫線(普通線) で囲みたい。 の2点です。 (1)はなんとかできたみたいのですが、 (2)で完全に手が止まってしまいました。 最終の行と列の取得が、すこしわからないので 教えていただければと思います。 よろしくお願いします。 Sub sample() Dim num As Integer '行変数を設定 Dim num2 As Integer '番号変数を設定 Dim i As Long 最終行の取得? num = 4 'B列4行目から調べる num2 = 1 '連番は「1」からスタート Range("A:a").Clear 'A列のデータをいったんクリアにする Do Until Cells(num, 2) = "" 'B列の氏名欄が空白なるまで処理を繰り返す Cells(num, 1) = num2 '連番「1」をB4にまず、代入する num = num + 1 '行を1行分下げる num2 = num2 + 1 '番号変数に1をプラスする Loop i = Range("B4").End(xlDown).Row End Sub

  • アクセスVBAでデータを検索したいのですが、

    アクセスVBAでデータを検索したいのですが、 エクセルVBAのcells(i,1)にあたるようなものはないでしょうか。 添付画像のような信号を抽出したいので、立ち上がりの部分をさがしたいのですが。 ご存知のかた教えてください。 i=1 Do until cells(i,1)>=4 i=i+1 Loop 開始レコード=i データテーブルの1列目は行番号、2列目は信号が入っています。

  • Excel VBAでデータを自動処理したい

    Excelで大量のデータ処理をしなくてはならないのですが、以下の処理をExcel VBAで自動処理できないでしょうか? どなたかお知恵をお貸しください。 (1)A、B、C列からなるリストがあります。A,B列にはそれぞれオートフィルタが設定してあり、C列は空白です。A列、B列にそれぞれ条件を設定し、抽出したデータのC列(空白)に特定のデータを入力します。A列、B列2つの条件の組み合わせが100通りくらいあり、現在手動でオートフィルタを設定し、C列にデータを入力しております。例えばA,B列の条件の組み合わせと、それに対応するC列に入力するデータを表にしたテーブルを別に作り、A,B列の条件を自動に設定して、抽出し、C列にデータを自動に入力することを、テーブルの一番上の行から最後の行まで繰り返す、というようなことをVBAでExcelにしてもらいたいのです。自分でちゃんと勉強し、調べて、それでも分からなかったらお聞きするというのが筋だと思うのですが、今この仕事に追われて、時間がありません。(ほとんど毎日午前様です。)この仕事が片付いたら、じっくりVBAを勉強したいと思っております。どうぞよろしくお願いいたします。

専門家に質問してみよう