• 締切済み

EXCELのVBAで他のシートから合計を出すには

お世話になります。表題の件についてご質問申し上げます。何卒よろしく御回答下さいます様、お願い申しあげます。 やりたいことは表題のとおりですが、流れとしましては 1)業務アプリからCSVファイルを作成する。 2)このCSVファイルをエクセルに取り込んで、集計します。 3)CSVファイルは、「英語」「国語」「フランス語」「ドイツ語」といった領域で1ファイルです(english.csvのようなイメージで・・・ただし、ファイル名は集計をとる人が勝手に作ります) 4)中のデータとしては、     A B C D       ・・・・・・・ 1  名前    レッスン1  レッスン2    レッスン3  ・・・・・・ 2 山田太郎    1                 1 3 鈴木一郎            1     1 4 渡辺五郎    1 のように、「レッスンを受けた」場合に「1」というデータが落ちてきます。データが飛び飛びになります。 5)とりあえず現在はCSVを「ファイルを開く」コマンドで開いてシートに張り付け、「英語」「国語」「フランス語」・・・というようなシートを自動で作る(コピー&ペーストする)までは出来、1ファイルだけならば計算もできた 6)不明な箇所は、「言語ごとで、縦合計するところが違う」というところです。 例)英語ならば レッスン5,6,7   国語ならば レッスン7,8,9   フランス語ならば レッスン6,7,8,9,10 というイメージです。 ほぼ範囲は連続していて、縦合計するだけの話なのですが、複数のデータが絡むとうまく シート1の結果に現れません。 もう一回整理してみます。 1)業務アプリからデータ用のCSVを作る。1教科1ファイル。 2)それをエクセルに取り込んで、教科ごとに指定の範囲の縦合計をシート1に結果として 書き出す。 学生数は教科によって違い、指定の範囲も教科によって違う。 また、データは「受けた」→「1」、「受けていない」→Nullで表現されている。 指定の範囲は集計する時や担当で異なる。 3)これを必要な教科分、行う。 4)縦合計したらシート1に「結果」として書き出す。   イメージ)    レッスン3   レッスン4  レッスン5         英語  10       3        8     (←縦合計で受けた人数が把握できる)         5)とにかく簡単に統計を取りたい。 最後に、言葉足らずの面が多々あるかとは存じますが、疑問点などございましたら 真摯にお答えしますので、何卒よろしくお願いいたします。  

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

■とりあえず作りました 標準モジュールへ以下のVBAコードを貼り付けてください。  (参照→:http://officetanaka.net/excel/vba/beginner/10.htm) 合計対象のセルを範囲選択してからマクロ「集計」を実行してください。 ファイルを選択するダイアログが表示されますので、複数ファイルを指定してください。 合計結果が範囲選択したセルへ出力されます。 添付画像のような集計フォーマットで動作します。 (下記の条件を満たしていれば、多少フォーマットが異なっていても動作します) 動作の条件として、以下を満たす必要があります。  (1)合計を表示するセルを選択してから実行する  (2)選択セルの1行上に集計対象のレッスン名が入力されている   (レッスン名はCSVの1行目に入力されているものと同じもの) あまりエラー対策していないため、問題があれば補足願います。 ◇以下VBAコード Sub 集計() '宣言 Dim filnames As Variant, myfile As Variant Dim i As Integer, key As String, tcol As Range Dim myRanges As Range, myRange As Range '入力対象取得 Set myRanges = Selection 'ファイル名格納 filnames = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", MultiSelect:=True) If IsArray(filnames) = False Then Exit Sub '集計処理 myRanges.ClearContents Application.ScreenUpdating = False For Each myfile In filnames   Workbooks.Open Filename:=myfile, ReadOnly:=True   For Each myRange In myRanges     key = myRange.Offset(-1, 0)     Set tcol = Rows(1).Find(What:=key)     If tcol Is Nothing Or key = "" Then       MsgBox "対象のレッスンが見つかりません。", vbYesNo, "エラー"       Application.ScreenUpdating = True       ActiveWorkbook.Close       Exit Sub     End If     myRange = myRange + WorksheetFunction.Sum(Columns(tcol.Column))   Next   ActiveWorkbook.Close Next Application.ScreenUpdating = True MsgBox "終了" End Sub ■要望あれば補足願います 全体の流れはわかりますが、実際の流れはどのようにしたいのでしょうか? VBAの想定できる操作・流れ(要望など)をあれば補足願います。 たとえば、 ・教科ごとのフォルダ分けされたCSVを対象とする ・複数のCSVを取り込んで教科を判別してから集計する  (判別する場合、該当箇所・様式はどのようになっているか) など。 ■不明・確認点など 以下が食い違っていますが、本来は一致しますか? >例)英語ならば レッスン5,6,7 >イメージ)  レッスン3  レッスン4  レッスン5 >  英語     10      3        8

関連するQ&A