【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