Power BIというMicrosoft社のBIツールを利用するに当たり、大量にエクセルファイルにテーブルをセットする必要が生じたので、それを解決するVBAのサンプルコードをご紹介します。より深く理解したい方は、関連記事やブログ後半の解説を併せてご覧下さい。
<関連記事>
目次
大量のエクセルシートにテーブルを設定する
単刀直入にサンプルコードを入手したい人の為に、いきなりサンプルコードを書きます。まずはコアとなるテーブルをセットする部分のコードです。
次々にテーブルをセットするサンプルコード
Sub テーブルをセットする() Dim rw As Long '最終行を取得する Dim clm As Long '最終列を取得する Dim rng As Range 'テーブルをセットする範囲を取得する rw = Cells(Rows.Count, 1).End(xlUp).Row clm = Cells(1, Columns.Count).End(xlToLeft).Column rng = Range(Cells(1, 1), Cells(rw, clm)) ActiveSheet.ListObjects.Add(xlSrcRange, rng, , xlYes).Name = "テーブル-" & ActiveSheet.Index ActiveWorkbook.Close SaveChanges:=True End Sub
左端、1行目から表が始まっている前提です。次にデスクトップに保存してあるエクセルファイルに次々にテーブルを設定するように変更します。
Sub テーブル作成の処理の流れをコントロールする() '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 'このプロシジャはデスクトップに保存してある全てのエクセルファイルの全てのシートに 'テーブルを設定するための処理の流れを記述する '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Const folder As String = "C:\Users\hogehoge\Desktop\" 'ここは実際のフォルダ名にする Dim temp_file As String '順にファイルをチェックしていくときに、ファイル名を一時的に格納する Dim ws As Worksheet '順にファイル内のシートを操作していくときにシートを一時的に格納する temp_file = Dir(folder & "") '初期設定 Do While temp_file <> "" 'Dirが何も返さなくなるまで、つまりファイルを全てチェックし終わるまで繰り返す Workbooks.Open Filename:=folder & temp_file For Each ws In Worksheets ws.Activate Call テーブルをセットする Next ws temp_file = Dir() '引数をとらなければ次の未検索のファイルを探す。未検索のファイルがなくなると””を返す Loop End Sub
Dir()関数を使って次々に特定のフォルダ内のファイル名を取得してそのファイルを開いていきます。実際にこのサンプルコードを使う時には、「ここは実際のフォルダ名にする」の部分を実際のフォルダ名に変更します。元のデータをバックアップとして残すために、テーブルセット用のフォルダを用意して、そこにテーブルをセットしたいファイルをコピーして作成しておくのがオススメです。VBAで加工したファイルはCtrl+Zで戻せないので、バックアップを忘れないようにしましょう。
ちょっとだけ解説
自分で自在にこういったコードを作れるようになりたい人や、上記のサンプルコードを改造したい人の為に少し解説します。
テーブルをセットする部分
テーブルをセットする部分のコアとなるコードは下記の通りです。ちなみに手作業でテーブルを設定するにはCtrl+Tです。
ActiveSheet.ListObjects.Add(xlSrcRange, rng, , xlYes).Name = "テーブル-" & ActiveSheet.Index
ひとつ目の引数はおまじないです。ふたつ目の引数はテーブルを設定する範囲です。みっつ目の引数は空白です。よっつ目の引数が大事で、ここをxlYesにしておくと一行目がヘッダーとしてテーブルを生成します。xlNoにすると全てをデータだとしてテーブルを生成します。BIツールに取り込むのであれば、一行目はヘッダになっているはずなのでxlYesにしています。省略するとエクセルさんが判断してくれますが、明確に決まっているのであればxlYesを指定すべきです。
テーブルを設定すると同時にテーブル名を設定する必要があるので、右辺で代入します。テーブル名がダブらないように「テーブル」という文字列ににシートのインデックス番号を結合したものをテーブル名としました。
次々にブックとシートを呼び出す部分
テーブルをセットする部分を別のプロシジャにしたことによって、それを呼び出す部分に特化したプログラムにしています。
実際、このように特定の機能を別のプロシジャにしないと一つのプロシジャが長くなりすぎますし、ループの中にループがあってさらにその中に処理があるので、可読性が落ちます。
明確に機能が分離できるときはこのように機能と処理の流れを分離するのがオススメです。
VBA フォルダの中をループで検索して、きょうの日付のファイルを開くで解説したように、Dir()関数を使ってフォルダ内検索を行っています。Dir()関数は引数を省略すると、未検索のファイル名を取得する、という挙動を利用しています。
以上、大量の作業や毎日の提携作業に便利なエクセルVBAを使って、業務の効率化を図っていきましょう。
<関連記事>