日本語VBAで 値があるセル のみを選択しよう

Pocket

日本語VBAで 値があるセル のみを選択しよう
日本語VBAで値があるセルのみを選択しよう

序文

はい。皆さん、お正月の連休は、ゆっくり過ごされましたか?

ご親戚のお付き合いや、忘年会・新年会でなかなかゆっくりできないでいらっしゃった方も多いのでは?とも思っています。

ただ、子供さんやご親戚、友人の方々が一緒に集まる機会がお正月ですので、なかなか良い機会では無かったでしょうか。

KaBAは相変わらず、ブログネタをため込んでいましたが、やはり、親戚の新年会や友人との同窓会、新年会に、参加してなかなか有意義なお正月を過ごしていました。

さて、いよいよ仕事始めですね!頑張っていきましょう!

と、いうわけで、日本語VBAも仕事始めと書き初めです。

今回は、選択範囲中の、値の入っているセルのみを選択する、という方法をご紹介します。

それでは、行ってみましょう!

今回の実行結果

今回の実行結果
今回の実行結果

上図は、今回の処理を実行した後の、実行結果の画面です。

このように、エクセルシートの中から、セルに値の入ったセルのみを自動的に選択します。

メイン処理

セルの集合を入れる変数を作成

「値の入っているセルの集合」を入れる変数
「値の入っているセルの集合」を入れる変数

まず、最終結果の「値の入っているセルの集合」を入れる変数を作ります。

ここでは、「w_セル集合」 という変数を作成しています。

ただ、「w_セル集合」に値が入っていないと、その後の処理がうまく動かないため、とりあえず、“A3″セルを「w_セル集合」にセットしています。

コードは以下のようになります。必要であれば、コピペされてください。

Public Sub 値のあるセルのみを選択()
    Dim w_セル集合 As セル

    Set w_セル集合 = g_道具.セル("A3")

End Sub

「セルごとにサブルーチンを呼び出す」でブロックを呼び出す処理

「ブロック」というサブルーチンを呼び出すコード
「ブロック」というサブルーチンを呼び出すコード

次に、エクセル関数日本語化の特徴である「ブロック」というサブルーチンを呼び出すコードを書きます。

「ブロック」とは、第一引数に、例えば、選択範囲内のセル群のうち、一つだけセットした状態で「ブロック」サブルーチンが呼ばれます。

このセル群のうち、すべてのセルを一つずつセットして、セル群内のすべてのセルの分、ブロックが呼ばれます。

このため、「ブロック」サブルーチン自体は、一つのセルに対する処理のみ書けばよいため、コートを書く際の見通しが良くなります。

ややこしいですが、サブルーチンの第1引数に自動的にセルをセットして、自動的にサブルーチンを呼ぶ方法が、「セルごとにサブルーチン呼び出し」メソッドであり、「ブロック」サブルーチンである、と覚えられてください。

コードは以下のようになります。

Public Sub 値のあるセルのみを選択()
    Dim w_セル集合 As セル

    Set w_セル集合 = g_道具.セル("A3")

    g_道具.セル.選択範囲.セルごとにサブルーチン呼び出し "b_値のあるセルを選択", w_セル集合

End Sub

また、今回は「セルごとサブルーチン呼び出し」に「w_セル集合」変数もセットしています。

この「w_セル集合」は「ブロック」の第2引数にセットされます。

メイン処理完成形

「選択」メソッドを実行して、セルの集合を選択
「選択」メソッドを実行して、セルの集合を選択

「セルごとにサブルーチン呼び出し」が完了した後は、「値の入っているセルの集合」は、「w_セル集合」にセットされていますので、後は、「選択」メソッドを実行して、セルの集合を選択するだけです。

また、最後に使い終わった「w_セル集合」を破棄しています。

コードは以下のようになります。メイン処理は完成しましたので、以下のコードをコピペされてください。

Public Sub 値のあるセルのみを選択()
    Dim w_セル集合 As セル

    Set w_セル集合 = g_道具.セル("A3")

    g_道具.セル.選択範囲.セルごとにサブルーチン呼び出し "b_値のあるセルを選択", w_セル集合

    w_セル集合.選択

    Set w_セル集合 = Nothing

