見出し画像

18-検索値がなかった場合のエラーに対応する。(エクセルマクロ)

なぜマクロが止まったのかわかるようにしておく。

皆さんこんにちは。
今回はマクロ実行時にエラーで止まってしまったとき、なぜ止まったのかを解析せずに済むように、エラーを考慮したコードの書き方をご紹介します。

関連動画>>【マクロルーティン23】検索値がなかったらお知らせする。

◆エラーが発生する可能性がある場所を考える

次の図のマクロは
「種類」という文字のあるセルの列番号を取得して、
その列をAutoFilterで「美容」で絞込み、
データを処理していく流れのマクロになっています。
(関連記事:17-項目名で列番号を取得する

画像1

まず、コードの中に固定値がある個所はエラーが発生する可能性を考えます。固定値にしているということは絶対にその値と一致していなければいけないということです。項目名が変わっているかもしれないし、存在しないかもしれないのです。

ということで一行目のコードは”種類”という値のあるセルの列を取得するコードですが、
retsu = Worksheets("記録").Rows(1).Find(what:="種類").Column

”種類”という値がないかもしれません。
その場合の書き方です。

◆考え方

”種類”という値のあるセルの列をいきなり取得しようとせずに、まずは”種類”という値のあるセルの存在を確認する。

retsu = Worksheets("記録").Rows(1).Find(what:="種類").Column
太字の部分でセルを取得しています。


◆書き方

書き換える前のマクロ一行目
retsu = Worksheets("記録").Rows(1).Find(what:="種類").Column

で、「.Column」の手前までの太字の部分が検索したセルですので、この検索セルが存在しない場合はエラーメッセージをだしたい。
↓↓
セルが見つかった時だけ実行する。

①If Not Worksheets("記録").Rows(1).Find(what:="種類") Is Nothing Then
(実行コード)
①End If
★「セルがNothingでないならば」です。

そして、「Worksheets("記録").Rows(1).Find(what:="種類")」この部分は長いので変数(seru)に入れます。

seru = Worksheets("記録").Rows(1).Find(what:="種類")

すると書き換える前の一行目は
②retsu = seru.Column

◆途中経過1

seru = Worksheets("記録").Rows(1).Find(what:="種類")
①If Not seru Is Nothing Then
 ②retsu = seru.Column
  Worksheets("記録").Range("A1").AutoFilter Field:=retsu, Criteria1:="美容"
  Worksheets("記録").Cells.Copy Worksheets("美容").Cells
  Worksheets("記録").ShowAllData
①End If

★次に、seruセル範囲の変数なのでRangeオブジェクトである。
ということを宣言します。
③Dim seru As Range(seruはRangeオブジェクトです)
そして、
オブジェクト変数にオブジェクトを格納するときは、Setを付けなければいけませんので、
④Set
seru = Worksheets("記録").Rows(1).Find(what:="種類")
となります。


◆途中経過2

③Dim seru As Range
④Set seru = Worksheets("記録").Rows(1).Find(what:="種類")

①If Not seru Is Nothing Then
 ②retsu = seru.Column
  Worksheets("記録").Range("A1").AutoFilter Field:=retsu, Criteria1:="美容"
  Worksheets("記録").Cells.Copy Worksheets("美容").Cells
  Worksheets("記録").ShowAllData
①End If

★次に、②の”retsu”も変数なので変数宣言をします。retsuは列番号をいれる変数なので、
⑤Dim retsu As Long(retsuは整数です。)
 ★Long(整数)はオブジェクト名じゃないので「②retsu = seru.Column」にsetはつきませんね。

★今回はオブジェクト変数で変数宣言をしていますので、このマクロで使われる変数にはすべて変数宣言をして統一して書いています。

◆最後!

検索値がなかったときのためにメッセージを出すコードを書きます。

①If Not seru Is Nothing Then
このIf文が当てはまらなかったらメッセージが出ればいいので、
①End Ifで閉じる前に

Else
 MsgBox "種類の入ったセルはありません。"

を挿入してElseをとおってメッセージボックスを表示させるように書きます。

◆完成コード

画像2

★最初の3行は追加されたコードです。
四角で囲まれた部分は書き直す前のマクロの内容で、If文の中に組み込んで、検索したセルが存在する場合だけ実行するように書きます。

⑤Dim retsu As Long
③Dim seru As Range
④Set seru = Worksheets("記録").Rows(1).Find(what:="種類")

①If Not seru Is Nothing Then 
(→seruがあれば)
 ②retsu = seru.Column (→セルの列番号を取得)
  Worksheets("記録").Range("A1").AutoFilter Field:=retsu, Criteria1:="美容"
  Worksheets("記録").Cells.Copy Worksheets("美容").Cells
  Worksheets("記録").ShowAllData
①Else (→seruがなければ)
 MsgBox "種類の入ったセルはありません。"
①End If


<テキスト>
Dim retsu As Long
Dim seru As Range
Set seru = Worksheets("記録").Rows(1).Find(what:="種類")

If Not seru Is Nothing Then
 retsu = seru.Column
 Worksheets("記録").Range("A1").AutoFilter Field:=retsu, Criteria1:="美容"
 Worksheets("記録").Cells.Copy Worksheets("美容").Cells
 Worksheets("記録").ShowAllData
Else
 MsgBox "検索値はありません。"
End If

以上です。
関連動画↓↓


この記事が気に入ったらサポートをしてみませんか?