初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel(エクセル)マクロVBA入門-VLOOKUP関数を使う:エラー処理をする

さて、今回は前回の続きです。さっそく答えですが・・・

  • 出席番号の入力で数字以外の文字列とかが入ってきたとき
  • VLookupで検索した結果がない時(出席番号にない番号が入力された時)

の2つです。

前回のプログラムをもう一度記載しますと・・・

Option Explicit

Sub sample1()
On Error GoTo catchErr
    
    ' 必要な変数を作成する
    Dim shussekiNumber As Long      ' 出席番号を格納する変数
    Dim name As String              ' 氏名
    Dim sansu As Long               ' 算数点数
    Dim kokugo As Long              ' 国語点数
    Dim rika As Long                ' 理科点数
    Dim syakai As Long              ' 社会点数
    Dim eigo As Long                ' 英語点数
    
    ' 出席番号を入力してもらう(ここで例外発生する!)
    shussekiNumber = InputBox("出席番号を入力してください", "出席番号入力", 1)
    
    ' 番号を使ってVlookUpで名前と点数を取得する(ここでも例外発生する!)
    name = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 2, False)
    sansu = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 3, False)
    kokugo = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 4, False)
    rika = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 5, False)
    syakai = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 6, False)
    eigo = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 7, False)
    
    ' 所定の場所へ出力する
    Sheet1.Range("A19").Value = shussekiNumber
    Sheet1.Range("B19").Value = name
    Sheet1.Range("C19").Value = sansu
    Sheet1.Range("D19").Value = kokugo
    Sheet1.Range("E19").Value = rika
    Sheet1.Range("F19").Value = syakai
    Sheet1.Range("G19").Value = eigo
    
    'マクロ終了
    Exit Sub
    
catchErr:
    'エラーになった時の処理
    

End Sub

上記のコメントのように例外はこの箇所で発生してしまいます。前々回で学んだエラー処理をちゃんと書いてみましょう。まず1つ目です。

出席番号の入力で数字以外の文字列とかが入ってきたとき


この場合は「出席番号が存在しません。処理を終了します。」と表示して処理を終わるようにします。

catchErr:
    'エラーになった時の処理
    MsgBox "出席番号が存在しません。処理を終了します。", vbOKOnly + vbExclamation, "エラー"

End Sub


これでいいですね。では2つ目の場合はどうしたらいいのでしょうか?さぁ・・・同じようにcatchErr:の中に書いてしまうと、今度は違うエラーメッセージが出てしまいます。

VLookupで検索した結果がない時(出席番号にない番号が入力された時)エラーを分ける!


On Error Gotoは実はいろんな場所に書くことができます。そして、一旦書くとそれ以降の処理についての例外をキャッチします。ですので、最初に書いた後にもう一度On Error Gotoを書きラベルを変更すればいいわけです。つまり・・・


Option Explicit

Sub sample1()
'出席番号のエラーをキャッチする
On Error GoTo shussekiErr
    
    ' 必要な変数を作成する
    Dim shussekiNumber As Long      ' 出席番号を格納する変数
    Dim name As String              ' 氏名
    Dim sansu As Long               ' 算数点数
    Dim kokugo As Long              ' 国語点数
    Dim rika As Long                ' 理科点数
    Dim syakai As Long              ' 社会点数
    Dim eigo As Long                ' 英語点数
    
    ' 出席番号を入力してもらう(ここで例外発生する!)
    shussekiNumber = InputBox("出席番号を入力してください", "出席番号入力", 1)

'VLookupのエラーをキャッチする
On Error GoTo vlookupErr

    ' 番号を使ってVlookUpで名前と点数を取得する(ここでも例外発生する!)
    name = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 2, False)
    sansu = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 3, False)
    kokugo = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 4, False)
    rika = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 5, False)
    syakai = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 6, False)
    eigo = Application.WorksheetFunction.VLookup(shussekiNumber, Sheet1.Range("A3:G13"), 7, False)
    
    ' 所定の場所へ出力する
    Sheet1.Range("A19").Value = shussekiNumber
    Sheet1.Range("B19").Value = name
    Sheet1.Range("C19").Value = sansu
    Sheet1.Range("D19").Value = kokugo
    Sheet1.Range("E19").Value = rika
    Sheet1.Range("F19").Value = syakai
    Sheet1.Range("G19").Value = eigo
    
    'マクロ終了
    Exit Sub
    
shussekiErr:
    'エラーになった時の処理
    MsgBox "出席番号が存在しません。処理を終了します。", vbOKOnly + vbExclamation, "エラー"
    'マクロを終了する
    Exit Sub
    
vlookupErr:
    MsgBox "出席番号が見つかりません。処理を終了します。", vbOKOnly + vbExclamation, "エラー"
    'マクロを終了する
    Exit Sub

End Sub

これが答えです。わかりやすいようについでにエラーのラベルも「shussekiErr」と「vlookupErr」にわけています。これで、出席番号に数字以外が入力されたら、「出席番号が存在しません。処理を終了します。」と、見つからない出席番号が入力されたら、「出席番号が見つかりません。処理を終了します。」というメッセージを表示して処理が終了するわけです。これで、ある程度の例外でも耐えることができるようになりました。実は他にも例外は存在します。例えば成績表の点数に文字列が入っていたら・・・ぞっとしますね。しかし、とりあえずそれは「あくまで点数が入っている前提」ということにします。だって成績表ですから。

これで、初めてマクロが組めたと言えます。やっとですね。。。。

もっと使いやすく、もっときれいに!


しかし、このマクロはまだまだ色々と改善の余地があります。というかわざとそう書いています。エラー処理も実はラベルを2つなんて作る必要はありませんし、こんなにたくさんVlookup関数を書いてそれぞれの科目の変数も用意する必要はありません。もっともっとフレキシブル(汎用的)に拡張性を高くすることができるんです。他の例外にも全部対応することだってできます。それをこれからどんどん書いてブラッシュアップしていきましょう!
ですので、このマクロにもう少しお付き合いください。!少しずつでいいんです。もっとユーザーに分かりやすく、そしてもっとマクロを作る人にもわかりやすく!していきましょう!まずは最終的なゴールを先に提示しておきます。

成績表出力マクロの最終目標!


目標とする成績表出力マクロの最終的な目標です!

  • 成績表シートに成績表がある。
  • 出力する出席番号を入力欄がある
  • 出力ボタンを押すと入力した出席番号の人の成績表ファイルが作成される。
  • 印刷チェックボックスがある
  • 印刷チェックがついてると成績表ファイルが作成され、印刷もされる。

他にも考えれば、いろんな機能が想定できます。出力するファイルの場所を指定できるとか・・・全員分一括で出力するとか・・・色々ありますが、まずはこれだけ!この機能を次回からどんどんと作成していきましょう。さらに、科目が増えたらどうするの?とかそういった「拡張」という部分からもマクロをもっと効率的に作成できる技術と知識を書いて行きたいと思います。

正直、こっから完成までの連載はちょっと難しいかもしれないですが、頑張ってくださいね!大丈夫です。プログラミングの基礎を学んでいれば簡単ですから!


今日はここまで!

かしこ