- ベストアンサー
エクセルVBAによる不連続データ群の合算と、ワークシートをまたぐ連続処理について
エクセルのVBAによる、合算処理が上手くいかずに困っています。 現在の状況ですが、1つのワークブックト中に、 いくつかのシートに分かれたデータ群があります。 それぞれのシートごとのデータ群で合算したいと思っています。 1つのデータ群に対してのVBAは作成できたのですが、 それぞれのデータ群ごとに合算しつつ、シートをまたいで 連続処理することができません。 お知恵を拝借できれば幸いです。 Workbook Sheet1の内容 [ A ][ B ][ C ][ D ][ E ] [ 1] 日付 品名 予算 金額 差額 [ 2] 3/1 aaa 1000 200 800 [ 3] 3/1 bbb 500 100 400 [ 4] 3/1 ccc 600 200 400 [ 5] 合計 2100 500 1600 [ 6] [ 7] 日付 品名 予算 金額 差額 [ 8] 2/1 ddd 1000 500 500 [ 9] 2/1 eee 2000 600 1400 [10] 2/1 fff 1800 1200 600 [11] 合計 4800 2300 2500 [12] [13] 日付 品名 予算 金額 差額 以下、同一シート内にデータ群が続いていき、 さらにWoorkbook Sheet2, Sheet3 ..... と続きます。 以下、自作のVBA Sub sample() Dim my_last_row As Long '最終行の行数用 Dim my_last_address_sum As Long '最終行から一つ下のセル(合計用のセル)のアドレス取得用 my_last_row = Range("D65536").End(xlUp).Row my_last_address_sum = Range("D65536").End(xlUp).Offset(1).Address(RowAbsolute:=False) '=sum関数の埋め込み Range(my_last_address_sum).Formula = "=sum(C1:" & "C" & Format(my_last_row) & ")" '=sum関数を埋め込んだセルのコピー Range(my_last_address_sum).Copy '=sum関数を埋め込んだセルから、右に1つ分だけセルを移動する Range(my_last_address_sum).Offset(0, 1).Select '移動したセルを基準にして、右に2つ分だけセルを拡張する(合計3セルを選択する) Range(ActiveCell, ActiveCell.Offset(0, 2)).Select '選択した3つのセルに対して、=sum関数を埋め込んだセルのペーストする ActiveSheet.Paste 'セルA1に戻る Range("A1").Select End Sub
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (9)
- n-jun
- ベストアンサー率33% (959/2873)
- n-jun
- ベストアンサー率33% (959/2873)
- n-jun
- ベストアンサー率33% (959/2873)
- redfox63
- ベストアンサー率71% (1325/1856)
- redfox63
- ベストアンサー率71% (1325/1856)
- redfox63
- ベストアンサー率71% (1325/1856)
- redfox63
- ベストアンサー率71% (1325/1856)
- n-jun
- ベストアンサー率33% (959/2873)
- tossy005
- ベストアンサー率38% (7/18)
お礼
n-junさま 回答をどうもありがとうございました。 マクロは正しく動作しました。どうもありがとうございました。 マクロ自体は問題なく動くので、まったく問題ないのですが、 理解を進めたいため、ひとつ質問させてください。 マクロの流れは、理解したつもりなのですが、 If .UsedRange.Cells.Count < 2 Then ここのcountがなぜ<2なのでしょうか? UsedRangeが2以下、つまり1個という状態がうまく理解できません。 つまり、私が言っているような空シート、n-junさまの言われる 「空シートとはデータが一切ない物とします。(項目行を含め、何もない状態)」の状態で、 cells.countすると、UsedRangeが1になるということですか? 私の考えではcells.countしても、データがないので「0」になる。 なので、 If .UsedRange.Cells.Count < 1 Then でもいいように感じています。 そこで、実際に1にしてマクロを実行すると Set r = Intersect(.UsedRange.SpecialCells(xlTextValues), .Range("B:B")) でエラーになります。 このあたりで意味が分からなくなります。 お時間あればご教授ください。 よろしくお願いします。