Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3279 / 13645 ツリー ←次へ | 前へ→

【63126】全シートを統合したいです まこっちゃん 09/10/9(金) 21:01 質問[未読]
【63131】Re:全シートを統合したいです Stich 09/10/10(土) 10:42 質問[未読]
【63138】Re:全シートを統合したいです まこっちゃん 09/10/10(土) 13:14 発言[未読]
【63154】Re:全シートを統合したいです Stitch 09/10/11(日) 7:04 回答[未読]
【63156】Re:全シートを統合したいです kanabun 09/10/11(日) 11:07 発言[未読]
【63159】Re:全シートを統合したいです まこっちゃん 09/10/11(日) 19:59 お礼[未読]

【63126】全シートを統合したいです
質問  まこっちゃん  - 09/10/9(金) 21:01 -

引用なし
パスワード
   VBA初心者です
VBAで全シートを統合(合計)したいです
全てのシートのデータは同じでB列にはランダムに並んだ商品名、C列にはその数量があります
商品一覧の合計を新シートに表示するマクロとかありますか?

【63131】Re:全シートを統合したいです
質問  Stich  - 09/10/10(土) 10:42 -

引用なし
パスワード
   数量の合計を出すのですか?

また、各シートにはそのシートごとの合計値は
出されていない状態なのですか?

もうすこし、詳しい説明がほしいです。

【63138】Re:全シートを統合したいです
発言  まこっちゃん  - 09/10/10(土) 13:14 -

引用なし
パスワード
   お返事ありがとうございます。
現在、シートが100位あって、各シートには合計はなく、商品もランダムに記載されてます。
B列には数値化された商品名、C列には数量が下記のように記載されています
   1シート        2シート
  B     C      B    C    
1001580   32    1001530   3
1001580   1    1001520   6
1001520   3    1001510   6
1001510   1    1001413   6
1001580   10
1001413   2

これを下記のように合計数を表示したいのです
また1行目からデータが記載してあり行数は最大で5000行です

1001413   8
1001510   7
1001520   9
1001530   3
1001580   43

よろしくお願いします

【63154】Re:全シートを統合したいです
回答  Stitch  - 09/10/11(日) 7:04 -

引用なし
パスワード
   >VBA初心者です
ということであれば、いくつかの段階に分けて
ひとつづつクリアしていった方がよいかもしれませんね。

まず、最初のシートでフィルタオプションで品名のリストを
書き出し、そのシートの集計表を作る。

上記の操作を対象となる全てのシートに対してループ処理する形にする。

各シートに出来た集計表を新しいシートにまとめて、
最初の処理のやり方で集計する。

最初から、一括してやろうとするよりもこうしたやり方のほうが
理解しやすいのではないかと思います。

まあ、シートごとに集計表をつくったりせず、作業シートを用意して
逐次書き込んでいってもいいとおもいますが。

他にもやり方はいろいろあるとおもいますが、検討なさってみてください

【63156】Re:全シートを統合したいです
発言  kanabun  - 09/10/11(日) 11:07 -

引用なし
パスワード
   ▼まこっちゃん さん:

>現在、シートが100位あって、各シートには合計はなく、商品もランダムに記載されてます。
>B列には数値化された商品名、C列には数量が下記のように記載されています

>また1行目からデータが記載してあり行数は最大で5000行です

一般機能に その名も「統合」という機能がありますから、これを
使ってみてはいかがでしょう。

たとえば、対象Bookに 統合用シートを追加し
シート名をたとえば「統合」としておいて、
「Sheet1」と「Sheet2」に 提示のような元表があるとして、この
2枚のシートを メニュ−[データ]-[統合...]
から統合する操作のマクロ記録をとってみると、以下のようになります。

Option Explicit

Sub Macro1()
' マクロ記録日 : 2009-10-11 ユーザー名 : kanabun
'
  Sheets("統合").Activate
  Range("A1").Select
  Selection.Consolidate Sources:=Array("[Book1]Sheet1!R1C2:R6C3", _
    "[Book1]Sheet2!R1C2:R6C3"), Function:=xlSum, TopRow:=False, LeftColumn:= _
    True, CreateLinks:=False
End Sub
'これはマクロ記録にあるとおり、統合先の先頭セルをアクティブにしておいて、
統合元範囲のリストに 各シートのB,C列範囲を設定し、
>また1行目からデータが記載してあり
ということなので、【統合の基準】CheckBoxの「上端行(T)」のチェックを外し
て、集計の方法「合計」で 統合をかけたことを表しています。

> シートが100位あって、
ということなので、手操作で 100回も各シートの範囲を指定するのは大変なので、
上のマクロ記録を もすこし汎用的に使えるように修正します。
ポイントは対象Bookの「統合」シートを除くすべてのシートをループして
データ範囲のアドレス(xlR1C1形式)を配列に格納していることです。
実際に統合する部分は Array... の部分を この配列変数に替えるだけで、
マクロ記録がそのまま使えます。

>  For Each ws In ActiveWorkbook.Worksheets
>    If Not ws Is wsT Then  'ws が 「統合」シートでなかったら
>      '範囲アドレスを配列に追加する

Sub Try1_統合()
  Dim ws As Worksheet
  Dim wsT As Worksheet
  Dim Ranges() As String, n As Long
  Set wsT = ActiveWorkbook.Worksheets("統合")
  For Each ws In ActiveWorkbook.Worksheets
    If Not ws Is wsT Then
      n = n + 1
      ReDim Preserve Ranges(1 To n)
      With ws
        Ranges(n) = .Range("B1", .Cells(.Rows.Count, 3).End(xlUp)) _
               .Address(, , xlR1C1, True)
      End With
    End If
  Next
  With wsT
    .UsedRange.ClearContents
    .Range("A1").Consolidate Sources:=Ranges, Function:=xlSum, _
              TopRow:=False, LeftColumn:=True
  End With
End Sub

ただ、100枚ものシートに統合をかけるとなると一呼吸かかるかもしれません。
そういう場合は Dictionaryオブジェクトというものを利用して、
端からVBAでやると高速処理できるでしょう。

【63159】Re:全シートを統合したいです
お礼  まこっちゃん  - 09/10/11(日) 19:59 -

引用なし
パスワード
   VBAが全く分からない私に1から作っていただき本当に感謝しております
ありがとうございました

3279 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free