和風スパゲティのレシピ

日本語でコーディングするExcelVBA

サンプルコード

ブックを読み取り専用で開く - ReadOnly

ブックを読み取り専用で開くにはWorkbooks.Openの引数ReadOnlyをTrueに指定します。ただし既に開いているファイルに対して実行しても、エラーにはならず、かつ読取専用にはなってくれませんのでご注意ください。

WorksheetのCopyメソッドを改良した関数を作る

ちょっと仕様がイマイチのCopyメソッドに、返り値がWorksheet、Before/AfterにWorkbookを渡せる(先頭/末尾にコピー)、非表示シートを渡せる、コピー後に保護を解除する機能を持たせた関数を作ってみましょう。

セル範囲から不要な範囲をカットする - Intersect

CurrentRegionやUsedRangeから上部の不要部分を消して、データエリアだけにするときなど、セル範囲から不要な範囲をカットするには、セル範囲同士の交差範囲(重複エリア)を取得するIntersectメソッドを使用します。

フォルダ内のファイル一覧を取得する汎用関数

フォルダ内の複数ファイルへ同じ処理を行う場合、①まずは対象ファイルのリストを取得、②そのリスト内の全ファイルへ処理のように処理を段階化するのが便利です。この①を簡単に行うための汎用関数を紹介します。

シート上の全フィルターをクリアする - ShowAllData

テーブルとフィルターが混在したシートにおいてすべてのフィルターをクリアするには、すべてのAUtoFilterオブジェクトからShowAllDataメソッドを実行します。この処理は選択セルの影響を受けるためご注意ください。

日付から月末を求める - EOMONTH/DateSerial

日付や年月から月末を求める方法を解説します。日付から月末を求めるにはEOMONTH関数、年月の整数値から月末を求めるにはDateSerial関数のDayに0を渡す方法をそれぞれ用いるのが簡単です。

テーブルのフィルターをクリアする - ShowAllData

テーブルのフィルターをクリアする場合は、ListObject.AutoFilterのShowAllDataメソッドを実行します。これはフィルターの抽出状態に関わらず実行できますので、抽出がかかっていなくてもエラーにはなりません。

ユーザー定義Functionにスピル機能を持たせる

ユーザー定義関数をスピルさせるには、配列(Array)を返り値として返すだけでOKです。一次元配列であれば横方向にスピルし、n行1列の二次元配列であれば縦方向にスピルさせることができます。

ZIPファイルをマクロで解凍する

Zipファイルをマクロで解凍する方法を解説します。WScript.ShellオブジェクトのRunメソッドを使用して、ZIPファイルを解凍するPowerShellをVBAから呼ぶのが一番簡単です。

フォルダを空にする(ファイル・フォルダを全削除)

フォルダを空にするには、ワイルドカード「*」を使った一括削除をファイル・フォルダ両方へ実行します。Killは可能ですがRmDirではできないため、FileSystemObjectのDeleteFile/DeleteFolderメソッドを利用します。

フォルダ内のすべてのファイルを削除する - Kill

フォルダ内のすべてのファイルを削除するには、Killステートメントのワイルドカード*を用いた一括削除を用いるのが簡単です。FileSystemObjectのDeleteFileメソッドでも全く同じ処理を実行可能です。

RGB値とHTMLカラーコードを相互変換する