End Sub

 

実際に選択処理を行うブロック

ブロックのひな形

ブロックのひな形
ブロックのひな形

それでは、サブ処理を行うブロックを作成します。

ブロックのひな形は以下のようなコードになります。

「ブロック」の特徴として、第1引数に処理の対象のセルがセットされます。

また、今回メイン処理で「w_セル集合」もセットするように指定していましたので、ブロックの第2引数には、「w_セル集合」がセットされます。

Private Sub b_値のあるセルを選択(w_セル As セル, w_セル集合 As セル)

End Sub

「セルに値が入っているかどうか」をチェックするif文

「セルに値が入っているかどうか」をチェックするif文
「セルに値が入っているかどうか」をチェックするif文

次にチェック対象のセルに値が存在するかどうかチェックしましょう。

「w_セル」の「値」が、空白文字「””」と一致しないことを「<>」演算で、確認しています。

「<>」とは「≠」のことです。半角英数字には「≠」は存在しないため、苦肉の策として、「<>」が「≠」の代わりに使用されています。

コードは以下のようになります。

Private Sub b_値のあるセルを選択(w_セル As セル, w_セル集合 As セル)
    If w_セル.値 <> "" Then

    End If
End Sub

値の入っているセルの集合同士を集合の和算するUnion関数

集合の和算するUnion関数
集合の和算するUnion関数

最後に、結構難しい処理を作ります。

「w_セル集合」のセルの集合と、「w_セル」の1つだけのセルの集合の和を取る、という、いわゆる「集合和」という演算を行います。

「集合和」はVBでは、「Union」関数がそれに当たります。

まだエクセル関数日本語化では、「Union」関数を日本語化していないため、当面「Union」関数を使用します。

Union関数により集合和が行われた結果のセルの集合は、再び「w_セル集合」にセットされています。

これにより、「w_セル集合」に、ブロックが呼ばれる度に、どんどん「w_セル」が足されていく、という処理結果になります。

コードは以下のようになります。ブロックも完成形ですので、以下のコードをコピペされてください。

 

Private Sub b_値のあるセルを選択(w_セル As セル, w_セル集合 As セル)
    If w_セル.値 <> "" Then
        Set w_セル集合.セット = Union(w_セル集合.JP関数用, w_セル.JP関数用)
    End If
End Sub

 

実際に実行してみる

処理の対象を範囲選択する

範囲選択する
範囲選択する

まずは、適当にセルに値を入れて、それらを囲むように範囲選択してください。

今までに作ったVBAを実行すると、これら値の入ったセルのみ選択された状態になります。

「開発」タブを開き、「マクロ」ボタンをクリックする

「開発」タブを開き、「マクロ」ボタンをクリックする
「開発」タブを開き、「マクロ」ボタンをクリックする

次にVBAを実行します。

「開発」タブ「マクロ」ボタンをクリックします。

なお、「開発」タブが画面上に存在しない場合は、以下のURLのページを確認して、「開発」タブを表示してください。

マクロを実行する

「値のあるセルのみを選択」マクロ(サブルーチン)を実行
「値のあるセルのみを選択」マクロ(サブルーチン)を実行

VBAのサブルーチンは別名「マクロ」と呼ばれます。

ここでは先ほど作成した「値のあるセルのみを選択」サブルーチンを実行します。

サブルーチン名を選択した後、「実行」ボタンをクリックして下さい。

値の入っているセルだけ選択された実行結果

今回の実行結果
今回の実行結果

実行結果は、上の通りです。

きちんと、値の入っているセルが選択されていますね。

一部「A3」セルも選択されていますが、これは「w_セル集合」変数を「A3」セルで初期化したためです。

本来的には、「w_セル集合」から「A3」セルを集合差で引き算しないといけないのですが、VBAの関数には、「集合差」が存在しません

「Union」(集合和)、集合差も含め、エクセル関数日本語化の次バージョンで用意する予定です。

2020/1/29追記 集合差で「A3」セルを除外する

「エクセルVBA日本語化」ver0.20.0以上のバージョンが必要ですが、

