
「アイデアはあるけど、スキルがない・・」
「コピペばかりで自分で考えて作れる自信がない」
「ツールやアプリ開発をしてアピール力を高めたい」
「てか、ツールを作るってどういうこと?」
本記事では
Excel VBAツールの開発 を例にして「ゼロからのツール開発の流れ」の一例を紹介します。
実際に自分がやりたいことに当てはめたりして、
「何かを作る」ということの一つの参考にしていただければと思います。
今回のテーマ
目的がないと、何も始まらないのでテーマをまず決めます。
この記事では
- Excel VBA でCSVファイル分割を自動化する
というのをテーマ=目的とします。
テーマを選んだ理由を考える
こんなときに手作業だと効率が落ちる・・・↓
- アップロードデータのサイズ上限があって分割しなければならない
- 分割しないとデータが重すぎる・アップロードが遅い
- 作業分担時にいちいち分割しなければならない
↑こんな感じで良いと思います。
メリットを考える
メリットが語れるとアイデアやツールを有効活用してもらえる確率が高まります。
「ツールを作ること」のメリット
- ツールを一つ作るだけで同じ作業をしてる人全員が効率よくなる
- 非効率な作業に対する嫌悪感が減る
- メンバーごとの仕事の質を揃えられる
「Excel VBA」で作るメリット
- 配布がめちゃくちゃ楽だからみんなすぐ使える
- CSVにダイレクトに処理が行える
- VBAは記述も簡単で始めやすい&デバッグがしやすいため、管理しやすい(環境・個人差あり)
- 割となんでもできる
アイデアを書き出し、ルールを固める
いきなり作るといっても、まずはルールを決めなくてはいけません。
ここでいうルールとは、「ツールの仕様をどうするか」を具体化したものです。
以下のように、「アイデア」と「ルール」を書き出してみましょう。
アイデア(抽象的でもOK)
・Excelを開いた状態でプログラムを実行したい
・分割ファイルは自分で選択したい
・1行目に項目(header)が存在しているので、分割後のファイルにも付与したい
・分割されたファイル名には、連番を付与して欲しい
・「何個に分割する」というのを、実行するたびに指定したい。
・できれば、実行中の進捗がわかるようにしてほしい
↑ざっくりと、こんな願望を書き出してみます。
なんじゃそれってのも出したほうが、良い結果につながることもあります。
アイデアからルールを固める
・ボタンまたはマクロの呼び出しで実行可能にする
・ユーザーがファイルを選択するダイアログを用意する
・1行目をheaderとし、それより下をbodyとする
・分割されたファイル名は、「元のファイル名 + 連番( _n )」
・分割個数の入力欄を用意する。
一旦こんな感じでルールを決めました。
アイデアを書き出してからのほうが、どう作るかイメージしやすいのでオススメです!
自分に合っているベストな方法を編み出してください。
ツールの動作をイメージする
ここから先は、「プログラムを組む人目線」が重要となります。
コードを書く人が自分でも、他の誰かでも、とにかく大事なのは”伝わりやすくする”ということです。
※どんな表現が伝わりやすいかなどは、現場や、個人差があると思います。
プログラムのコーディングに慣れていなくても、「何がどうなるのか」を具体的にイメージすることで
何からコードを組み立てればいいか、わかりやすくなります。
①実行直後、選択ダイアログを出す。
②ファイルを選択後、分割数を入力する画面を出す。
③分割数から「何行ずつのファイルにするか」を計算する。
④対象のファイルをプログラム上で操作・加工する。*1
⇨ headerを取得し、新しいシート(またはブック)にコピーする
⇨ bodyを必要数だけ取得し、先にheaderをコピーしたシートに移す。
⇨ header/bodyを移したシートを名前(+連番)をつけて保存
大まかな流れは上記となりました。
ルールが決まったので、次は各処理を実際に作りながら形にしましょう。
実際に作る
① ユーザーがファイル選択できるダイアログを出す。
1 2 3 4 5 6 7 |
ChDir ThisWorkbook.path myfile = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", title:="CSVファイルを選択") If VarType(myfile) = vbBoolean Then MsgBox "キャンセル" Exit Sub End If |
今回は、この実行ツールと同じ階層をダイアログの初期値として設定するため、
「ChDir ThisWorkbook.path」としました。
② ファイルを選択後、分割数を入力する画面を出す。
1 |
n = InputBox("分割数を入力" & vbLf & vbLf & "0 または ブランク : " & "キャンセル" & vbLf ) |

説明を表示させておくと使う人がわかりやすいと思います。
③ 分割数から「1ファイルあたり何行のファイルにするか」を計算する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Private Function Get_Division_Num(ByVal End_Row As Long, ByVal TmpInt As Integer) Dim Res_A As Double Dim Res_B As Integer Res_A = (End_Row - 1) / TmpInt If Int(Res_A) = Res_A Then Res_B = Res_A Else Res_B = Application.WorksheetFunction.RoundUp(Res_A, 0) End If Res_B = Res_B + 1 Get_Division_Num = Res_B End Function |
「計算させる処理」などは一つのブロックとして関数化させると良いでしょう。
④ 対象のファイルをプログラム上で操作する
まず、最初に選択したファイルを開きます。
1 |
Workbooks.Open myfile |
次は以下を実行します。
⑴列数を取得
⑵ヘッダを取得
1 2 3 4 5 |
With ActiveSheet End_Col = .UsedRange.Columns.Count End With header = Range(Cells(1, 1), Cells(1, End_Col)) |
あとは分割処理のループが完成すればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
'Limit = n For i = 1 To Limit '最終行取得(項目行を除く) LastRow = ActiveSheet.UsedRange.Rows.Count - 1 'データが無ければスキップ If LastRow > 0 Then 'body Tmp_Cell = Range(Cells(2, 1), Cells(W_cnt, End_Col)) 'シート追加(tmp_1,2,3...) Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = "tmp" & "_" & i '項目名と2行目以降のデータを書き出し用シートに反映 Range(Cells(1, 1), Cells(1, End_Col)) = First_Row '項目 Range(Cells(2, 1), Cells(W_cnt, End_Col)) = Tmp_Cell 'データ '分割後のファイル名 TargetName = Filename & "_" & i & ".csv" 'Save ActiveWorkbook.SaveAs FolderName & "\" & Result_FolderName & "\" & TargetName, Local:=True Worksheets(1).Select 'コピー済みbodyをクリア&上に詰める Range(Cells(2, 1), Cells(W_cnt, 1)).EntireRow.ClearContents Range(Cells(2, 1), Cells(W_cnt, 1)).EntireRow.Delete Shift:=xlUp End If Next |
以上で大まかに処理のブロックが完成しました。
上記の行程を踏まえ、すべての処理を繋げれば完成です。
(適宜、分岐処理やエラー処理を追加してください)
完成イメージ
サンプル動作です。
CSVの分割が一瞬で終わるので、目的を達成できました。

厳密には途中で
「デバッグしながら動作をチェックする」
「コードを修正しながら最適化する」
ということにも時間を使っています。
今回は、ゼロ ⇨ 完成までの流れの紹介なので細かいところは省略します。
まとめ
いかがだったでしょうか。
「ツール開発」という視点で、Excel VBAはめちゃくちゃ始めやすいと思います。
こういう流れは、ものづくり全てに共通すると思いますので、参考になればと思います。
コードが書けなくても、ツールそのものをイメージ=設計するというのも、立派な「開発」です。
たくさんアイデアをだして、良いものを作っていきましょう!