● プログラムの構造
B4から下に見て行き、現在のセルの値と、3行目のE列から順に右列の値と比較して、
同じならB列の下へセルが移動する。
3行目を順に右へ見て行き、どれとも同じでなかったら、一番右の値が書いてある列の右側に、その製番を書く。
製番がすべて3行目に抽出されたら、その下の4行目に合計値を書いている。
又、4行目の Total 値を最終列に Sum 関数で記入して、C21と同じかを確認している。
● Sum If 関数の例
 intTot = Application .WorksheetFunction .SumIf (Range("B4:C20") ,Cells (3 ,i2) ,Range ("C4:C20"))
 Cells (4 ,i2) .Value = intTot

 このプログラムは、B4からB20までの製番ごとに、条件の Cells (3 ,i2) で算出して
 intTot 変数に代入して、それを Cells (4 ,i2) に記入するものである。

 データベースの中を直接検索して、製番の違うものを抽出し、その製番を書きだして、その金額の合計値を
 算出して書き出す。

 Sum If 関数の選択範囲の、Range ("B4:C20") の、B4をB3とすると関係のない数値になるので、選択範囲は
 製番から金額までのタイトル部分を含めない、データ部分にすることが必要です。
 そんな場合も、ワークシート関数で合計値を確認することが、間違いのないプログラムの作成には必要なことです。

 ●プログラムの解説
 このプログラムは、製番と金額をどのセルで変更しても、重複しないで製番ごとの集計を書きだすものである。

  B4 から下に調べるから、B4の製番は先にE3に書いておく。
  Range ("E3:Z4) .ClearContents          ' なんどでも繰り返せるように結果を消去している。
  intRow = Range("B3") .End(xlDown) .Row     'B列の行端を検知する。
  strSeib = Range("B4")
  C = 6                       ' 6は6行目でF列のこと
  Cells(3 ,C ー 1) .Value = strSeib          ' 3行目の 6 - 1 = 5行目にstrSeibを書く。
  intCol = 5                    ' 3行目に最初の製番を書いた列番号

  For i = 5 To intRow
    Range("B" & i) .Select            ' これは、行移動を分かりやすくしている。
    If Cells(3 ,6) <> " " Then           ' これは、3行目の6列目が空白でなかったら列数を数えて
                          ' intColに代入する。B列で違う製番が検出されたら、
                          ' Cells(3 ,C) .Value で書いている。

      intCol = Range("E3") .End(xlToRight) .Column
    End If
B列の、製番ごとに合計金額が、C列を基に集計されるプログラムである。
縦横の、合計金額はワークシート関数で確認されている。
上の表は、製番を条件に Sum If を実行すると、下の表の様に製番別の合計金額が集計される。
データベースの中から、条件を基に、その金額を合計する。
書式は
変数名=Application.WorksheetFunction.SumIf(選択範囲),条件,Range("合計範囲")

 
基本的なマクロの習得
Sum If 関数の使い方


実際に使っているシステムの内容で解説
  EXCEL VBA 講座