表計算ソフトのExcelは非常に便利なソフトですね。数字の計算からグラフ・抽出まで簡単な操作で出来ます。こんな便利なソフトですが、複雑な計算をさせたり、多くの条件で分けて計算をする際には、さすがに標準の数式では限界があります。
その限界を突破するためにあるのが、VBA(Visual Basic for Application)です。平たく言ってしまうとExcelで行うプログラミングです。
そう言ってしまうと構えてしまう方も多いかもしれませんが、実際にやってみるとコツをつかめば心強い機能になります。
このコラムでは、よく使うコードを紹介していきたいと思います。
紹介するコードは下記環境で動作確認をしておりますので、あらかじめご了承ください。
OS:Windows7 および Windows10
Officeバージョン:MicrosoftOffice2013 および 2016
今回紹介するのは「セルの検索」です。
早速、コードを見てみましょう。
Dim find_str As String, obj As Range
‘②変数に初期値を代入
find_str = “検索文字”
‘③検索の範囲を設定
With Range(Cells(1, 1), Cells(5, 5))
Set obj = .Find(find_str, LookAt:=xlWhole)
If obj Is Nothing Then
MsgBox (find_str & “に該当なし”)
Else
obj.Select
End If
‘⑤変数の初期化
Set obj = Nothing
End With
End Sub
このコードでは検索を行った文字を含む1つ目のセルを選択します。
順番に実行する内容を見てみましょう。
Dim find_str As String, obj As Range
ここでは変数の宣言を行っているのみです。
注意点としては、検索結果のセル情報を受け取る変数のデータ型に、「Range」のオブジェクト型を設定している点です。今回はセルの検索なので、「Range」を設定します。
find_str = “検索文字”
ここでは検索文字を格納する「find_str」に検索をする情報を設定します。
直接文字列を代入していますが、セルを指定したり、inputボックスを利用するなど、変更しても構いません。
With Range(Cells(1, 1), Cells(5, 5))
・・・
End With
ここで利用する「With」はオブジェクト情報の記述を省略する為に使用します。
今回のコードの流れからみると、検索の範囲指定として利用するイメージです。
どこで利用しているかは後ほどご説明します。
Set obj = .Find(find_str, LookAt:=xlWhole)
If obj Is Nothing Then
MsgBox (find_str & “に該当なし”)
Else
obj.Select
End If
ここで検索の実行と、結果から条件分岐をしています。
左辺から見てみましょう。
オブジェクト型の変数に値を代入しますので、「Set」を先頭に記述します。
右辺で検索を実行しています。
ここで先ほどの「With」で指定したセルの範囲が利用されます。
「.Find(・・・)」とすることで、「Range(Cells(1, 1), Cells(5, 5)) .Find(・・・)」と同じ効果になります。今回のコードでは1か所のみの記述ですので影響は小さいですが、複数個所に記述する場合には、読み間違いや修正漏れを防ぐためにも利用したいところです。
次に検索結果を利用する為の準備をします。
Findメソッドは、条件に概要する結果が見つかった場合には、そのセルのRangeオブジェクトを返します。もし見つからなかった場合には「Nothing」という値を返します。
なので、見つかったかどうかをIf構文で振り分け、見つかった場合にのみ目的のコードが実行されるようにする必要があります。
MsgBox (find_str & “に該当なし”)
Else
obj.Select
End If
上記のように、If構文の判定式に「obj Is Nothing」とすることで、見つからなかった場合のコードを記述することができ、Elseで見つかった場合のコードを記述することで振り分けられます。
Set obj = Nothing
ここではobjの変数を初期化しています。オブジェクト型の変数はそのまま放って他のコードを実行していると、動作が重くなることがあります。オブジェクト型では特に、不要になったら初期化する癖をつけましょう。
今回も少し長くなりましたが、いかがでしたでしょうか。
次回は複数の検索結果の取得をするコードを紹介したいと思います。