w_セル集合.集合差 g_道具.セル("A3")

というセルに対し、「集合差」メソッドなど、「集合演算」の機能を追加しています。

「エクセルVBA日本語化」ver0.20.0は以下のURLからダウンロードされてください。

また、ベクター様サイトにも登録申請中です。

これらを使用すれば、

  • 集合差
  • 集合和
  • 集合積
  • 集合反転

などが可能になります。

なお、これらは、モハヨナオ (id:mohayonao) さんのVBAコードを利用させて頂いています。

集合差を使ってこのページのプログラムを作ると、「A3」セルを選択結果から除外することができます。

集合差の実行結果は、下図のようになります。

集合差の実行結果
集合差の実行結果

「A3」セルが除外されていますね。

プログラムは以下のようになります。

Public Sub 値のあるセルのみを選択02()
    Dim w_セル集合 As セル
 
    'w_セル集合には何らかのセルが入っていないといけないため、ここでは"A3"セルを入れておきます。
    Set w_セル集合 = g_道具.セル("A3")
 
    g_道具.セル.選択範囲.セルごとにサブルーチン呼び出し "b_値のあるセルを選択", w_セル集合
 
    '最初に入れておいた"A3"セルを選択範囲から除外します。
    w_セル集合.集合差 g_道具.セル("A3")
 
    w_セル集合.選択
 
    Set w_セル集合 = Nothing
 
End Sub

Private Sub b_値のあるセルを選択(w_セル As セル, w_セル集合 As セル)
' セルに「値が入っているか」の条件以外にも、以下のように細やかな条件を指定することができます。
'    If F_もし数値(w_セル) Then
'        w_セル集合.集合和 w_セル
'    End If
'    If F_もし文字列(w_セル) Then
'        w_セル集合.集合和 w_セル
'    End If
'    If F_もし偶数(w_セル) Then
'        w_セル集合.集合和 w_セル
'    End If
'    If F_もし奇数(w_セル) Then
'        w_セル集合.集合和 w_セル
'    End If
    
    If w_セル.値 <> "" Then
        w_セル集合.集合和 w_セル
    End If
End Sub

まとめ

皆さん、大変お疲れ様でした。

ここまで読んで下さって、誠にありがとうございました。

本日の学びを以下にまとめます。

  • セルの集合は「Union」という関数で結合できる。
    Unionは集合和という演算。しかしVBAには集合差、集合積などが用意されていない。
    これらはエクセル関数日本語化の次バージョンで用意する予定。
  • セルごとにサブルーチン呼び出し」は、セルごとに「ブロック」を呼び出す。
    「ブロック」の第1引数はセル
  • 「ブロック」の第2引数以降は、「セルごとにサブルーチン呼び出し」の引数で「ブロック名」以降に指定した変数がセットされる。
  • 「w_セル集合」などセル系の変数の「選択」メソッドを実行することで、エクセル上ではそのセルが選択状態になる。

 

ブロック」や「セルごとにサブルーチン呼び出し」は、慣れないと難しい操作ですが、慣れると、コードが簡潔になりコードを書きやすくなりますので、ぜひ、この機会に挑戦されてみてはいかがでしょうか?

それではー またー (^_^)/

The following two tabs change content below.
KaBA@フリーランス修行中

KaBA@フリーランス修行中

こんにちは!IT業界で勤めて17年くらい務めています。プログラミング大好きやろーです。 自分も独学でC言語を覚えIT会社に就職しました。その後紆余曲折を経て、VB6.0、VBA、Perl、C#、HTML、CSS、JavaScript、PHPなどを覚えていきました。全部C言語の独学時の経験がベースとなって、学習曲線が良いカーブを描いていました。 情報工学科を出ていなくても、独学でエンジニアは育つことができると思います! このブログで皆さんがプログラミングに興味を持たれるのを心待ちにしています! 頑張って覚えられてください!よろしくお願いします。 趣味は読書で、小宮一慶さんや松下幸之助さんなど著名人の本を読んでいる他、赤川次郎さんの三毛猫ホームズシリーズ司馬遼太郎吉川英治さんの三国志などが好きです。