- 締切済み
[ExcelVBA]ファイル間集計についてです.
こんにちは. ExcelVBA初心者の者です. book1.xlsm book2.xlsm book3.xlsmのように三つのマクロファイルが共有フォルダ内に存在するとします. 各マクロファイルの中身は同じで,Sheet1のA列に文字が入っており,B列C列に数字が入っています. 同じく,Sheet2にもA列に文字が入っており,B列C列に数字が入っています. book1,book2,book3各マクロファイルに誰かが毎日入力を行うのですが,Sheet1はAさんが入力を行い,Sheet2はBさんが入力を行うように決まっています.(Sheet1はAさんが入力担当Sheet2はBさんが入力担当) このとき,book4.xlsmというマクロファイルを別に用意し,このマクロファイルのユーザーフォーム1のCommandBotton1を押すだけで,各ファイル(book1,book2,book3)の値をSheet毎に集計(値をbook4に持ってくる)したいのです. 集計を行う際に,2回目以降にボタンを押した際には,前回集計された続きから集計をしたいで す. しかし,マクロは初心者のため,どなたかご教授頂けると助かります.よろしくお願いします.
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。#1は前置き的なので、具体的なことを記します。 VBScriptのFileSystemObject(FSO) が便利なので勉強すべきだ。WEB照会して勉強のこと。 ーー "C:\Users\XXX\Documents\計数例1" のフォルダを作り その計数例1フォルダに下記ブックとシートを作る。 計数例22.xlsmにSheet1,Sheet2、Sheet3 計数例21.xlsmにSheet1,Sheet2 計数例31.xlsmにSheet1,Sheet2 計数例11.xlsmにSheet1,Sheet2 各シートにはA列氏名、B列は計数ということで数値を入力。 (質問には、計数が何のデータかぐらい書いてほしいな。) ーー 集約シートのブックとして、「順次Book把握.xlsm」を作る。 (これは "C:\Users\XXX\Documents\計数例1フォルダとは別にしている。) 一緒に入れるとこのブック分は集計対象から除外が必要になる。 SubFolderを作ると、さらに初心者にはむつかしくなるだろうから避けた。 ーー その「順次Book把握.xlsm」の標準モジュールに Sub test02() Dim sh As Worksheet i = 1 '結果を出すシートの第1行のための設定 Set objFs = CreateObject("Scripting.FileSystemObject") Set objfolder = objFs.GetFolder("C:\Users\XXX\Documents\計数例1") For Each fl In objfolder.Files sn = fl.Name MsgBox sn Workbooks.Open "C:\Users\惇\Documents\計数例1" & "\" & fl.Name Workbooks(sn).Activate '--シート For Each sh In Workbooks(sn).Worksheets MsgBox fl.Name & "の" & sh.Name '--処理 sm = WorksheetFunction.Sum(sh.Range("b2:B10")) Workbooks("順次Book把握.xlsm").Worksheets("Sheet1").Cells(i, "A") = fl.Name & "の" & sh.Name Workbooks("順次Book把握.xlsm").Worksheets("Sheet1").Cells(i, "B") = sm i = i + 1 Next '-- Workbooks(sn).Close Next End Sub (Msgbox の行は確認用で、無くても良い) これを実行した。 (質問のやり方に従えば、コマンドボタンのクリックイベントに、「Test02」の1行を入れて、ボタンをクリックする、になる) ーー 「順次Book把握.xlsm」のブックのSheet1のA列、B列に 計数例22.xlsmのSheet1 665 計数例22.xlsmのSheet2 152 計数例22.xlsmのSheet3 10 計数例21.xlsmのSheet1 707 計数例21.xlsmのSheet2 100 計数例31.xlsmのSheet1 646 計数例31.xlsmのSheet2 547 計数例11.xlsmのSheet1 563 計数例11.xlsmのSheet2 696 のようになる。 もし各シートのC列各行データに、過去に加算したものは加算済みのサイン「1」を入れるなら 上記のsm = WorksheetFunction.Sum(sh.Range("b2:B10")) を下記に置き変えると sm = WorksheetFunction.SumIf(sh.Range("C2:C10"), "<>1", sh.Range("B2:B10")) (C10などの10は行数が多い本番では修正を別途考えること) 過去に加算してしまったデータは、今回作業では除外されて、 「順次Book把握.xlsm」のブックのSheet1のB列には加算しない。 そういう作業ステップが必要ということ。上記には省略している。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
補足:尻切れトンボでした。 【システム化のアイデア】 Book1、2、3のデータをデータベースにエクスポートする。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
■Excelなんて利用したこともない老人ですが・・・・・ 私なら、次のように構想しますね。 1、Book1、2、3を閉じるときにデータを吐き出す。 Book1_20160116.TXT 2016/01/16,001,A,1 2016/01/16,002,B,1 2、Book4を開くタイミングで集計・表示する。 これだと、Book間集計なんてややこしいことを考える必要はないでしょう。 【高速化のアイデア】 Book1、2、3のデータを構造体変数に格納してバイナリで吐き出す。これだと0.01秒で再計算し表示できるかと思います。 【システム化のアイデア】 ※実際のマクロはアイデアをヒントに独力で調査されたし。
- imogasi
- ベストアンサー率27% (4737/17069)
下記「疑問点」について、後の回答者のために、補足しておくとよいのではないかと思う。 >教授頂けると 回答者に、下請け的に丸投げしているのではないか。この課題はVBAの中級以後の課題だと思う。多シート、多ブックを扱うのはなれないとむつかしい。 ー 疑問点 (1)Sheet1、2、3といっている1つのブックのシート数は3つにかぎられるのか。質問のための例示か。 (2)Book1、2、3も3つに限られるのか。とりあえずの例示か。 どちらも「あるだけ」のシートや、あるだけのブックならFor Each ・・ Nextを使うことになると思うがそういうのを知っているか。 (3)「前回集計した、続きからの集計」 前回集計済みのデータ上の区別はどうやって行うのか。 集計済みであることを、集計した行の列にサインを持つ、とか、最終行番号を持つとか あるにかな。 そういう仕様は質問者で考えることだろう。 (4)どういう集計をするのか。ある列(B、C列各々)縦集計か。列内の何かの区分で (例A列の内容で)集計するのか。 (5)>ユーザーフォーム1のCommandBotton1を押すだけで,各ファイル・・背伸びしないで、「サブユーザーフォームの実行」でやる(実行する)ことからはじめるべきだ。 内容的には易しいが、Private Sub CommandButton1_Click() End Sub の中間にプロシージャ―名を郭だけだが。こんなことをわざわざ質問内に書いているのは、経験がないのかな ーー データの作例を質問にげるべきだ(画像を張り付けては見にくい)。文章で書くだけで済ますと読者にわからない。 ーー (1)マクロファイルといっているが、計数の集計を行うのはシートの部分のはずだから、マクロファイルという必要はない。ブックの拡張子を注意すればよいだけだろう。2207以後らしいが、エクセルバージョンの記述も質問にないね。 (2)エクセルを使って、手作業で、質問者のニーズを満たすエクセルの機能はないのか、前もって勉強したか。統合やピボットや「集計」などは使えないと確認したか。 可能であれば、マクロの記録など取って、そのコードが簡単になる。