はじめまして!Qiita初投稿です。
数年前から職場の業務効率化を推進すべく数多のVBAツールの開発を行ってきました。
その中で得られたノウハウを公開し、少しでも多くの方のDXの助けになればと思い筆を執りました。
このような技術記事の執筆は初めてのため至らぬ点が多々あるかと思いますが、興味を持っていただければ幸いです。
VBAとは?
VBA(Visual Basic for Applications)とは、Microsoft Officeアプリケーションの機能を拡張するためのプログラミング言語です。WordやPowerPointでも使うことができますがおそらくほとんどの人はExcelで使うかと思います。私も実際ほとんどExcelで使用しています。本シリーズで紹介するコードはExcelで使うことを前提としております。
また、本シリーズは配布する汎用プロシージャたちを直感的に使っていただくことが目的ですのでコードの文法の解説は基本的に割愛させていただきます。しかし、応用が利きそうなノウハウについては紹介させていただく場合もございます。
どうしても汎用プロシージャの解説となると記事の内容が中~上級者向けになってしまうかと思われますが、可能な限りハードルを下げVBA初心者の方にもご利用していただけるように工夫していこうと思います。
VBAの利点
近年、Pythonの台頭により「VBAは古い」なんて声をネット上で見る機会も増えました。実際に面と向かって言われたこともあります。
しかし同時に「VBAは大事だろ」といった意見も見るようになりました。私見ではありますが、VBAの利点を挙げてみようと思います。
・環境構築の必要がない
これは明確なVBAの強みになります。Pythonの場合、
- 公式サイトからインストーラをダウンロード&インストール
- VSCode等エディタの設定
- 場合により仮想環境の構築
- 外部ライブラリのインストール
- 各バージョンの管理 etc...
とやることが多く、初見ではPythonを使える状態にまで持っていくこと自体が難しかったりします。そもそも社内のパソコンでPythonの開発環境がある職場は限られてくると思います。
その点VBAはMicrosoft Officeが入っていれば使えるので導入ハードルが低いです。恐らくほとんどの企業でMicrosoft Officeアプリケーションは入っていると思いますので実質的に環境構築の必要がありません。
なんだかんだ多くの仕事はExcelベースで進められることが多いので持っていていいスキルだと私は考えます。そのうえでPythonと使い分けができると素敵ですね!
・ブック、シート上で入出力の確認ができる
ツール開発の際、一気にすべての処理を作るわけではなく小さい単位の処理を作りながら進めていくかと思いますが、VBAは処理の結果をシートあるいはブック上つまりGUIベースで確認がしやすいです。シート活用のほかMsgboxやDebug.Printやり方は様々ありますので割愛しますが、デバッグがしやすく開発のストレスは比較的小さくできると思います。
・GUIアプリが作りやすい
Excel自体がGUIアプリですので、セルや図形挿入等をうまく使うことで比較的簡単にGUIアプリを作成することができます。
例えばPythonの場合、GUIアプリを作りたい場合は"Tkinter"や"CustomTkinter"などの外部ライブラリを使用するのですが、結構入出力の設定が面倒ですので、この点もVBAの利点だと考えています。
・その気になれば簡単なAIも作れる
何を作りたいかによりますし難易度は高いですが、VBAでもAIを作ることはできます。Excelはデータベースを作りやすいので、それを活用したAIシステムをVBAで構築できればわざわざPythonを介する必要がありません。頑張れば生成AIのようなこともできて楽しいです!
Pythonの何が先進的か、そして本シリーズのコンセプト
近年のAI需要に伴いPythonが注目を集めておりますが、よく言われているのは「コードが直感的」、「先進的」だと思います。このように言われる要因は豊富な外部ライブラリにあると考えます。
ロジックをゴリゴリに組むというよりも関数を駆使してコマンドのようにシステムをくみ上げていくようなイメージです。逆にVBAはそういったものが基本的に存在しません…
ならば作ってしまえばいい!
ということでPythonライクというと大げさかもしれませんが、VBAのシステム開発における頻出処理や「こういうのあると楽だな~」といった処理を汎用プロシージャとして編纂し、Pythonの外部ライブラリのノリで使っていただけるようなものを作ることを目標としております。
汎用プロシージャとは
ざっくり言うと様々なVBAプログラムに活用できる小さな処理単位です。
VBAに限らずだと思いますが、様々なプログラムを書いていると「この処理毎回書かなきゃいけないのめんどくさいな~」なんて経験あるかと思います。例えば...
・シートの特定列の最終行を取得する
・ある範囲の内容を別のシートにコピー&ペースト
・フォルダの中のExcelファイルを開いて閉じてを繰り返す
・ファイルやフォルダのパスを取得する etc...
といった処理はいろんな場面で出てくると思います。ですがいちいち書くの面倒ですので、絶妙な規模の処理単位に分けメイン処理から外に出し必要の都度呼び出せるプロシージャの集まりを汎用プロシージャといいます。汎用プロシージャのメリットとして
・再利用性 - 都度書かなくてよくなるため開発速度が向上します
・可読性の向上 - メイン処理がスッキリするのでメンテナンス性にも優れます
が挙げられます。そもそも面倒な仕事を楽に終わらせるためのプログラミングなのにそれ自体を楽してしまおうという何とも人間の業が詰まった代物になります(笑)
配布先
以下のリンクから .bas
ファイルをダウンロードできます(zipファイル)
【利用規約】
本VBA汎用プロシージャ集(以下「本ツール」)は、個人・業務問わず自由にご利用いただけます。
本ツールは自由に使用・編集いただけます。
ただし、以下の内容をご理解・ご同意のうえご活用ください。
禁止事項
- 本ツールの自作発言
- 本ツールの無断再配布(.basファイルを含む)
- 公序良俗に反する用途での使用
免責事項
- 本ツールの使用により発生したいかなるトラブル・損害についても、作者は責任を負いかねます。
- 必ずご自身の環境や業務に合わせてテストのうえ、ご利用ください。
収録プロシージャ一覧 - Ver.1.0.0
プロシージャ名 | 概要 |
---|---|
SpeedUp | 処理の高速化(画面更新停止など)を一括制御 |
GetRowEnd / GetColEnd | 指定列/行の最終セル位置を取得 |
SearchRow / SearchCol | 指定列/行から文字列検索(完全一致orあいまい) |
CellToArray / PasteArray | セル⇔配列の相互変換 |
ArrayToCsv / ArrayToCsv_UTF8 | 配列をCSV形式で保存(Shift_JISorUTF-8) |
GetFilePath / GetFilePaths | ファイルパス取得(単体/複数) |
GetFolderPath / GetItemPaths | フォルダパス/内部ファイル一覧を取得 |
OpenFolder / OpenFile | フォルダ/ファイルを開く(cmd経由) |
CreateDummyFolder | 重複しない一時フォルダの作成 |
UnzipFile / UnpackTar | PowerShellによるzip/tar解凍 |
HighlightDuplicates | セル範囲内の重複値をランダム色で強調表示 |
GetDuplicateValues | セル範囲内の重複値だけを抽出 |
GetUniqueValues | セル範囲内のユニークな値だけを抽出 |
収録しているすべてのプロシージャは依存関係なしにより単体の動作が可能です。
またプロシージャ内の変数も普段使うような変数名(i,jなど)は避けるように設定しておりますのでメイン処理にも干渉しにくくなっております。(念のため使用していただく際はご確認ください)
動作確認はしておりますが、何かしらミスや処理の変更が起こる可能性もあります。判明次第都度アップデートをしていきます。
第1回以降、収録プロシージャの簡単な解説や使用例の紹介を行っていきますので引き続きよろしくお願いいたします。
良きVBAライフになりますことお祈りしております!
直感!VBAシリーズ記事一覧
もしよろしければ他の記事もご覧ください!