和風スパゲティのレシピ

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

Range・Cells

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メソッドを使用します。

Collectionをセルに出力/一括出力する

Collectionの中身をセルに出力する方法を解説します。For Each文を使って各要素を出力する方法と、一旦二次元配列に変換してから一括出力する方法があります。後者を汎用関数化しておくと便利です。

行高・列幅を設定する - RowHeight/ColumnWidth

セルの行高を設定するにはRangeオブジェクトのRowHeightプロパティ、列幅にはRangeオブジェクトのColumnWidthプロパティを使用します。セルの値に合わせて自動調整を行う場合はAutoFitメソッドを使用します。

行・列の表示/非表示を切り替える - Hidden

行・列の表示/非表示を切り替えるにはHiddenプロパティを使用します。Trueが非表示、Falseが再表示です。行/列全体に実行する必要があるため、Rows/Columns、EntireRow/Columnから実行してください。

複数のセル範囲をひとつのRangeにする - Union

複数のセル範囲をひとつのRangeに統合するにはUnionメソッドを使用します。Ctrlキーを使ったセルの複数選択に似ていますが、ちょうど矩形になる場合はセル範囲も1つにまとめてくれる便利な特長があります。

NumberFormatLocalとNumberFormatの違い

NumberFormatLocalとNumberFormatの違いを解説します。両者とも「セルの表示形式」を設定するプロパティですが、G/標準、\、[赤]など日本語で表された表示形式を設定可能な点が違います。

セルの表示形式を設定する-NumberFormatLocal

桁区切りカンマの「#,##0」などセルの表示形式を設定するにはRangeオブジェクトのNumberFormatLocalプロパティを使用します。セル.NumberFormatLocal=セル.NumberFormatLocalでコピーも可能です。

1行おきに背景色を設定して縞模様にする

テーブル形式の表データに縞模様を付けるコードを紹介します。表の範囲を取得できる場合は表エリア.Rows、列のエリアを指定する場合はIntersectを利用して行ごとにRangeを取得し、偶数/奇数で判定して着色します。

結合セルの値を取得する - MargeArea/Value

結合セルの値を取得する方法を解説します。結合エリアから先頭セルの値を取得したい場合はCells(1).Valueを、結合内部セルから結合セルの値を取得したい場合はMergeArea.Cells(1).Valueをそれぞれ使用します。

セルが結合されているか判定する - MergeCells

セルが結合されているか調べるにはMergeCellsプロパティで判定します。しかしMergeCellsは結合セルならどこでもTrueになってしまうため、結合の先頭セルや結合セル全体化を判定するにはMergeAreaを組み合わせます。

セルを結合・解除する - Merge/UnMerge

セルを結合・解除するには、RangeオブジェクトのMerge/UnMergeメソッドを使用します。その他、結合セルかの判定にはMergeCells、結合セル範囲の取得にはMergeAreaをそれぞれ使用します。

Nothingを受け取るUnionメソッドを作る

UnionメソッドはNothingを受け取らないため、If rng Is Nothing Thenの分岐を書かないと初回実行時に必ずエラーになります。これをいちいち書かなくて済むよう、Nothingを受け取るUnionメソッドを作りましょう。

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

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

Unionによる処理速度向上効果について

Unionの速度向上効果を検証します。Union自体が割と遅いため、Unionより速い書式設定には逆効果で、Unionより遅い列の削除には効果があります。Unionはセルの統合より行の統合が得意と威勢質もあります。

ワークシートをスクロールする - ScrollRow/Column

ワークシートをスクロールする方法を解説します。行列番号指定でスクロールしたい場合はScrollRow/Columnプロパティ、現在位置を基準にスクロールしたい場合は、Large/SmallScrollメソッドを使用します。

Rowsプロパティで複数行を指定する

Rowsプロパティで複数行を指定する方法を解説します。Rows("2:10")の形で指定が可能ですが、文字列ではなく数値で指定する場合はRange、Resize、EntireRow、Unionなどのプロパティを利用します。

複数領域を持つRangeのプロパティ挙動について

複数のセル領域を格納したRangeオブジェクトの各プロパティがどんな挙動かを検証します。Valueのように第2エリア以降を無視して第1エリアだけを見るプロパティと、全エリアを見るプロパティの2種類があります。

複数領域をセル範囲ごとに取得する - Areas

「A1,B2:C2,D4:E6」のような複数領域をもつRangeオブジェクトを各セル範囲ごとに取得するにはAreasプロパティを使用します。For Each 各セル範囲 In 親Range.Areasというコードでエリアごとに個々に取得できます。

複数のセル範囲が選択されているか判定する

選択セル(Selection)が複数のセル範囲を含むか判定するには、RangeオブジェクトのAreasプロパティを使用し、Countが1であるかどうかで判定します。Areas(1)とすれば、第1セル範囲だけを取得できます。

セル内文字列を文字ごとに操作する - Characters

セル内の文字列を文字ごとに操作する、RangeオブジェクトのCharactersプロパティを解説します。書式を設定するFont、テキストを取得、置換するText、削除・挿入を行うDelete/Insetメソッドなどが使用できます。

セル内の文字列を一部だけ着色する - Characters

セル内の文字列を一部だけ着色(書式変更)する方法を解説します。RangeオブジェクトのCharactersプロパティ、Fontプロパティを使用します。Bold、Name、Sizeで太字、サイズ、フォント種類も設定できます。

セル内の特定文字列だけを着色する - Characters

セル内の特定の文字列を着色する方法を解説します。Instr関数で文字列の位置を特定し、Charactersプロパティを用いて特定文字列だけを書式設定します。サイズ/太字/フォント/背景色なども同じように設定可能です。

特定の文字列を含むセルを検索する - Instr関数

ある文字列を含むセルを検索する方法を解説します。For文またはFor Each文でセルをループし、Instr関数で特定の文字列を含んでいるか判定します。より複雑な判定を行う場合はLike演算子を使用してください。