VBAでunionメソッドを使って面倒な手作業から解放されよう

unionっていう方法があると見かけたけど
いったいどんなことが出来るの?

rangeと何が違うのかわからない…

一気に広範囲のセルに色を付けたいけど
効率的な方法はあるのかな

こんにちは!社内のマクロ付き資料作成をVBAで作りまくり、みんなの作業をバリバリ効率化している8年目文系プログラマの佐藤です。

今回のテーマはunionメソッドについてです。
皆さんunionメソッドってどんなものかご存知ですか?

慣れない方のrangeと何が違うのかわからない、どんなことが出来るんだろう?という疑問をよく耳にします。unionについて詳しく知らなくてもrangeがあればマクロが組めるため、詳しく触れる機会が少ないかもしれませんね。

でも、unionにはrangeとは違う役割と、便利な機能があるんです。

今回は、そんな疑問を解決するunionメソッドの仕組み解説と、便利ですぐ使える使用例について紹介していきます。

unionについて理解できているとVBAで出来ることがもっと広がります。
この記事でunionについて学習し、今よりも効率的なマクロが作れるよう実践していきましょう!

それでは早速、unionメソッドの仕組みについて学習していきます。

目次

unionメソッドってどんなもの?

この章では、unionメソッドの仕組みについてなるべく分かりやすい言葉で説明していきます。ここで仕組みについてしっかり理解して、この後の実践に挑みましょう。

セルの範囲を選択して合体できる

unionという英単語には「結合」とか「融合」という意味があります。
VBAでも同じような意味の動きをしてくれますので、まずは「合体してくれるもの」なんだと覚えてしまいましょう。

では、unionは何を合体してくれるかというと、Rangeを合体してくれるものなんです。
ここで実際の動きを少し見てみて確認してみましょう!
みなさんも、新しいブックで次のサンプルを貼り付け、実行してみてください。

Sub union_test()

Union(Range("B2:D6"), Range("F10"), Range("B10:C13")).Interior.ColorIndex = 4

End Sub

この画像のように離れた位置の色が変わりましたか?

コントロールを押しながら範囲を指定して、セルの色を変えた時と同じ動作ですよね。
このように、unionを使うといろいろな位置にある「セルを合体」して一気に同じ操作が出来ます。

セルを一つずつ選択して色を塗るより、全然効率的ですよね。
他にも条件に合ったセルの文字色を一気に変えたいときにも使うことができますし、工夫次第で使える場面は本当にたくさんあります。

ですが、すでにVBAを書いている方にとっては、こんな疑問が湧いてくると思います。

これってRangeと出来ること同じじゃない?

範囲を指定する時はRangeを使うと知っている方にとっては、ここまでの説明でunionって要らないのでは?という気持ちになってしまうのも仕方ありません。

もちろん、Rangeと出来ることが同じ部分が多いですが、違う箇所がちょっとだけあります。ちょっとでもかなり重要なポイントなので、次の項目でばっちり説明していきます。

Rangeと似ているけどちょっとだけ違う

unionも範囲を指定できる、Rangeも範囲を指定できる…となると違いがないように思えますよね。ですが、少しだけ違うポイントがあるんです。

先程のサンプルコードはRangeを使って書くこともできます。ですが、色を変える範囲がもっともっと多いときはどうなるでしょう?
次のサンプルコードを新しいブックに張り付けて実行してみてください。

Sub range_test()

Range("N2:P5,Q9:Q11,O13:P17,I19:K21,H18,G17,F21,D23,C21,B20,A21,A23,B23,A14,G9,F9,F13,G12,E7,A1,B2,C3,C4,A6:C10,E12,G6,F3,E2,D5,J5,J11,I14,G15,H10,I4,H2,M4,M9,L9,K3,K1,L4,L6,J8,H7,I9,B12:E18,G20,K13:L17,N12,N2:P5,Q9:Q11,O13:P17,I19:K21,H18,G17,F21,D23,C21,B20,A21,A23,B23").Interior.ColorIndex = 4

End Sub

実行すると、こんなエラーが表示されていませんか?

実は、 Rangeはかっこの中の文字が255文字を超えるとエラーになってしまうんです。
たくさんのセルを指定して作業を行いたい時、これだと使いにくいですよね。

unionにも制限がありますが、Rangeの範囲をなんと30個まで指定できます。
Rangeで指定できる255文字の範囲×30個なので、組み合わせることでとても多くの範囲を合体させることができますよね。

指定したい範囲の数が決まっていないけど、結構多くなるかも…というときにはあらかじめunionとRangeを組み合わせてを使っておくと先程のようなエラーを防ぐことができます。

このように、指定できる範囲の数がunionとRangeの最大の違いです。少しだけど大きな違いですよね。
少しの範囲であればRangeを使うほうが早く書けるので、状況に合わせて使い分けていきましょう!

さて、次の項目ではunionはこんな時に使うと便利というシチュエーションを紹介していきます。どういうときに使えるか少しでも知っておくと、自分でマクロを作る時にひらめくきっかけになるので、実践前に見ていきましょう!

