サンプルコード
指定の座標(ポイント)にあるセルを取得する方法を解説します。Top座標・Left座標から直接そのセルを取得する機能はありませんので、RangeオブジェクトのTop・Leftプロパティを取得して検索します。
セルの値ごとにセルを色分けするには条件付き書式がメジャーですが、設定の面倒さやコピー時の挙動・増殖問題、再計算の重さに悩まされることもあります。これをマクロで実装する方法を解説します。
図形(Shape)を縦横比固定で拡大縮小する方法を解説します。ShapeオブジェクトのLockAspectRatioプロパティにmsoTrueを指定してから、Width・Heightプロパティでサイズを変更します。
セル範囲に合わせて図形(Shape)を拡大・縮小する方法を解説します。セル範囲と同じサイズにする場合は、RangeオブジェクトのTop/Left/Width/HeightをShapeオブジェクトの同プロパティに代入します。
図形(Shape)を指定セル範囲の中央へ移動する方法を解説します。
特定のセルが条件付き書式に合致しているか判定する方法を紹介します。残念ながら一発で行う方法はないのですが、DisplayFormatで判定するのが一番手軽です。
すべての図形を取得する場合、ただShapesを取るだけと表のグループだけを取ってしまうため、GroupItemsを使って中のShapeを取得する必要があります。さらに下層グループがある場合は、再帰呼出が必要になります。
図形がグループ化されているか判定するには、図形自体がグループであるかの判定にはShape.TypeがmsoGroupかどうか、ある図形がグループ内図形かの判定にはParentGroupプロパティがエラーかどうかを調べます。
セル範囲をDictionaryに格納する方法を解説します。一括で入力する方法はないため、ループ文を使って愚直に代入していきます。テーブル形式の場合はDictionaryを列分用意するか、Itemを配列にして対応します。
年度年齢(年度末時点での年齢)を取得するには、その年度の最終日、つまり3/31時点の年齢を計算します。年齢の計算にはFormula、Evaluate、自作関数の3つの方法がありますので状況に応じて使い分けて下さい。
すべてのシートの保護を一括で設定/解除するには、ForEachでループしたすべてのシートでProtect/Unprotectメソッドを実行します。Protectについては許可する操作をひとつずつ選ぶ必要があるためご注意ください。
ユーザー定義関数(Function)が呼ばれたセルを取得するには、Application.Callerプロパティを使用します。入力セルによって処理を分岐させたい場合はこのプロパティを使用してください。
押されたボタンごとに処理を分岐するにはApplication.Callerプロパティを使用します。Application.Callerで取得したオブジェクト名からShapeオブジェクトを取得すれば、表示テキストや位置による分岐も可能です。
複数のファイルを一括で選択できるダイアログボックスを表示するには、GetOpenFilenameメソッドの引数MultiSelectにTrueを渡すか、FileDialogオブジェクトのプロパティAllowMultiSelectにTrueを代入して実行します。
ブックを読み取り専用で開くにはWorkbooks.Openの引数ReadOnlyをTrueに指定します。ただし既に開いているファイルに対して実行しても、エラーにはならず、かつ読取専用にはなってくれませんのでご注意ください。
ちょっと仕様がイマイチのCopyメソッドに、返り値がWorksheet、Before/AfterにWorkbookを渡せる(先頭/末尾にコピー)、非表示シートを渡せる、コピー後に保護を解除する機能を持たせた関数を作ってみましょう。
CurrentRegionやUsedRangeから上部の不要部分を消して、データエリアだけにするときなど、セル範囲から不要な範囲をカットするには、セル範囲同士の交差範囲(重複エリア)を取得するIntersectメソッドを使用します。
フォルダ内の複数ファイルへ同じ処理を行う場合、①まずは対象ファイルのリストを取得、②そのリスト内の全ファイルへ処理のように処理を段階化するのが便利です。この①を簡単に行うための汎用関数を紹介します。
テーブルとフィルターが混在したシートにおいてすべてのフィルターをクリアするには、すべてのAUtoFilterオブジェクトからShowAllDataメソッドを実行します。この処理は選択セルの影響を受けるためご注意ください。
日付や年月から月末を求める方法を解説します。日付から月末を求めるにはEOMONTH関数、年月の整数値から月末を求めるにはDateSerial関数のDayに0を渡す方法をそれぞれ用いるのが簡単です。
テーブルのフィルターをクリアする場合は、ListObject.AutoFilterのShowAllDataメソッドを実行します。これはフィルターの抽出状態に関わらず実行できますので、抽出がかかっていなくてもエラーにはなりません。
ユーザー定義関数をスピルさせるには、配列(Array)を返り値として返すだけでOKです。一次元配列であれば横方向にスピルし、n行1列の二次元配列であれば縦方向にスピルさせることができます。
Zipファイルをマクロで解凍する方法を解説します。WScript.ShellオブジェクトのRunメソッドを使用して、ZIPファイルを解凍するPowerShellをVBAから呼ぶのが一番簡単です。
フォルダを空にするには、ワイルドカード「*」を使った一括削除をファイル・フォルダ両方へ実行します。Killは可能ですがRmDirではできないため、FileSystemObjectのDeleteFile/DeleteFolderメソッドを利用します。
フォルダ内のすべてのファイルを削除するには、Killステートメントのワイルドカード*を用いた一括削除を用いるのが簡単です。FileSystemObjectのDeleteFileメソッドでも全く同じ処理を実行可能です。
RGB値とHTMLカラーコード(#FFFFFF形式)を相互に変換する方法を解説します。RGB⇒HTMLにはHex関数、HTML⇒RGBには&H接頭辞を使います。RGB値とHTMLコードはそのままではRとBが逆順であることにご注意ください。
特定の列のデータ部分を取得する方法を解説します。Range(Cells, Cells)、第1セル.Resize(データ数)、Intersect(データ全体, Columns(指定列))、データ全体.Columns(指定列)の4種のコードを使い分けて使用します。
表エリア取得に非常に便利なCurrentRegionですが、上部余白を誤取得してしまう弱点があります。この弱点を解消する改良型CurrentRegionを自作ましたので、よろしければ皆さんもご活用ください。
セル範囲の最後のセルを取得には、セル範囲.Cells(セル範囲.Cells.Count)と記述します。セルの数番目のセル=最終セルという理屈で取得できます。このコードは複数エリアに対してはうごきませんのでご注意ください。
セル範囲の先頭のセルを取得する方法を解説します。セル範囲.Cells(1)というコードで簡単に取得できます。他にCells(1, 1)やItem(1)などで取得することもできますが、Cells(1)が最も安定するコードです。