RGB値とHTMLカラーコード(#FFFFFF形式)を相互に変換する方法を解説します。RGB⇒HTMLにはHex関数、HTML⇒RGBには&H接頭辞を使います。RGB値とHTMLコードはそのままではRとBが逆順であることにご注意ください。

指定列のデータ部分を取得する-Resize/Intersect

特定の列のデータ部分を取得する方法を解説します。Range(Cells, Cells)、第1セル.Resize(データ数)、Intersect(データ全体, Columns(指定列))、データ全体.Columns(指定列)の4種のコードを使い分けて使用します。

CurrentRegionに見出し行推定機能を追加する

表エリア取得に非常に便利なCurrentRegionですが、上部余白を誤取得してしまう弱点があります。この弱点を解消する改良型CurrentRegionを自作ましたので、よろしければ皆さんもご活用ください。

セル範囲の最終(右下)セルを取得する

セル範囲の最後のセルを取得には、セル範囲.Cells(セル範囲.Cells.Count)と記述します。セルの数番目のセル=最終セルという理屈で取得できます。このコードは複数エリアに対してはうごきませんのでご注意ください。

セル範囲の先頭(左上)のセルを取得する

セル範囲の先頭のセルを取得する方法を解説します。セル範囲.Cells(1)というコードで簡単に取得できます。他にCells(1, 1)やItem(1)などで取得することもできますが、Cells(1)が最も安定するコードです。

オートフィルターのデータ部分を取得する

オートフィルターのデータ部分を取得するにはAutoFilter.Rangeを使用します。ただしこれは見出しもついてくるため、Offset+Resizeを利用して見出しを除外します。各列を取得する場合はそこからIntersectを使用します。

フィルター抽出中のデータをコピーする

フィルター抽出中のデータをコピーする方法を解説します。Copyメソッドには「非表示行をコピーしない」機能があるため、 可視セルを取得する必要はなく、純粋なCopyメソッドで実行可能です。 抽出中のフィルターエリア全体をコピーする 見出し部分を除いてコ…

セル範囲(Range)が行全体/列全体か判定する

セル範囲が行全体/列全体か判定する方法を紹介します。セル範囲を含む行全体/列全体を取得するEntireプロパティを使い、そのAddressが元のセル範囲のAddressと一致するかを判定します。

文字列の全角/半角を切り替える - StrConv関数

文字列をすべて全角/すべて半角にするには、StrConv関数を使用し、第2引数にvbWide/vbNarrowを渡します。英数字だけでなくカタカナも対象になってしまうため、これらを個別に変換する場合は1文字ずつ変換します。

日付(Date)とyyyymmdd(Long)を相互変換する

日付(Date型)とyyyymmdd数値を相互に変換する方法にはFormat関数を使用します。日付⇒yyyymmddにはFormat(日付,"yyyymmdd")、yyyymmdd⇒日付にはFormat(数値,"@@@@/@@/@@")を用います。

特定の条件を満たす行を高速削除する

特定の条件を満たす行を削除する際、Unionによる高速化を用いても遅い場合用に、削除対象かを判定する列を作りその列でソート、それでひとつにまとまった削除対象データを一発で削除する方法を紹介します。

セルが特定のセル範囲内にあるか判定する-Intersect

あるセルが特定のセル範囲内にあるかを判定するには、セル範囲の交差範囲を取得するIntersectメソッドを使用します。選択セルに実行するマクロならSelection、イベントマクロならTargetを引数に渡してください。

重なった図形を最前面のもの以外削除する

同じ図形が同じ場所に大量に溜まったファイルを整理する際に、最前面の図形以外を削除するコードを紹介します。タイプや位置などの複数要素の一致判定にはDictionaryを使用するのが便利です。

非表示のシートをコピー・移動する

非表示のシートをコピー・移動しようとするとエラーが発生します。これを非表示のまま解消することはできませんので、一旦再表示 → コピー/移動 → 非表示に戻すという手順を踏んで対応します。

Collectionで重複なしリストを作成する

Collectionで重複のないユニークリストを作成する方法を解説します。KeyにItemと同じものを入れてKeyを重複チェックに利用するか、Itemの存在チェック関数を自作して対応するかの2つの方法で対応します。

Accessのテーブルをワークシートに出力する

Accessのテーブルをシートに出力する方法を紹介します。ADODBのSQLによるSELECT文を使用しています。テーブル名と出力始点セルを渡せば動く関数にしましたので、本関数を中身を見ずにCallしてもOKです。

指定行より下を最終行まですべて削除する

指定行より下の行をすべて削除するコードを解説します。シートの最終行まで削除、データの最終行まで削除の2通りの処理を解説します。いずれもフィルター抽出中は正しく動かないことに注意してください。

Excelがスピルに対応したバージョンか調べる

Excelがスピル対応のバージョンか調べる方法を解説します。一発で調べる方法はありませんので、RangeオブジェクトにFormula2プロパティが存在するかで判定します。

オブジェクトに特定のプロパティが存在するか調べる

オブジェクトに特定のプロパティが存在するかを調べる方法を解説します。一発でこれを行うプロパティは存在しませんので、オブジェクト.プロパティがエラーになるかどうかを調べて判定します。