Excelの自動化とVBA入門(4)

Excel-VBAによるプログラム(複数のファイルを読み込み、値を収集し、計算する)

1. Excel-VBA

ここまでは、マクロのあるエクセルファイル内で処理が完結していました。次は、別のエクセルファイルを読んで、情報を得て、新たなワークシートに計算結果を出力するプログラムを作ってみます。あと少し知識を得れば作ることは可能です。まずは、今回のプログラムの骨子をまとめてみます。

2. 今回作製するプログラム

▶ 目標:

  • 「三角形10個計算」から作成した3個のエクセルブックがあることを前提に、各ブックの3番目の三角形の面積等のデータを別のブックに集め(コピペ)、それらの面積の総和を求める。

▶ 事前準備:

  1. 入力データは「sample4」に示した「三角形10個計算」で三角形の名前をA、B、Cに変え、3番目の入力データだけは特別に変え、計算を行い、マクロなしのブック、「sankakuA.xlsx」、「sankakuB.xlsx」、「sankakuC.xlsx」として保存して作成(下図参照)。
  2. マクロを作るブックには、「上記3つのファイル名」が記入され、マクロを書き終えたら、いったん適当な名前(「Book1」以外)をつけて保存する(下図参照)。
  3. 上記のファイル(ブック)は同一のホルダー内にある。(同一ディレクトリ)

▶ プログラムの流れ:

  1. 変数の宣言
  2. マクロのあるブックの「ファイル(ブック)名」と場所(ディレクトリ)を取得する
  3. 読み込むファイル(ブック)の数を調べる(マクロのあるブックのファイル名の欄の最終行番号をもとに調べる)
  4. 出力ブックを生成する
  5. 一つ目の「三角形10個計算」ファイル名を読み、ファイルを開け、3番目のデータをコピーする
  6. 出力ブックをアクティブにして結果をペーストする
  7. 2つ目の「三角形10個計算」ファイルを開け、繰り返す。
  8. 3つ目の「三角形10個計算」ファイルを開け、繰り返す。
  9. 出力ブックで取り出した三角形の面積の総和を計算する
  10. 終了

▶ 使用する変数名と型

  1. マクロ入ったファイルの名前を格納する変数「mybook1、文字列型」
  2. 同上ファイルのホルダーの場所(ディレクトリ)を格納する変数「mypath1、文字列型」
  3. 「読み込むファイル名」を格納する変数は「inbook、文字列型」
  4. 「読み込むファイルの数」を格納する変数「ninbook、整数型」
  5. マクロのあるブックの最終行数を格納する変数「rowlength、整数型」
  6. 「出力ブック名」を格納する変数は「tbook、文字列型」

3. プログラムの作製に必要な知識の追加

1回目の説明では「マクロの自動生成」を通して「新規ファイルの生成法」、「別のファイルにある値のコピペ」、「ブックの保存」を見ました。2、3回目では「変数の取り扱い」、「配列の取り扱い」、「セルの指定法」に関してみてきました。加えて今回のプログラムのための知識を説明します。

▶ ファイル名の取得

  • 現在のファイルの名前を取得する命令は「ActiveWorkbook.Name 」

▶ ファイルのある場所(ディレクトリ)の取得

  • 現在のファイルのディレクトリを取得する命令は「ActiveWorkbook.Path」

▶ ワークシートの最終行番号の取得法

入力ファイルの数を調べるために、入力ファイルの列の最終行番号を調べます。最終行番号を取得する3の方法を示します。今回は一番目の方法を採用しました。

  1. 「ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row」(シートのA列の最終行のセルを起点に、最終行に上がり最終行番号を調べる。A列が最大行であることが必要)
  2. 「ActiveSheet.UsedRange.Rows.Count」(使用範囲の行数を調べる、A1から始まる必要がある(使用行数と最大行数が一致))。
  3. 「ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row」(広く使える。Withを用いて、短く書くのが普通)なお、「.Rows」は行のオブジェクトを返し、「Row」行番号を表す整数を返すプロパティ。「Rows.Count」は直前のオブジェクトの行数を返すオブジェクト式。

