第0回 直感！スグに使える業務向けVBA汎用プロシージャ(導入&配布)

はじめまして！Qiita初投稿です。

数年前から職場の業務効率化を推進すべく数多のVBAツールの開発を行ってきました。
その中で得られたノウハウを公開し、少しでも多くの方のDXの助けになればと思い筆を執りました。
このような技術記事の執筆は初めてのため至らぬ点が多々あるかと思いますが、興味を持っていただければ幸いです。

## VBAとは？
VBA（Visual Basic for Applications）とは、Microsoft Officeアプリケーションの機能を拡張するためのプログラミング言語です。WordやPowerPointでも使うことができますがおそらくほとんどの人はExcelで使うかと思います。私も実際ほとんどExcelで使用しています。本シリーズで紹介するコードはExcelで使うことを前提としております。

また、本シリーズは配布する汎用プロシージャたちを**直感的に**使っていただくことが目的ですのでコードの文法の解説は基本的に割愛させていただきます。しかし、応用が利きそうなノウハウについては紹介させていただく場合もございます。

どうしても汎用プロシージャの解説となると記事の内容が中～上級者向けになってしまうかと思われますが、可能な限りハードルを下げVBA初心者の方にもご利用していただけるように工夫していこうと思います。

## VBAの利点
近年、Pythonの台頭により「VBAは古い」なんて声をネット上で見る機会も増えました。実際に面と向かって言われたこともあります。

しかし同時に「VBAは大事だろ」といった意見も見るようになりました。私見ではありますが、VBAの利点を挙げてみようと思います。

**・環境構築の必要がない**
これは明確なVBAの強みになります。Pythonの場合、

1. 公式サイトからインストーラをダウンロード&インストール
2. VSCode等エディタの設定
3. 場合により仮想環境の構築
4. 外部ライブラリのインストール
5. 各バージョンの管理 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ファイル）

https://drive.google.com/file/d/11qEUTsq87UItzoKu2okX5WgEopRercCb/view?usp=drive_link

【利用規約】

本VBA汎用プロシージャ集(以下「本ツール」)は、個人・業務問わず自由にご利用いただけます。
本ツールは自由に使用・編集いただけます。
ただし、以下の内容をご理解・ご同意のうえご活用ください。

禁止事項
- 本ツールの自作発言
- 本ツールの無断再配布(.basファイルを含む)
- 公序良俗に反する用途での使用

免責事項
- 本ツールの使用により発生したいかなるトラブル・損害についても、作者は責任を負いかねます。
- 必ずご自身の環境や業務に合わせてテストのうえ、ご利用ください。

## 収録プロシージャ一覧 - Ver.1.2.0
| プロシージャ名		| 概要						|
|-------------------------------|-----------------------------------------------|
| SpeedUp			| 処理の高速化(画面更新停止など)を一括制御	|
| GetRowEnd / GetColEnd		| 指定列/行の最終セル位置を取得		|
| SearchRow / SearchCol		| 指定列/行から文字列検索(完全一致 or あいまい)	|
| CellToArray / PasteArray	| セル⇔配列の相互変換				|
| ArrayToCsv / ArrayToCsv_UTF8	| 配列をCSV形式で保存(Shift_JIS or UTF-8)		|
| OpenFolder / OpenFile		| フォルダ/ファイルを開く(cmd経由)		|
| GetFilePath / GetFilePaths	| ファイルパス取得(単体/複数)			|
| GetFolderPath / GetItemPaths	| フォルダパス/内部ファイル一覧を取得		|
| CreateDummyFolder		| 重複しない一時フォルダの作成			|
| UnzipFile / UnpackTar		| PowerShellによるzip/tar解凍			|
| GetDuplicateValues		| セル範囲内の重複値だけを抽出			|
| GetUniqueValues		| セル範囲内のユニークな値だけを抽出		|
| HighlightDuplicates		| セル範囲内の重複値をランダム色で強調表示	|

Ver.1.2.0リリースいたしました！
Ver.1.1.0とともに以下のプロシージャを新規で追加しました。
| プロシージャ名		| 概要						|
|-------------------------------|-----------------------------------------------|
| SortArray					| 1次元配列の内容を昇順または降順にソート			|
| ShowAllCells					| 対象シートの全行・前列を表示					|
| AutoCellToArray				| 対象シートのセルの内容を自動で配列に変換			|
| GetDataArea					| シートのデータ範囲のアドレスを自動取得			|
| AutoDeleteBlankRows / AutoDeleteBlankColumns	| 空白行/列を削除						|
| GetFiscalYear / ToWareki			| 日付表記処理							|
| KanaConv / AtoZConv / NumConv			| 全角⇔半角変換						|
| FileSafe / SheetSafe				| 禁則文字を代替文字に変換					|
| MoveFileWithShortcut				| ファイル移動、必要により元フォルダにショートカット生成	|
| ConvertOneDrivePath				| OneDrive上のパスを物理ディレクトリに変換			|

収録しているすべてのプロシージャは依存関係なしにより単体の動作が可能です。
またプロシージャ内の変数も普段使うような変数名(i,jなど)は避けるように設定しておりますのでメイン処理にも干渉しにくくなっております。(念のため使用していただく際はご確認ください)
動作確認しておりますが、抜けもあるかと思われますし何かしらミスや処理の変更が起こる可能性もあります。判明次第都度アップデートをしていきます。

【更新履歴】
Ver.1.0.0(2025/04/20):リリース
Ver.1.0.1(2025/04/28):GetItemPathsの動作の修正、一部文言の修正
Ver.1.1.0(2025/06/14):プロシージャの追加、一部既存関数の修正
Ver.1.2.0(20205/6/16):SortArrayの機能向上、ConvertOneDrivePathの追加

第1回以降、収録プロシージャの簡単な解説や使用例の紹介を行っていきますので引き続きよろしくお願いいたします。

良きVBAライフになりますことお祈りしております！

## 直感！VBAシリーズ記事一覧
もしよろしければ他の記事もご覧ください！

https://qiita.com/Reko/items/af042ae33cdc01e1dc96

https://qiita.com/Reko/items/9e211c9c496e12283f33

https://qiita.com/Reko/items/c2dab7b0e8207f8049df

https://qiita.com/Reko/items/b5abcdf614cef5d4073a

https://qiita.com/Reko/items/3451339e723a34ac7897

https://qiita.com/Reko/items/40c66556ac51a8006ea6

https://qiita.com/Reko/items/0269b2bece07a675e797

https://qiita.com/Reko/items/e2d0d0bf2dea4feface1

https://qiita.com/Reko/items/b995c3da88d25f6e0104

https://qiita.com/Reko/items/bc97d79599cfd431b2f3

https://qiita.com/Reko/items/1731aaddfc6e50c209df

https://qiita.com/Reko/items/554a47f2aa944e2eec5e

https://qiita.com/Reko/items/e8253ac68ccafba44ad3