和風スパゲティのレシピ

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

サンプルコード

グループ内を含むすべての図形(Shape)を取得する

すべての図形を取得する場合、ただShapesを取るだけと表のグループだけを取ってしまうため、GroupItemsを使って中のShapeを取得する必要があります。さらに下層グループがある場合は、再帰呼出が必要になります。

図形がグループ化されているか判定する-ParentGroup

図形がグループ化されているか判定するには、図形自体がグループであるかの判定にはShape.TypeがmsoGroupかどうか、ある図形がグループ内図形かの判定にはParentGroupプロパティがエラーかどうかを調べます。

セル範囲をDictionaryに格納する

セル範囲をDictionaryに格納する方法を解説します。一括で入力する方法はないため、ループ文を使って愚直に代入していきます。テーブル形式の場合はDictionaryを列分用意するか、Itemを配列にして対応します。

年度年齢(年度末時点での年齢)を取得する

年度年齢(年度末時点での年齢)を取得するには、その年度の最終日、つまり3/31時点の年齢を計算します。年齢の計算にはFormula、Evaluate、自作関数の3つの方法がありますので状況に応じて使い分けて下さい。

すべてのシートの保護を一括で設定/解除する

すべてのシートの保護を一括で設定/解除するには、ForEachでループしたすべてのシートでProtect/Unprotectメソッドを実行します。Protectについては許可する操作をひとつずつ選ぶ必要があるためご注意ください。

ユーザー定義関数が呼ばれたセルを取得する - Caller

ユーザー定義関数(Function)が呼ばれたセルを取得するには、Application.Callerプロパティを使用します。入力セルによって処理を分岐させたい場合はこのプロパティを使用してください。

押されたボタンごとに処理を分岐する - Caller

押されたボタンごとに処理を分岐するにはApplication.Callerプロパティを使用します。Application.Callerで取得したオブジェクト名からShapeオブジェクトを取得すれば、表示テキストや位置による分岐も可能です。

ダイアログボックスでファイルを複数指定する

複数のファイルを一括で選択できるダイアログボックスを表示するには、GetOpenFilenameメソッドの引数MultiSelectにTrueを渡すか、FileDialogオブジェクトのプロパティAllowMultiSelectにTrueを代入して実行します。

ブックを読み取り専用で開く - 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による高速化を用いても遅い場合用に、削除対象かを判定する列を作りその列でソート、それでひとつにまとまった削除対象データを一発で削除する方法を紹介します。