こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。
皆さんは、VBAで「Intersectメソッド」を使ったことがありますか? セルの操作をするときに、このメソッドの使い方を覚えておくと便利です!
そこで今回は、「Intersectメソッドとは?」といった基礎的なことから、
- Intersectメソッドの便利な使い方
- Intersectメソッドを使ったサンプルコード
- 重複するセルがなかった場合の対処方法
といった応用的な方法まで、徹底的に解説します!
Intersectメソッドとは
まず、Intersectメソッドについて簡単に解説します。
Intersectメソッドとは、2つのセル範囲の中から重なったセル範囲を取得するためのメソッドです。
次のようなイメージですね。
2つのデータで重なった範囲を簡単に取得することができるので、使いこなすととても便利なメソッドです。
Intersectメソッドの便利な使い方
ただ、次のように思った方もいるのではないでしょうか。
具体的なイメージがつかめない方も多いと思います。
Intersectメソッドは「使いたいセルの範囲を絞るとき」にとても便利です! 言葉だけでは伝わりにくいと思うので、具体的な例をご紹介しますね。
VBAでは、マウスで選択したセル範囲を取得するための処理「Workbook_SheetSelectionChange」があります。
「Workbook_SheetSelectionChange」内に処理を書くことで、「セルの選択範囲を変更したときに必ず起こる処理」を作ることができます。
これを応用すると、「データ一覧の中からドラッグして選択した範囲のデータだけを、別シートにコピーする」といった処理を作ることができます。
ただ、この処理を作るとき、「コピーしたいデータ以外のセル」はコピーしたくないですよね? たとえば、コピー元のヘッダ行「No、氏名、得意言語」などのデータはコピーしたくないはずです。
そんな時に便利なのが、Intersectメソッドです。
Intersect (コピーしたいデータ範囲 , Target関数で取得した選択範囲)とすることで、コピーしたい範囲のデータのみ取得することができます。
このように、Intersectメソッドを応用すれば「使いたいセルの範囲を絞るとき」にとても便利です。
Intersectメソッドのサンプル
次に、サンプルコードをもとに、具体的な使い方について解説します。
さきほど解説した、Target関数 + Intersectメソッドを使って選択したセル範囲をコピーするサンプルを用意しました。
最初に前提ですが、このサンプルはThisWorkbookオブジェクト内に処理を書いています。
ThisWorkbookオブジェクトは、ブック全体に対しての処理を書くことができるオブジェクトです。
セルの選択範囲を変更する処理のように、ブック全体に影響がある処理はThisWorkbookオブジェクトにイベントプロシージャとして設定できるので、覚えておくのがおすすめです!
サンプルコード:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) '貼り付け元の選択したセル範囲を取得 Dim selectArea As Variant Set selectArea = Intersect(Range("A3:C7"), Target) 'A3:C7がデータ範囲 'E列の「最終行 + 1」でコピー開始位置の行数を取得 Dim maxRow As Long maxRow = Cells(Rows.Count, 5).End(xlUp).Row + 1 '5列目の最終行にデータコピー selectArea.Copy Cells(maxRow, 5) End Sub
セル選択前のデータ:
セル選択前のデータ:
「Workbook_SheetSelectionChange」ではセルを選択した範囲を変数名Targetで使えるので、Intersectメソッド内の引数にTarget・データ範囲を指定して選択したセル範囲を取得しています。
その後、データ貼り付け用にデータの最終行を取得し、Copyメソッドを使ってデータをコピーしています。
このように、選択したデータを使う処理を簡単に作ることができます。
ちなみに、最終行の取得方法・Copyメソッドの使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!
重複するセルがなかった時の対処方法
ここまでIntersectメソッドの使い方を解説してきましたが、1つだけ注意点があります。
重複するセルがない場合にセルのアドレスではなく、「Nothing」が結果として返ってきてしまうことです。
そのため、セルのアドレスが返ってくることを前提に処理を書いていた場合エラーになってしまうので、事前にチェック処理を入れておくのがおすすめです!
先ほどのサンプルに、チェック処理を追加したサンプルコードを用意しました。
サンプルコード:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) '貼り付け元の選択したセル範囲を取得 Dim selectArea As Variant Set selectArea = Intersect(Range("A3:C7"), Target) 'A3:C7がデータ範囲 'コピー元以外を選択していた場合は、処理終了 If selectArea Is Nothing Then Exit Sub End If 'E列の「最終行 + 1」でコピー開始位置の行数を取得 Dim maxRow As Long maxRow = Cells(Rows.Count, 5).End(xlUp).Row + 1 '5列目の最終行にデータコピー selectArea.Copy Cells(maxRow, 5) End Sub
「If selectArea Is Nothing Then」でNothingが返ってきた場合のみ、処理を終了する「Exit Sub」を実行しています。
こうしておくことで、Intersectメソッドで重なったセル範囲がなかったとしても、処理がエラーにならないようにしています。
Intersectメソッドを使う時は、合わせて覚えておくのがおすすめです!
まとめ
今回は、Intersectメソッドを使って重複したたセル範囲を取得する方法について解説しました。
「指定した枠内のデータのみ使う」といったケースで便利なので、使い方を覚えておくと便利です!
使い方も簡単なので、ぜひ使ってみてくださいね!