• ベストアンサー

Excel VBAの解説をお願いします

独学でExcel BVAの勉強をしているんですが、他人(社内の人間)の作ったマクロを見て、どうしてもわからない部分がありました。 まだ初心者に毛の生えたくらいのVBAしか書けないわたしにもわかるように、解説して頂けないでしょうか? a=0 For i = 1 To Range("A65000").End(xlUp).Row If Range("B" & i) = "合計" Then a = a + 1 b(a) = i End If Next i ちなみに、Sheet内に複数の表があって、1つ目の表の処理が終わったら次(1つ目の表の何行か下にある)の表へ移動して処理を・・・というものです。 (こんなつたない説明で理解して頂けるか不安ですが・・・) その時、『合計』という文字をキーワードに処理を進めていっているようなのですが・・・。 こんな質問で申し訳ありませんが、宜しくお願いします。

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

  • ベストアンサー
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.4

こんにちは。 すでに結果はでたみたいですが、ひとこと。 どんな結果を得るためにコードが書かれたかをなぞってみると、 そのコードがどういう処理をしているか、わかりやすくなると思います。 このマクロは、「合計」と入力されている行の番号を取得するようですね。 このコードの実行結果は、「b」という配列変数に納められます。 どういう結果が得られるのかと申しますと、 たとえば10行目、20行目、30行目に「合計」というセルがあるとすれば 取得した行番号(i)は順番に配列変数bに代入され、  b(1)=10  b(2)=20  b(3)=30 という結果が得られるように作ってあります。 ここで、aという変数の役割は、 結果を保持する変数b(0)、b(1)・・・の、 「かっこの中の数字」を変更するという役割を持っています。 ちなみに合計欄が見つかるたびにaの値は1ずつ増えていきます。 つまり、 ひとつめの合計欄がわかったとき、行番号は変数b(1)に保存され、 次の合計欄が見つかったとき、行番号は変数b(2)に保存されます。

kdino_0351
質問者

お礼

わかりやすいご説明ありがとうございます。 まさにわたしの知りたかったところはそこでした。 今まで、複数シート間のデータ処理や横、または縦に表が続いているものの処理は出来ていたのですが、個別の表が同じシート内にあり、1つ目の表の処理が終わったら次の表へ・・・というものが作れなかったんです。 これが使えるようになると、また少し楽に仕事が進められそうです。 これからまた少しVBAに手を加えてみようと思いますが、また行き詰まった時には、こちらでお世話になろうと思います。 本当に皆様、どうもありがとうございました。

その他の回答 (3)

回答No.3

簡単に言えば、シートのB列に「合計」と書いてある行の 行番号を配列b()に入れています。 最初 a=0で初期化して、 「合計」と書かれたセルが見つかると a=a+1(aに1加算)して b(a) = i → b(1) = i 次に「合計」と書かれたセルが見つかると a=a+1(aに1加算)して b(a) = i → b(2) = i となります。

kdino_0351
質問者

お礼

そういうことだったんですね!? やっと答えが見つかった気がしました。 お三方ともわたしの拙い説明で答えを出して頂いて、本当にありがとうございました。 どなたもとても丁寧でわかりやすい説明でした。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.2

#1さんの仰るとおりです。 a=0 ← 変数aに0「ゼロ」を代入 For i = 1 To Range("A65000").End(xlUp).Row ← For~Nextの間をループする。1~Range("A65000").End(xlUp).Rowまでの値の範囲 (Range("A65000").End(xlUp).Rowは入力されている最終行の位置を取り出します。) If Range("B" & i) = "合計" Then ← Bセルの特定行(iの値)の内容が「合計」だったらThen以下を実行。End Ifまで、違っていたら実行しない。 a = a + 1 ← aの値にプラス1する。 b(a) = i ← b(i)にiの値を代入する。 End If Next i です。

kdino_0351
質問者

お礼

ご返答ありがとうございました。 でも、こういった理屈は理解出来ているつもりなんです。 なんて言ったら良いんでしょう? どういう処理をしているのかが知りたいというか・・・。 自分の知りたいことがうまく言葉に出来なくてすみません。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

まず For文。 これは ある一定の範囲を繰り返すというものです。 For~~~ から Next までを繰り返す。 次に Range("A65000").End(xlUp).Row これは Rangeの End プロパティということです。 対象となるセルのの終端のセルが取得できます。 xlUpは 上方向ということです。 Row は 行です。 IF文は IF なんたら THEN で なんたら が TRUE(真)ならば そのあとの end if までの処理をするということです。 Range("B" & i) = "合計" これは、 Range("B" & i) のセルの中身が"合計"の時、 TRUE ということです。

kdino_0351
質問者

お礼

早速のご返答ありがとうございました。 実はその辺に関しては、ほぼ理解出来ているんです。 いちばん知りたいところは、『a=0』や『a=a+1』、『b(a)=i』のところなんです。 トータルで見た方がわかりやすいのかと思い、その部分(For~Next)を抜き出してみました。 他の方からのご回答もお待ちしています。

関連するQ&A