Range・Cells
セルをクリアする際に使用する、ClearメソッドとClearContentsメソッドの違いを解説します。Clearは「すべてクリア」を実行し、ClearContentsは「数式と値のクリア」を実行します。
セルをクリアするには、値のみをクリアするにはClearContentsメソッド、書式など含めてすべてクリアするにはClearメソッドがあります。どちらも結合セルの内部には実行できないためご注意ください。
セル範囲をDictionaryに格納する方法を解説します。一括で入力する方法はないため、ループ文を使って愚直に代入していきます。テーブル形式の場合はDictionaryを列分用意するか、Itemを配列にして対応します。
セルの値が変更された際にマクロを実行するにはWorksheet_Changeプロシージャを使用します。引数TargetにダブルクリックされたセルがSetされるため、.Addressや.Row/.Columnで分岐を設定します。
セルをダブルクリックした際にマクロを実行するにはBeforeDoubleClickプロシージャを使用します。引数TargetにダブルクリックされたセルがSetされるため、.Addressや.Row/.Columnで分岐を設定します。
選択セルの変更時にマクロを自動実行するには、Worksheet_SelectionChangeを使用します。全シートのコードを一ヶ所に書きたい場合は、Workbook_SheetSelectionChangeを使用することも可能です。
Application.GoToメソッドと、RangeオブジェクトのSelectメソッドの違いを解説します。どちらも選択セルを変更する機能ですが、GoToの方が別シートのセルを選択できるなど高機能で、しかし不安定という違いがあります。
Rangeオブジェクトのメソッドである、SelectメソッドとActivateメソッドの違いを解説します。どちらも選択セルを変更するメソッドですが、Activateメソッドは「選択範囲内のアクティブセルを変更する」機能を持ちます。
セルの検索を行う手段は様々で、Range.Find、WorksheetFunction.Match、セル範囲.Formula = "=MATCH"、Dictionary(連想配列)オブジェクトなどが挙げられます。これらの速度やコーディングコストを検証してみます。
CurrentRegionやUsedRangeから上部の不要部分を消して、データエリアだけにするときなど、セル範囲から不要な範囲をカットするには、セル範囲同士の交差範囲(重複エリア)を取得するIntersectメソッドを使用します。
行・列全体をRangeオブジェクトとして取得するにはRows/Columnsプロパティを使用します。セル範囲を含む行・列全体を取得したい場合は、EntireRow/EntireColumnプロパティを使用する方法もあります。
表形式のデータを加工する際、指定列のデータ部分だけを選択したいことが良くあります。途中に空セルがあるなどでCtrl+Shift+↓が使えない時に用に、この範囲を自動取得してくれるマクロを作りましたのでご活用ください。
特定の列のデータ部分を取得する方法を解説します。Range(Cells, Cells)、第1セル.Resize(データ数)、Intersect(データ全体, Columns(指定列))、データ全体.Columns(指定列)の4種のコードを使い分けて使用します。
表エリア取得に非常に便利なCurrentRegionですが、上部余白を誤取得してしまう弱点があります。この弱点を解消する改良型CurrentRegionを自作ましたので、よろしければ皆さんもご活用ください。
Worksheets("○○").Cells(行, 列)でおなじみのCellsプロパティですが、実はセル範囲.Cells(行, 列)で実行することも可能です。さらにセル範囲.Cells(i)という引数ひとつでの実行も可能ですので、この仕様を深掘りしていきましょう。
セル範囲の最後のセルを取得には、セル範囲.Cells(セル範囲.Cells.Count)と記述します。セルの数番目のセル=最終セルという理屈で取得できます。このコードは複数エリアに対してはうごきませんのでご注意ください。
セル範囲の先頭のセルを取得する方法を解説します。セル範囲.Cells(1)というコードで簡単に取得できます。他にCells(1, 1)やItem(1)などで取得することもできますが、Cells(1)が最も安定するコードです。
Excelには表のエリアを推定して選択する機能があり、Ctrl+Aで実行することができます。この機能をVBAから呼び出してRangeオブジェクトを取得するには、CurrentRegion(カレントリージョン)プロパティを使用します。
オートフィルターのデータ部分を取得するにはAutoFilter.Rangeを使用します。ただしこれは見出しもついてくるため、Offset+Resizeを利用して見出しを除外します。各列を取得する場合はそこからIntersectを使用します。
データを並び替える際Excelは「ふりがな」順を優先するため、稀に同じデータでも違う場所に並び変わってしまうことがあります。その対策として、選択範囲のフリガナを一括で削除するマクロを紹介します。
セル内テキストを置換するRange.Replaceメソッドと、Replace関数は、単体ではReplace関数の方が高速でした。しかしそれ以上にセルのアクセス回数の影響が大きく、配列を使用して初めて高速化します。
セル範囲が行全体/列全体か判定する方法を紹介します。セル範囲を含む行全体/列全体を取得するEntireプロパティを使い、そのAddressが元のセル範囲のAddressと一致するかを判定します。
セルの背景色を設定するにはRangeオブジェクトのInteriorプロパティを使用します。通常はRGB関数で指定するのが万能ですが、セルの背景色を別のセルに反映させるにはColorプロパティの値を代入させるだけでOKです。
特定の条件を満たす行を削除する際、Unionによる高速化を用いても遅い場合用に、削除対象かを判定する列を作りその列でソート、それでひとつにまとまった削除対象データを一発で削除する方法を紹介します。
第7回 和風スパゲティ勉強会「Rangeオブジェクト再入門」の配布資料と配信アーカイブを共有します。Range・Cellsの基本コードを1からおさらいしていきましたので、基礎固めにご活用ください。
スピル数式をVBAから入力するにはRangeオブジェクトのFormula2プロパティを使用します。従来のFormulaプロパティを使用した場合は互換性のために共通部分演算子「@」が挿入されスピルしませんのでご注意ください。
セルに罫線を引くにはRangeオブジェクトのBordersプロパティを使用します。Bordersの引数を省略すれば格子罫線全体を一括設定でき、LineStyleやWeightは省略できることも多いため、実際はほぼ1行のコードで実行できます。
セルや行・列を削除するにはdeleteメソッドを実行します。第1引数で「削除後のスライド方向」を指定できます。行列全体を指定できる引数はありませんので、行列全体を削除する場合はEntireプロパティを使用します。
セルや行・列を挿入するにはInsertメソッドを実行します。第1引数で「挿入後のスライド方向」を、第2引数で「書式のコピー元」をそれぞれ指定できます。行列全体を指定する場合はEntireプロパティを使用します。
セル範囲を行数・列数指定で取得するにはResizeプロパティを使用します。Range(Cells,Cells)形式より簡単に書ける場合も多いです。表のデータエリアを取得したり、表エリアから見出しを取り除くコードに活用できます。