プロが教えるわが家の防犯対策術!

VBAの初心者で教えて頂きたいのですが、
ランダムに読み込んだ文字列が重複していた場合、その右にあるセルの値を合算したいのですが、できますでしょうか。

イメージとしては(なんとなくで申し訳ないです)、

Do
If "範囲" "文字列"="文字列"ならば
右のセルを合算
+
重複した"文字列"を一つにする。

それを重複する文字列がなくなるまで繰り返す。
Loop

といった感じになると思うのですが、VBAですとどのようなプログラムになるでしょうか。
ご教授願います。
よろしくお願いします。

A 回答 (2件)

こんにちは。



>関数だとSUMIFやVLOOKUPを使えば何とかできそうなのはわかりますが、VBAだと>どのようなコードになるのかなぁという質問でした。

関数を、VBAで表現したらどうなるか、ということは、大事なことだと思うのです。
でもね、私が言うのもなんですが、それには段階を踏んで覚える部分とかあるわけで、最初から解答をみて、どうするのか、と思うのです。

関数の表現をVBAでしようというのは、ピンからキリまであります。初級段階から上級、また最上級と段階があります。もちろん、最終的には、C言語や他の言語で作る所まで行くわけですが、その最初の初級段階が分かりませんから、教えてください、というように読めますが、それは、ちょっと意味が違うと思うのです。

私の見た人の中では、3ヶ月でVBAを一通り覚えてしまった人や、約2年でVBAの業界のトップまで(プロ)上り詰めてしまった人などもいれば、10年経っても、毎日、VBAに携わっても、一向に、相変わらず初級を越えない人もいます。そういう私は、一通り使えるまでには3年掛かってしまいました。直接、誰かに教わったわけではありません。

やはり、そういう私が思うのは、最初は良いテキストを手に入れることです。

次に、一定の期間(だいたい3ヶ月)を我慢して、分からない所は分からないままに、最後までむらなくテキスト終えることです。そして、数多くの問題を手掛けることと、新しいことに気後れしないようにすることではないでしょうか。

残念なことに、VBAのいくつかの外部オブジェクトを知る手立てはなくなってしまいましたが、その時は、専門掲示板でお尋ねになればよいと思います。

----------------------
>Do
>If "範囲" "文字列"="文字列"ならば
>右のセルを合算 ? (具体的に)
>+
>重複した"文字列"を一つにする。×
>
>それを重複する文字列がなくなるまで繰り返す。×
>Loop
-----------------------
×の理由
重複した"文字列"を一つにする。--入門レベルでは、かなり難しいです。
それを重複する文字列がなくなるまで繰り返す。--その先に重複があるかどうかは、分かりません。COUNTIFでも用いれば別ですが、その必要性はないと思います。データの最後まで検査すればよいだけです。

SUMIF の考え方は分かりますか?

<ワークしシート> A1:B11まで
--------------
Name Amount
 a 50
 c 80
 b 40
 a 100
 c 60
 b 90
 a 70
 c 60
 d 70
 a 10
----------

=SUMIF(範囲,検索条件,合計範囲)
=SUMIF($A$2:$A$11,"a",$B$2:$B$11)

範囲は固定です。検索条件にひとつの入れ物、「a」を設けてあげて、ひとつづつ、調べていくわけです。dは、合計

  For i = 1 To 10
    If Cells(i + 1, 1) = "a" Then
      d = d + Cells(i + 1, 2)
    End If
  Next
  Cells(1, 3).Value = "a"
  Cells(1, 4).Value = d

中級クラスになると、まったく違う方法が出てきたりします。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
全く持って回答者様の言う通りだと思います。
段階を踏まず解答を見てそのままやると成長は何もしないと思います。
一応Sumifを使用して色々工夫したところ自分のやりたいプログラムは書けましたのでありがとうございます。
すごく詳細に回答をしてくださり大変感謝しております。ありがとうございました。
また、今後共わからないことがありましたら少しでもいいのでヒントを頂ければと思います。
少しずつ覚えていこうと思います。

お礼日時:2016/05/21 17:58

こんにちは



おおまかにはご提示の方法で処理できると思いますので、そのままコード化してみるのが宜しいかと思います。
その上で、わからないことが出てきたらば、その点についてご質問なされば、具体的に質問できると思いますので、より適切な回答が得られることでしょう。

処理対象のデータ量にもよりますが、ご提示の方法ですと、文字列の比較を、常に『残っている全部のデータ』と比較することになりますので、必ずしも効率が良いとは言えません。(データ数が少なければどうという事でもありませんが)
最初に、比較する文字列をキーにして並べ替え(Sort)を行っておくと、順に参照していって異なるデータが出てきたら、そこまでを纏めれば良いと考えられますので、比較の対象が少なくて済むので効率的になると思います。
大雑把に比較処理の回数を考えてみると、前者では、データ数から2個の組合せを取り出す回数に近く、後者では、ほぼデータ数分の回数となりますので、2乗で効いてくることになります。
(正確には、並べ替えの処理で同じようなことを行っているので、その分の時間はかかっているはずなのですが、VBAでの処理とSortメソッドの処理速度は格段に違いますので…)

文字列の比較が単純な比較で良い場合は問題ありませんが、「含まれるキーワードが同じ」というような単純な文字列比較ではない場合には、エクセルではそのままではうまくソートできませんので、若干の工夫が必要になるかも知れません。
例えば、上記の場合であれば、前処理として各文字列からキーワードを抜き出しておいて、並べ替えはそのキーワードをキーとして行うなどといったアレンジが必要かもということです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
ただ、そのコードがわからなくて苦戦しておりまして…。
なんとなくは書いてはいるのですが、理解していないためコードそのものがぐじゃぐじゃの機能しないもので…。
ですが、なんとかやってみます。
ありがとうございます。
関数だとSUMIFやVLOOKUPを使えば何とかできそうなのはわかりますが、VBAだとどのようなコードになるのかなぁという質問でした。

お礼日時:2016/05/20 09:12

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