和風スパゲティのレシピ

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

Range・Cells

Range.ClearとClearContentsの違い

セルをクリアする際に使用する、ClearメソッドとClearContentsメソッドの違いを解説します。Clearは「すべてクリア」を実行し、ClearContentsは「数式と値のクリア」を実行します。

セルをクリアする - ClearContents/Clear

セルをクリアするには、値のみをクリアするにはClearContentsメソッド、書式など含めてすべてクリアするにはClearメソッドがあります。どちらも結合セルの内部には実行できないためご注意ください。

セル範囲をDictionaryに格納する

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

セルの値が変更された際にマクロを自動実行する - Change

セルの値が変更された際にマクロを実行するにはWorksheet_Changeプロシージャを使用します。引数TargetにダブルクリックされたセルがSetされるため、.Addressや.Row/.Columnで分岐を設定します。

セルをダブルクリックした時にマクロを実行する - BeforeDoubleClick

セルをダブルクリックした際にマクロを実行するにはBeforeDoubleClickプロシージャを使用します。引数TargetにダブルクリックされたセルがSetされるため、.Addressや.Row/.Columnで分岐を設定します。

選択セルの変更時にマクロを自動実行する - SelectionChange

選択セルの変更時にマクロを自動実行するには、Worksheet_SelectionChangeを使用します。全シートのコードを一ヶ所に書きたい場合は、Workbook_SheetSelectionChangeを使用することも可能です。

Application.GoToとRange.Selectの違い

Application.GoToメソッドと、RangeオブジェクトのSelectメソッドの違いを解説します。どちらも選択セルを変更する機能ですが、GoToの方が別シートのセルを選択できるなど高機能で、しかし不安定という違いがあります。

Range.Selectと.Activateの違い

Rangeオブジェクトのメソッドである、SelectメソッドとActivateメソッドの違いを解説します。どちらも選択セルを変更するメソッドですが、Activateメソッドは「選択範囲内のアクティブセルを変更する」機能を持ちます。

セル検索の速度比較 - Find/Match/Dictionary

セルの検索を行う手段は様々で、Range.Find、WorksheetFunction.Match、セル範囲.Formula = "=MATCH"、Dictionary(連想配列)オブジェクトなどが挙げられます。これらの速度やコーディングコストを検証してみます。

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

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

行・列全体を取得する - Rows/Columns/Entire

行・列全体をRangeオブジェクトとして取得するにはRows/Columnsプロパティを使用します。セル範囲を含む行・列全体を取得したい場合は、EntireRow/EntireColumnプロパティを使用する方法もあります。

指定列のデータ部分だけを選択するマクロ

表形式のデータを加工する際、指定列のデータ部分だけを選択したいことが良くあります。途中に空セルがあるなどでCtrl+Shift+↓が使えない時に用に、この範囲を自動取得してくれるマクロを作りましたのでご活用ください。

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

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

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

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

セル範囲.Cells(R, C)の仕様と使い方

Worksheets("○○").Cells(行, 列)でおなじみのCellsプロパティですが、実はセル範囲.Cells(行, 列)で実行することも可能です。さらにセル範囲.Cells(i)という引数ひとつでの実行も可能ですので、この仕様を深掘りしていきましょう。

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

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

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

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

表の範囲を推定して取得する - CurrentRegion

Excelには表のエリアを推定して選択する機能があり、Ctrl+Aで実行することができます。この機能をVBAから呼び出してRangeオブジェクトを取得するには、CurrentRegion(カレントリージョン)プロパティを使用します。

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

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

セルに設定されたふりがなを一括削除するマクロ

データを並び替える際Excelは「ふりがな」順を優先するため、稀に同じデータでも違う場所に並び変わってしまうことがあります。その対策として、選択範囲のフリガナを一括で削除するマクロを紹介します。

ReplaceメソッドとReplace関数の速度比較

セル内テキストを置換するRange.Replaceメソッドと、Replace関数は、単体ではReplace関数の方が高速でした。しかしそれ以上にセルのアクセス回数の影響が大きく、配列を使用して初めて高速化します。

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

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

セルの背景色を設定する - Interior.Color

セルの背景色を設定するにはRangeオブジェクトのInteriorプロパティを使用します。通常はRGB関数で指定するのが万能ですが、セルの背景色を別のセルに反映させるにはColorプロパティの値を代入させるだけでOKです。

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

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

「Rangeオブジェクト再入門」配布資料&配信アーカイブ

第7回 和風スパゲティ勉強会「Rangeオブジェクト再入門」の配布資料と配信アーカイブを共有します。Range・Cellsの基本コードを1からおさらいしていきましたので、基礎固めにご活用ください。

スピル数式をVBAから入力する - Formula2

スピル数式をVBAから入力するにはRangeオブジェクトのFormula2プロパティを使用します。従来のFormulaプロパティを使用した場合は互換性のために共通部分演算子「@」が挿入されスピルしませんのでご注意ください。

セルに罫線を引く - Range.Borders

セルに罫線を引くにはRangeオブジェクトのBordersプロパティを使用します。Bordersの引数を省略すれば格子罫線全体を一括設定でき、LineStyleやWeightは省略できることも多いため、実際はほぼ1行のコードで実行できます。

セル・セル範囲・行・列を削除する - Delete

セルや行・列を削除するにはdeleteメソッドを実行します。第1引数で「削除後のスライド方向」を指定できます。行列全体を指定できる引数はありませんので、行列全体を削除する場合はEntireプロパティを使用します。

セル・セル範囲・行・列を挿入する - Insert

セルや行・列を挿入するにはInsertメソッドを実行します。第1引数で「挿入後のスライド方向」を、第2引数で「書式のコピー元」をそれぞれ指定できます。行列全体を指定する場合はEntireプロパティを使用します。

セル範囲を行数・列数指定で取得する - Resize

セル範囲を行数・列数指定で取得するにはResizeプロパティを使用します。Range(Cells,Cells)形式より簡単に書ける場合も多いです。表のデータエリアを取得したり、表エリアから見出しを取り除くコードに活用できます。