テーマ:シートを検索して着色するマクロ(その3)
◆リクエスト紹介
今回は、前回のシリーズ「文字列を検索するマクロ」に関連していただいた
下記のリクエストをご紹介しています。
投稿者:YSさん
>今回の文字列検索マクロ面白いです。
>続きで、シート全体に検索をして、
>対象になったセルの全てに着色が
>したいのですが、可能ですか。
YSさん、リクエストありがとうございます。
◆今日の講座
今回のリクエストのポイントは、検索結果に色を付けるということと、シート
全体を検索するということの2つであることは最初にもいいましたが、前回ま
でにこのうちの「検索結果に色を付ける」というところまで完成しましたので
今回は、もう一つの「シート全体を検索する」という方をやっていくことにし
ます。
それでは、前回作成したエクセルマクロ"gogo97.xls"をご用意ください。
1)
まずはじめに、プログラムの中身の確認です。
――――――――――――――――――――――――――――+
1."gogo97.xls"を開きます。(セキュリティ確認画面が表示された
場合には、[マクロを有効にする]を選んでください。)
2.マクロプログラムを表示します。
[ツール(T)] → [マクロ(M)] → [Visual Basic Editor(V)]
3.この画面の左上半分の[-標準モジュール]という所の下の
[Module1]をダブルクリックします。
――――――――――――――――――――――――――――+
++++++++++++++++++++++++++++―
Sub Macro1()
'
Call Macro4
b = InputBox("検索したい商品名を入力してください。")
n = Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To n
Range("B" & i).Select
a = ActiveCell.Value
If a Like "*" & b & "*" Then
Call Macro2
End If
Next i
Range("E2").Select
End Sub
++++++++++++++++++++++++++++―
これは、前回までに作成した「検索結果に色を付ける」というマクロプログラ
ムです。
Call Macro2 で実際にセルに色を塗っています。
また、最初の Call Macro4 では、前回塗った色が残らないよう、全てのセル
の色をクリアーしています。
この段階ではまだB列についてのみ検索を行なうマクロとなっているわけです
が、今回これをシート全体へと広げていくことにします。
ここで、いま一度繰り返し処理(ループ)についてのおさらいですが、
前回のように1列のみが検索対象のプログラムでは、ループ( For~Next )は
1つで済みますが、これを複数の列を検索対象とする場合、ループが2つの2
重ループ(すなわち、ループの中にもう一つのループが入るプログラム)に
していく必要があります。
この2重ループに関しては前にも勉強しましたが、
++++++++++++++++++++++++++++―
For i = 1 To 10
ある処理
Next i
++++++++++++++++++++++++++++―
上記は、「ループの基本形」ということで、この講座ではもう再三勉強してき
ていますのでみなさんもうよくお分かりの所とは思いますが、これは言い換え
るならば”1重ループ”ともいえます。
なので、今回用いる”2重ループ”というものは、
++++++++++++++++++++++++++++―
For j = 1 To 10
データ設定
For i = 1 To 10
ある処理
Next i
Next j
++++++++++++++++++++++++++++―
このような形になります。
本講座では、これを「2重ループの基本形」と定めています。
2)
それでは、これを踏まえてプログラムに少し手を加えていきます。
――――――――――――――――――――――――――――+
1.まず、プログラム上方の
n = Cells(Rows.Count, j).End(xlUp).Row
という行の上に下記の1行に追加してください。
For j = 1 To 256
2.次に、プログラム下方の
Next i
という行の下に下記の1行に追加してください。
Next j
――――――――――――――――――――――――――――+
修正した後のプログラムはつぎの様になります。(ループの中の行は[Tab]キー
を使って、なるべく下記のように見やすく字下げを行なってください。)
++++++++++++++++++++++++++++―
Sub Macro1()
'
Call Macro4
b = InputBox("検索したい商品名を入力してください。")
For j = 1 To 256
n = Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To n
Range("B" & i).Select
a = ActiveCell.Value
If a Like "*" & b & "*" Then
Call Macro2
End If
Next i
Next j
Range("E2").Select
End Sub
++++++++++++++++++++++++++++―
これで、プログラムの構造が2重ループになりました。
すなわち、縦×横(行×列)の両方向に向かって検索をしていくというプログラ
ムに拡張できたわけです。
ここで、ループ文 For j = 1 To 256 の256という数字はエクセル(Excel2007
以外)での最大の列数を表しています。
(まぁ、検索対象とするデータの列数というものは行数とは違ってあまり変動
するケースは少ないと思いますので、その都度データの列数に合わせてやれば
よいと思いますが、とりあえずここでは最大の256にしておきます。)
ただし、これではまだB列に対してのみしか検索はできませんので、もう少し
修正を加える必要があります。(プログラムの中に "B" という記述が残って
いるので。)
3)
それでは、このプログラムにもう少し手を加えていきます。
――――――――――――――――――――――――――――+
1.まず、プログラム上方の
n = Cells(Rows.Count, "B").End(xlUp).Row
という行を、以下に修正します。
n = Cells(Rows.Count, j).End(xlUp).Row
( "B" → j に変えるだけです。)
2.次に、プログラム中段の
Range("B" & i).Select
という行を、以下に修正します。
Cells(i, j).Select
――――――――――――――――――――――――――――+
修正した後のプログラムはつぎの様になります。
++++++++++++++++++++++++++++―
Sub Macro1()
'
Call Macro4
b = InputBox("検索したい商品名を入力してください。")
For j = 1 To 256
n = Cells(Rows.Count, j).End(xlUp).Row
For i = 1 To n
Cells(i, j).Select
a = ActiveCell.Value
If a Like "*" & b & "*" Then
Call Macro2
End If
Next i
Next j
Range("E2").Select
End Sub
++++++++++++++++++++++++++++―
ここで出てきた Cells(i, j) というものを使うことで、i行j列(iとjは数字)
のセルをセレクト(選択)することができます。
例)
Cells(5, 3).Select・・・3番目の列の5行目のセル(すなわちC5のセル)を
選択するという意味。
4)
それでは、確認のため実行してみましょう。
――――――――――――――――――――――――――――+
1.エクセルの画面に戻って、新しく空のシート[Sheet7]を作成してください。
[挿入(I)] → [ワークシート(W)]
2.次に、テスト用のデータを入力します。
以下のテキスト(5行)をコピーして、[Sheet7]のセルA1の位置に
そのまま貼り付けてください。
ボールペン
ノート
シャーペン
消しゴム
ボールペン赤
3.同様に、
以下のテキスト(5行)をコピーして、今度は隣のセルB1の位置に
そのまま貼り付けてください。
ノートA4
3色ボールペン
4色ボールペン
修正液
シャーペン0.5mm
4.同様に、
以下のテキスト(5行)をコピーして、その隣のセルC1の位置に
そのまま貼り付けてください。
ボールペン黒
ノートA5
シャーペン0.3mm
消しゴム
ボールペン青
5.では、実行します。
[ツール(T)] → [マクロ(M)] → [マクロ(M)...] → マクロ画面が出るので
そのまま[実行]をクリック。
6.すると、入力窓のあるポップアップ画面が表示されたと思いますので、
その入力窓に以下の日本語(2文字)
ペン
と入力してください。
7.そうしたら、このポップアップ画面にある[OK]ボタンをクリックします。
――――――――――――――――――――――――――――+
実行した結果、各列のペンという文字を含むデータのセルが黄色く塗りつぶさ
れていればOKです。
これで、複数の列に対しても検索ができるようなマクロになった。ということ
になります。
ただし、完成にはもう少し手を加えなければならない部分がありますので、
次回それを行なってこのマクロの完成を目指します。
今回はこれで終了です。