Script事業案内エクセル以外トップマクロVBAマクロVBA技術解説Rangeオブジェクトの論理演算(差集合と排他的論理和)最終更新日:2020-01-10Rangeオブジェクトの論理演算(差集合と排他的論理和)複数のRangeオブジェクトの重なっている範囲や、結合した範囲等々、Rangeオブジェクトを集合として、その集合演算の結果のRangeオブジェクトが必要になってくる場合がVBAでは良くでてきます。該当するものはサポートされていません。A範囲のうち、B範囲に含まれない範囲に対して、何らかの処理をしたいというような場合です。頻繁に必要になるものではないのですし、通常は何らかの別手段で実現しているものになります。VBAで自作してみました。これらをベン図で確認しておきましょう。Eachでセルを一つずつ判定しつつUnionしていけばVBAは完成します。FunctionこのVBAなら割と簡単に作成できるでしょう。和集合の一つずつのセルについて、積集合に含まれていないものを集めているだけです。多くの場合はこれで用が足りてしまうかもしれません。このようなVBAの問題点は、引数に列全体を指定した場合です。現在のExcelは100万行あります。それでも1列くらいなら上記VBAでもちょっと待てば処理が終了します。時間がかかりすぎてしまって、実用に耐えられないことが分かるはずです。そこで、これをセル1つずつ判定せずにAreas単位(つまり矩形単位)で処理するVBAを作ろうという事です。このとき、最も面倒、かつ、これさえできれば他は何とかなるというのが補集合です。Not(B)このように定義できます。AndはIntersectがあるので、Notさえあれば差集合は完成します。差集合が出来れば排他的論理和も簡単に作成できます。A)さらに、このような論理式でも表せます。B)RangeオブジェクトにはAreasがある注意しなければならないことがあります。Rangeオブジェクトは矩形の1領域とは限りません。RangeオブジェクトにはAreasが存在し、複数の領域(セル範囲)が含まれています。Range("A2:D3,B4:E4")これは1つのRangeオブジェクトの中に、Range("A2:D3")とRange("B4:E4")これが一緒になって入っています。Range("B4:E4"))(この=は代入ではなく等しいという意味です。)この場合、Rangeオブジェクトには2つのAreasがある状態という事です。・複数のAreasを含んだRangeに対するプロシージャーこの2種類があることに注意してください。和集合:UnionメソッドRangeオブジェクトの和集合はApplicationのUnionメソッドを使用します。Unionメソッドの詳細については以下をご覧ください。第103回.UnionメソッドとAreasプロパティ|VBAi(4myUnionメソッドはApplicationのメソッドです。複数のセル範囲を集め、1つのRangeオブジェクとして参照することができます。Unionメソッドは複数のRangeオブジェクトを連結して1つのRangeオブジェクトにします。Unionメソッドでは、引数のRangeオブジェクトの1つでもNothingがあるとエラーとなります。したがって、引数のNothing判定が必要になりますが、これはVBA記述する上でとても面倒です。そこで、Nothing判定を組み込んだ関数Functionを作成しておきます。Function積集合:IntersectメソッドRangeオブジェクトの積集合はApplicationのIntersectメソッドを使用します。Intersectメソッドの詳細については以下をご覧ください。第102回.Intersectメソッド|VBA入門IntersectメソッドはApplicationのメソッドで、複数のセル範囲の、重なっている部分のセル範囲を取得することが出来ます。あるセルが、特定セル範囲内にあるかどうかを判定したり、セル範囲の中から、特定の列や行の部分だけを取り出したりする場合に使います。Intersectメソッドでは、引数のRangeオブジェクトの1つでもNothingがあるとエラーとなります。したがって、引数のNothing判定が必要になりますが、これはVBA記述する上でとても面倒です。そこで、Nothing判定を組み込んだ関数Functionを作成しておきます。FunctionRangeオブジェクトの論理演算のVBAを作成する上で、ここが一番面倒な所になるでしょう。考え方としては、矩形の補集合なので、四角形の外側を求めれば良いという事です。Range("B3:C5")の補集合のRangeは、この1234の4つの領域の和集合になります。上記VBAでは、この4つの領域を算出しUnionして結果を求めています。Function単一Areaの補集合があれば、これらの積集合を求めれば複数領域の補集合は作成できます。Eachにしてしまうと、セル1つずつの処理になってしまいます。差集合なので、全く同範囲のRangeを2つ指定した場合はNothingが戻されます。Function先にベン図で解説した2通りの求め方を記載し、片方はコメントアウトしています。どちらを使っても良いでしょう。矩形に区切るときの区切り方の違いになりますので、全体の指し示すセル範囲は同じになります。排他的論理和なので、全く同範囲のRangeを2つ指定した場合はNothingが戻されます。結果検証のテスト用のVBAを提示しておきます。Sub一応説明しておきますが、Rangeオブジェクトは別々のシートのRangeは入れられません。UnionもIntersectも、別々のシートのRangeオブジェクトには対応していません。したがって、今回作成した関数Functionも別々のシートのRangeオブジェクトには対応していません。Range範囲をいろいろ変更してテストしてみてください。このVBAは、今回の記事用に作成したものです。したがって、使用実績が少ないためテストも不十分です。不具合等あれば、ご連絡いただけるとありがたいです。補集合の求め方などで、より良い方法があるよと言った情報は大歓迎です。Next)|VBA入門7.マクロって何?VBAって何?|VBA入門8.セルに文字を入れるとは(Range,Value)|VBA入門9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説10.ひらがな⇔カタカナの変換|エクセル基本操作トップマクロVBAマクロVBA技術解説Rangeオブジェクトの論理演算(差集合と排他的論理和)このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。GASスプレッドシート入門スプレッドシート応用GAS入門GAS応用トップマクロVBAマクロVBA技術解説Rangeオブジェクトの論理演算このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。