こんなことがしたい時に使える!

unionは先ほど紹介したように、たくさんの範囲を合体して一気に作業することができます。その特性を生かしていろいろなことが出来ます。

unionで合体した範囲…
グラフをつくる
コピーする
削除する
文字、セルの色を変える

などなど、たくさんあると手動では大変な作業も一気にこなすことが出来ます。

また、特定の文字が含まれるセルだけをunionで合体して、セルの色を変えたり、グラフにしたりすることも自動で出来るようになります。

手作業でやるよりunionを使えばとても効率的に作業できるようになるので、積極的に使ってマクロを作ってみましょう。
この後の実践編では、サンプルコード付きで今紹介した作業を自動で行う方法について解説していきますのでお楽しみに!

ここまでで、unionの基礎知識について学習してきました。
unionは「Rangeを合体してくれるもの」でRangeよりもたくさんの範囲を指定できるものでしたね。このことはしっかり覚えておき、次のステップに進んでいきましょう!

次の章では、unionメソッドの基本の使い方を解説していきます。
みなさんも一緒にサンプルコードを使って実践してみてくださいね。

unionメソッドを使って範囲を選択しよう

この章では、unionメソッドの基本の使い方を解説していきます。
ここで紹介する方法をベースにいろいろ作業することが出来るので、まずはこの章をしっかり学習していきましょう。

基本の使い方を覚えよう

unionメソッドの基本の使い方はとっても簡単です!
まず合体したい範囲を指定して、それからそのセルに対してどんなことを行いたいのかを書いていきます。

まずは範囲の指定の仕方です。サンプルコードを見てみましょう。

Sub union_test()

Union(Range("B2:D6"), Range("F10"), Range("B10:C13")).Select

End Sub

このように、Rangeで範囲を指定してから、それを合体させるイメージで書いていきます。複数指定する時はサンプルコードのようにカンマで区切れば30個まで指定することができます。
ここで注意点があります。unionは別のシートのセルを合体することはできません。エラーになってしまうため、シートをまたいで指定しないよう注意しましょう。

サンプルコードを実行すると、次の画像のようにB2からD6、F10、B10からC13までが選択状態になります。

unionの使い方の基本はこれだけです。
あとは選択されたセルの色を変えてみたり、コピーをしてみたり自由に操作することが出来ます。

その詳しい内容は、後の章でしっかり解説していきますので、その前に次の項目で条件に合ったセルを選択する方法を学習しておきましょう。

条件に合ったセルだけ選択する方法

基本のやり方のように、指定したい範囲がいつも固定で分かっていれば問題ないですが、指定したい範囲がいつも変わるという場合も多いと思います。
そんな時に役立つ方法をここでは紹介していきます。

まずはこのようなリストがあったとしましょう。

このサンプルコードは、A1からA6の範囲で「藤」が含まれたらセルを選択状態にするコードです。

Sub union_test()

'条件に合ったセルを格納するための変数
Dim target_cell As Range

'A6までループ
For i = 1 To 6
    '藤が含まれていたら、その範囲をunionで合体
    If InStr(Cells(i, 1).Value, "藤") > 0 Then
        If target_cell Is Nothing Then
            Set target_cell = Cells(i, 1)
        Else
            Set target_cell = Union(target_cell, Cells(i, 1))
        End If
    End If
Next

If Not target_cell Is Nothing Then
    '範囲を選択状態にする
    target_cell.Select
End If

End Sub

実行結果:

しっかり「藤」が含まれたセルだけが選択されましたね!
では、コードを詳しく解説していきます。

まずは、次のようにRange型の変数を宣言します。この変数には、選択状態にしたいセルの場所を保管します。

'条件に合ったセルを格納するための変数
Dim target_cell As Range

次にループを使って、A1からA6までのセルの内容を調べていきます。
「藤」が含まれるか調べるには「InStrメソッド」を使ってみましょう。
これは、検索したい文字が何文字目に含まれるか教えてくれるものです。含まれなければ0が返ってくるという特徴があります。例えば、「佐藤」なら2という数字が返ってきますし、「山田」なら0が返ってくるという感じです。
今回は、この特徴を使って内容を判断します。

そして次の部分が重要なポイントです。

If target_cell Is Nothing Then
  Set target_cell = Cells(i, 1)
Else
  Set target_cell = Union(target_cell, Cells(i, 1))
End If

まずは先ほど作った変数target_cellに、セルの場所が1つでも入っているか確かめています。
この手順を踏まないで、unionで範囲を合体させようとすると「セルの場所が1つも入ってない変数では合体できないよ!」とエラーが出て止まってしまいます。
何も入っていないときは、そのまま合体したいセルの場所を一つ入れてしまいましょう。

セルの場所が1つでも変数に入っていたら、unionを使うことが出来ます。
「union(セルの場所が入った変数,次に合体したいセルの場所)」の順番で書いて、それを「Set」という命令を使って変数に追加していきます。

そうして、合体したいセルの場所がどんどん変数target_cellに格納されていきます。

