【Excel】あるセル範囲から指定範囲を除外したセル範囲を取得したい
エクセルマクロでコピペツールを作ったのですが、
利用者にコピー対象のセル範囲を視覚的に分かるようにしてほしいという機能要望が発端です。
コピー元範囲には何も加工しないで、大きめに指定した範囲からコピー対象範囲を除外して、背景色を設定することにしました。
参考サイトその1
stackoverflow.com
1案ではセル範囲からセルを列挙して一致判定をするので、処理量によってはとても重い・・・
参考サイトその2
detail.chiebukuro.yahoo.co.jp
2案ではRange.SpecialCellsメソッドを利用して非常に高速なんですが、
入力規則なりコメントなり対象範囲を加工することになるので利用者側のことを考えるとイマイチ・・・
妥協策として、1案を改良してセル単位で列挙する前に、列単位で列挙することにしました。
' summary 主範囲から指定範囲が除外されたRangeオブジェクトを取得します Function GetExcludedRange(mainRange As Range, rangeToExclude As Range) As Range Dim returnRange As Range Dim workColumn As Range Dim workRange As Range ' 主範囲と指定範囲が同じシートの場合のみ、処理継続する If mainRange.Worksheet Is rangeToExclude.Worksheet Then ' 主範囲を列単位に分割して、対象範囲と一致判定する For Each workColumn In mainRange.Columns If Intersect(workColumn, rangeToExclude) Is Nothing Then ' 不一致の場合は、除外済み範囲に追加する If returnRange Is Nothing Then Set returnRange = workColumn Else Set returnRange = Union(returnRange, workColumn) End If Else ' 一致の場合は、さらにセル単位に分割して、対象範囲と一致判定する For Each workRange In workColumn.Rows If Intersect(workRange, rangeToExclude) Is Nothing Then ' 不一致の場合は、除外済み範囲に追加する If returnRange Is Nothing Then Set returnRange = workRange Else Set returnRange = Union(returnRange, workRange) End If End If Next End If Next End If Set GetExcludedRange = returnRange End Function
使用例
Dim mainRange As Range Dim rangeToExclude As Range Dim excludedRange As Range Set mainRange = Range("A1:Z100") Set rangeToExclude = Range("C10:F20") Set excludedRange = GetExcludedRange(mainRange, rangeToExclude) excludedRange.Interior.Color = vbYellow