▶ ドライブの設定、パスの設定

  • ChDrive、ChDir

▶ 既存のファイルを開く

  • Workbooks.Open Filename:=ファイル名

▶ メッセージボックスの設置(メッセージボックスの作り方を示すために設置しました。)

  • MsgBox "テキスト" & 変数

4. プログラムの作成

ここまでの知識を集めれば、プログラムを書くことは可能です。作成例(リスト)を下に示します。リストの上から、命令を順に読んでやっていることを把握してください。また、最後の付けたリストをコピペすれば、動作は確認できます。うまく動かない時は、エクセルを閉じて再度立ち上げて動かしてみてください(ファイル名が重複する場合があるかもしれないので)。ウィンドを切り替えるため、速度はすごく遅いですが目的は達成できます。100個くらいのブックを対象にするならば、改良が必要になりそうです。

なお、入力データは「sample4」で、三角形の名前をA、B、Cに変え、3番目の入力データだけは変えて作り、マクロなしのファイル(拡張子「.xlsx」)として保存しました。詳細な内容は下の図を見てください。

▶ 作成例(入力ブック名とマクロのあるブック(ここではSample7))

▶ 準備した入力データのブック、面積の項目を含むA3(B3,C3)の部分が集計の対象




▶ 集計結果のブック、「sankakuA,B,Cの3番目のデータ」が抽出され、面積の総和が計算されている。


5. まとめ

以上で、Excelの自動処理~VBAの入門は終わりです。マクロの書き方、Excel-VBAの記述法、活用法は把握できたと思います。はじめは、VBAの「マクロの記録」を活用し命令を調べたり、ネットでサンプルを見つけてまねたりして、プログラムの作成をすれば良いと思います。自分のニーズをみつけて適用してみてください。今後も、面白いExcel-VBAの活用を見つけたら、紹介します。

6. プログラムリスト(空白行は取り除いた)

Sub Macro1()
' Macro1 Macro
Dim mybook1 As String
Dim mypath1 As String
Dim inbook As String
Dim ninbook As Integer
Dim rowLength As Integer
Dim tbook As String
mybook1 = ActiveWorkbook.Name '現在のワークブックの名前を取得
mypath1 = ActiveWorkbook.Path '現在のブックのパスを取得
rowLength = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行番号を調べる
ninbook = rowLength -1 '読込むブックの数
MsgBox "読込むブックの数" & ninbook '確認用メッセージボックスの表示
Workbooks.Add '新規ブックの追加(集計用)
tbook = ActiveWorkbook.Name '追加ブック名前取得
For i = 1 To ninbook
Workbooks(mybook1).Activate '入力ブック名のあるブックに移動
inbook = Range("A2").Cells(i, 1) 'データブック名の取得
ChDrive mypath1 'データブックのドライブへ変更
ChDir mypath1 'データブックのへのパスを設定
Workbooks.Open Filename:=inbook 'データブックを開く
Range(Cells(5, 6), Cells(5, 9)).Copy 'データブックの必要な部分をコピーする
Windows(tbook).Activate '集計用ブックに切替える
Range(Cells(i, 1), Cells(i, 4)).Select 'ペーストするセルを選ぶ
ActiveSheet.Paste 'ペーストを行う
Next i 'iを1増加して、Forに戻って繰り返す。iがninbookになるまで繰り返してループを終了する
Application.CutCopyMode = False 'コピペモードを終了する
ActiveSheet.Cells(ninbook + 1, 4).Select
ActiveCell = Application.WorksheetFunction.Sum(Range(Cells(1, 4), Cells(ninbook, 4))) '総和を計算
End Sub


1回目解説へのリンク:マクロ記述の準備と自動処理マクロ