最後に、その合体したセルを選択状態にする「Select」を使うことで条件に一致したセルを選択することが出来ます。
該当するセルがない場合、「なにもないから選択できないよ!」というエラーを回避するためにここでも変数の中を確認してから「Select」を使うのが重要です。

以上で、unionを使ってセルを選択状態にするやり方を紹介しました。
この方法を使いこなすことが出来れば、基本は完璧です。
次の章では、セルの操作方法を紹介してきます。さらに応用して活用できるよう、一緒に学習していきましょう。

選択した範囲を操作してみよう

この章では、先程選択した範囲を使ってセルの操作について実践してみます。
ここで紹介する以外にもいろいろな操作がありますが、ここでは代表的なものを紹介していきます。

セルの色を変える

まずは、セルの色を変えてみます。
色を変えるには、一番最初に紹介したコードであった「Interior.ColorIndex」か「Interior.Color」を使います。

先程選択した「藤」が含まれるセルの色を赤に変えてみましょう。
最後の「Select」を使ってるところを次のように書き直します。

'範囲の色を変える
target_cell.Interior.ColorIndex = 3

ColorIndexは色のコードを数字で指定できるものです。3は赤色のコードで、5は青になっています。

もっと複雑な色にしたい場合は「Interior.Color」で次のように書きます。

'範囲の色を変える
target_cell.Interior.Color = RGB(120, 30, 200)

これは、赤・緑・青の順で色の濃さを指定して複雑な色にする方法です。一番濃い時は255で、薄い時は0です。数字の大小で色を混ぜ、複雑な色を表現してみましょう!

次は、選択したセルをコピーしてみましょう。

セルをコピーする

選択した範囲をコピーするには、「Copy」メソッドを使います。
こちらも先ほどサンプルコードで「Select」を使ってるところを次のように変えてみましょう。

'範囲コピーする
target_cell.Copy

'B2から張り付けてみる
Range("B2").PasteSpecial (xlPasteAll)

実行してみると、次の画像のようにB2から内容が張り付けられます。

連続しないセルを手作業でたくさん選択してコピーするのは大変なので、この方法を使って効率化してみましょう。

次は、選んだセルを削除してみます。

セルを削除する

セルを削除して、上に詰めたいときは「Delete」メソッドを使ってみましょう。
これも、「Select」を使ってるところを次のように変えてみるだけで実現できます。

'範囲を削除する
target_cell.Delete

実行すると、このようにセルを詰めることが出来ます。

こちらも、削除したいセルが多い時に自動化できたら便利ですよね。
リストの整理などにこの方法を是非使ってみてください。

次に、unionで選んだ数値でグラフを自動で作成してみましょう。

グラフを作る

先程のデータに点数の列を追加して、このようなリストを作りました。

サンプルコードも少し変更して、「藤」が入った名前の人の点数を棒グラフにしてみましょう!

Sub union_test()

'条件に合ったセルを格納するための変数
Dim target_cell As Range

'A6までループ
For i = 1 To 6
    
    '藤が含まれていたら、その隣の範囲をunionで合体
    If InStr(Cells(i, 1).Value, "藤") > 0 Then
        If target_cell Is Nothing Then
            Set target_cell = Cells(i, 2)
        Else
            Set target_cell = Union(target_cell, Cells(i, 2))
        End If
    End If

Next

If Not target_cell Is Nothing Then

    '範囲をグラフにする
    target_cell.Select
    Shapes.AddChart.Chart.ChartType = xlColumnClustered

End If

End Sub

実行結果するとこのグラフが作成されます!

自動でグラフにしたい数値をグラフにすることが出来ましたね。
このままだと、判例や棒グラフのx軸の名称は自動で設定できませんが、vbaでグラフの設定をすれば名称を自動的に設定することも可能です。もちろん手入力で変更しても問題ありません。

vbaでのグラフ操作の仕方はこちらの記事での学習をお勧めです。棒グラフ以外の作り方も記載してありますので、unionと合わせて使ってみましょう!

以上で、選択した範囲を使っていろいろな操作をする方法を紹介しました。
選択状態にすることができれば、どれも簡単に操作することが出来ました。
ここまでの方法を使って、作業が効率的になるようなマクロをどんどん作ってunionの使用に慣れていきましょう!

まとめ

unionの仕組みから、使い方まで順番に解説してきました。
unionがセルを合体してくれるので、セルの操作が一気に済ませることができるので便利ですよね。

Rangeと状況に合わせて使い分けられるよう、違いについては覚えておくようにしておくことをお勧めします。

実践中に分からないことがあれば、この記事を読んでまた一緒に復習していきましょう。

それでは、次の解説で!

この記事を書いた人

文系大学出身、なんとか自力で頑張りプログラマー歴今年で8年目。
自力で頑張って勉強した経験を生かし、読者の皆様に分かりやすく親しみやすい記事を書けるよう日々邁進中です。
出来る言語はC#,VB,Java,Delphiなどなど、幅広く触っています。

目次