作成したシートを使用し、自動集計アプリのプログラムを作成します。このプログラムは、図8の「アプリ実行」を押すことで動作します。プログラムの作成例はリスト1の通りです。
Option Explicit Sub ボタン1_Click() Const GRAPH_SHEET_NAME As String = "グラフシート" Const INPUT_SHEET_NAME As String = "入力ファイルシート" 'ワークブック変数 Dim wb As Workbook 'コピー用のワークブック変数 Dim copyWb As Workbook 'グラフ表示用のシート変数 Dim wsGraph As Worksheet 'データ保持用のシート変数 Dim wsData() As Worksheet '設定用のシート変数 Dim wsInput As Worksheet '入力ファイル名保持用変数 Dim inputFileNames() As String 'ループ変数、グループ番号、ファイル数 Dim i, j As Long Dim grNum As Long Dim fileNum As Long 'シート情報を代入 Set wb = ThisWorkbook Set wsGraph = wb.Sheets(GRAPH_SHEET_NAME) Set wsInput = wb.Sheets(INPUT_SHEET_NAME) '入力するグループ数とファイル数を代入 grNum = wsInput.Range("E2").Value fileNum = wsInput.Range("E3").Value '入力するデータに合わせて変数を再定義 ReDim wsData(1 To grNum) ReDim inputFileNames(1 To grNum, 1 To fileNum) '入力したデータ数分のファイル名を代入する For i = 1 To grNum For j = 1 To fileNum inputFileNames(i, j) = wsInput.Cells(j + 1, i).Value Next j Next i '各種変数の宣言 Dim grIdx As Long Dim rowMax As Long Dim columnOffset As Long grIdx = 1 columnOffset = 1 ReDim chartObjs(grNum) As ChartObject ReDim Charts(grNum) As Chart Dim pos1, pos2, pos3, pos4 As String 'グループ数分繰り返す For i = 1 To grNum '散布図を作成する Set chartObjs(i) = wsGraph.ChartObjects.Add(Left:=100 + 500 * (i - 1), Width:=400, Top:=100, Height:=300) Set Charts(i) = chartObjs(i).Chart 'データ用のシートを追加する Set wsData(i) = wb.Sheets.Add wsData(i).Name = wsInput.Cells(1, i).Value 'ファイル数分繰り返す For j = 1 To fileNum Dim filePath As String 'ファイルを開き、列数を取得する filePath = wb.Path & "\" & inputFileNames(i, j) Set copyWb = Workbooks.Open(Filename:=filePath) rowMax = copyWb.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row 'データをコピーする copyWb.Worksheets(1).Range("A1:B" & rowMax).Copy 'データ保持用のシートに貼り付ける wsData(i).Cells(1, columnOffset).PasteSpecial xlPasteValues 'ファイルを閉じる copyWb.Close False 'グラフのX軸とY軸の位置を取得する pos1 = wsData(i).Cells(2, columnOffset).Address pos2 = wsData(i).Cells(2, columnOffset + 1).Address pos3 = wsData(i).Cells(rowMax, columnOffset).Address pos4 = wsData(i).Cells(rowMax, columnOffset + 1).Address 'グラフが参照するデータ位置を指定する With Charts(i) .HasTitle = True .ChartType = xlXYScatter .SeriesCollection.NewSeries.XValues = "=" & wsData(i).Name & "!" & pos1 & ":" & pos3 .SeriesCollection(grIdx).Values = "=" & wsData(i).Name & "!" & pos2 & ":" & pos4 .SeriesCollection(grIdx).Name = inputFileNames(i, j) .ChartTitle.Text = "グループ " & i End With columnOffset = columnOffset + 2 grIdx = grIdx + 1 Next j 'オフセットをリセット columnOffset = 1 grIdx = 1 Next i End Sub
最後に動作確認をしてみましょう。
図9に示す「アプリ実行」ボタンを選択し、プログラムを実行します。
アプリ実行ボタンを押すと、自動集計アプリが動作します。
プログラムの実行結果を以下の観点で確認します。
このプログラムでは、グループに合わせてシートを作成し、その中にデータをコピーします。本記事の例では、グループ数2で実行することを想定しているので、下記のシートが追加されます(図10)。
各シートのデータは、図11となります。
図11は各シートのデータの例です。このように、グループごとに指定したファイルが読み込まれていればOKです。
実行結果として図12に示すグラフを描画します。
図12に示す通り、2つの散布図が表示されます。このようなグラフが出てくればOKです。なお、ファイル名がデータの系列に出るようになっています。
今回も、前回と前々回に引き続き、VBAを使った自作ツールの作成例を紹介しました。特に今回は、筆者が実際に依頼を受けた業務を題材としています。データの集計作業は単純作業ですが、こんな作業で残業してまで頑張ることはもったいないと考えます。
手作業で頑張るのもいいですが、自分でツールを作ることも選択肢の一つとして考えていただければと思います。VBAを使って自作ツールを作ることで、作業の効率化や生産性の向上を図れます。ぜひ、この記事を自分の道具箱に入れて置き、必要な時に活用してみてください。
前々シリーズ「ソフトウェア技術者のためのバグ百科事典」を大幅に加筆、修正した山浦恒央先生の書籍「ソフトウェア技術者のためのバグ検出テキスト」が日科技連出版から好評発売中です。連載でも取り上げた、「要求仕様書のバグ」「実装抜けのバグ」「テスト業務のバグ」など、バグを36種類に分類して解説しています。囲碁や将棋であれば、「相掛かり」「矢倉」「四間飛車」「藤井システム」のような戦法を網羅した内容になっています。
前著「ソフトウェア技術者のためのバグ検出ドリル」(2019年11月刊行)も好評発売中です。実際にバグを含む要求仕様書、設計書、コーディング、デバッグ、保守を具体的に取り上げ、練習問題として31問を出題しました。同書は、囲碁や将棋における「次の一手」的な問題であり、ピンポイントの場面を取り上げ、実践力を鍛えることを目的としています。
両書とも興味のある方は、Amazon.comや書店でチェックしてください!
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.