和風スパゲティのレシピ

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

Range・Cells

行・列全体を取得する - 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)形式より簡単に書ける場合も多いです。表のデータエリアを取得したり、表エリアから見出しを取り除くコードに活用できます。

セルやセル範囲を行数・列数分移動する - Offset

Rangeオブジェクトを指定行数、列数分移動する際はOffsetプロパティを使用します。データ範囲から見出しを削除するなどによく使用します。セル結合があると正しく動きませんのでご注意ください。

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

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

10/29(水)21:00~ 第7回 和風スパゲティ勉強会「Rangeオブジェクト再入門」

和風スパゲティ勉強会 第7回のテーマは「Rangeオブジェクト再入門」ということで、今さら聞けないRange・Cellsの基本コードをおさらいしていきます。Excelのメインオブジェクトを綺麗に扱う方法を一緒に勉強しましょう。

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

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

条件を満たす列を削除する - Delete/Union

特定の条件を満たす列を削除する方法を解説します。For文でStep-1を利用して最終列から1行ずつ削除していく方法と、Unionメソッドで一つのRangeオブジェクトにしてから一括で削除する方法があります。

第1行の書式を最終行までコピーする - Rows

書式のコピーにはPasteSpecialが思い浮かびますが、行ごとコピーする場合はAutoFillメソッドが使用できます。クリップボードを介さず安全高速ですので、フィルハンドルのようなコピー処理にはこちらを使用しましょう。

セルの結合・解除をショートカットに登録する

セルの結合解除にはショートカットキーが設定されていません。これをショートカットキーに登録するためにセル結合機能をマクロで再現してみました。複数行実行時に自動で横方向結合する機能も付けましたのでご活用ください。

オートフィルをショートカットに登録する

セルの右下にカーソルを合わせたときに出る✚のコピー機能をオートフィル(フィルハンドル)と呼びます。これは便利なのですがショートカットがないため、マクロで再現してショートカットに登録してみましょう。

AutoFillとFillDownの違い

AutoFillとFillDownの違いを解説します。どちらも先頭のセルをセル範囲へコピーするメソッドですが、AutoFillはフィルハンドル、FillDownはCtrl+Dと対応しているためAutoFillの方がコピーの種類が豊富です。

セル範囲を先頭セルの値・式で埋める - FillDown

先頭セルをセル範囲全体へコピーするCtrl+DやCtrl+Rと同じ処理をVBAで実行するには、FillDown/FillUp/FillRight/FillLeftメソッドを使用します。連続データ、値/書式のみコピーをしたい場合はAutoFIllメソッドを使用します。