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

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

初心者のためのExcel(エクセル)マクロVBA入門-成績表マクロの作成:事前後の処理(ScreenUpdateingプロパティなど)

さて、今日からは設計から各種のメソッドを作っていきます。
1つ1つの役割を考えて、処理を書いて行きます。
まずは前々回でやった設計に登場した処理を再掲載します。

  1. ボタン押下時のイベント処理
  2. メイン処理(mdlMain)
    1. 事前の処理(mdlStartEnd.PreStart)
    2. エラーのチェック(mdlErrorCheck.InputCheck)
    3. 成績表の読み込み(mdlInputScore.InputScore)
    4. 成績表の出力(mdlOutputScore.OutputScore)
      1. 印刷プレビュー(mdlOutputScore.PrintScore)
    5. 事後の処理(mdlStartEnd.PreEnd)

ここにある()の中のメソッドをどんどん書いて行きます。
まずは「mdlStartEnd.PreStart」です。標準モジュールは外枠としてすでにあるので、
mdlStartEndをダブルクリックして開きます。
そこに「PreStart」を作成するだけです。ではPreStartの役割を考えましょう。

マクロ実行中になんか操作されると困らない?


マクロを実行している間に他のボタンとか押されると困りませんか?
また他のエクセルとか触られると困りませんか?

こういったことを解消したいのでマクロの実行中は・・・

  • ボタンを非活性にしたい
  • マウスを砂時計にしたい

ということをして「処理中」であることをアピールするわけです。マクロによって時間がかかる処理の場合には処理の進行バーが出るようにしたりするといいですよね。

処理を高速化するScreenUpdating


マクロは基本的には実行すると実行中もエクセルが自動的に動いており、それを「見る」ことができますが、普通は結果だけ出て間の処理を見せる必要はないはずです。というか、この間の処理中が見れるような状態は非常にマクロの実行が「遅く」なります。その為、今回紹介するScreenUpdatingを使って画面の更新を見せないようにします。

あくまで見せないだけで、処理自体は実際に動いています。

ScreenUpdatingはApplicationオブジェクトのプロパティです。ちょっと考えるとわかりますが、エクセルの画面の更新はエクセルそのものが持っている機能です。ですので一番基底のApplicationオブジェクトにあるわけです。
このプロパティにはTrueかFalseを設定します。Flaseで更新しない。Trueで更新する。になります。

ですので・・・

Application.ScreenUpdating = False

というように書いてしまいます。非常にシンプルです。
これだけでかなりマクロの処理は高速化します。
簡単ですがPreStartの機能をまとめると・・・

  • ボタンを非活性にする(押せないようにする)
  • マウスポインタを砂時計にする(処理中です)
  • エクセルの画面更新をしないように設定する

この3つをmdlStartEnd.PreStartでやってもらいます。
ではコード。ちゃんとエラー処理も入れましょう。

''''''''''''''''''''''''''''''''''''''
' 事前処理のメソッド
' - ボタンを非活性にする(押せないようにする)
' - マウスポインタを砂時計にする(処理中です)
' - エクセルの画面更新をしないように設定する
'
''''''''''''''''''''''''''''''''''''''
Public Sub PreStart()
On Error GoTo cmnErr
    
    ' ボタンを非活性にする
    shtScore.btnOutput.Enabled = False
    
    ' 入力フォームも非活性にする
    shtScore.txtSyussekiNumber.Enabled = False
    
    ' マウスポインタを砂時計に
    Application.Cursor = xlWait
    
    ' 画面更新をしないように設定
    Application.ScreenUpdating = False
    
    'マクロ終了
    Exit Sub
    
cmnErr:
    MsgBox "エラーが発生しました" & vbCrLf & _
            "エラー番号:" & Err.Number & vbCrLf & _
            "エラーの種類:" & Err.Description, vbOKOnly + vbExclamation, _
            mdlDefine.ERROR_WINDOW_TITLE
    'マクロを終了する
    Exit Sub
End Sub


以上です。エラーの処理は以前にもやってますよね。ボタンやテキストフォームを非活性にするには「Enabledプロパティ」を使います。これもTrueかFalseを設定すればいいのです。マウスポインタを砂時計にするのも、Applicationオブジェクトにある「Cursorプロパティ」を使います。カーソルプロパティです。xlWaitはVBAで用意されている定数で、数字が入ってるのですが、具体的にどんな数字が入っているかを覚える必要はありません。数字で覚えたくないのでちゃんとxlWaitという言葉が設定されているのです。
こういったところは文系の人の方が得意かと思います。こうして見て見ると、分かると思うんですが・・・

数字がまったくと言っていいほど出ていません。


VBAはプログラミング「言語」ですので、なるべく言葉で書けるようにできているんです。当たり前ですが・・・文系でもできると言っているのはそのためです。プログラムで数字を使うのは人間です。しかしそれも言葉で置き換え(定数定義)することで、言葉で書けるようになります。

プログラミングは言葉です。私たちとPCとをつなげる言葉です。

あまりかまえないで、是非言葉と思って見て見るときっと違った気持ちで見れると思います。

終了の処理をする


では今度は終了の処理です。簡単です。「今と反対のことすればいい」ということです。さっそくコードです。

''''''''''''''''''''''''''''''''''''''
' 事後処理のメソッド
' - ボタンを活性にする(押せるようにする)
' - マウスポインタを普通ににする
' - エクセルの画面更新をできるように設定する
'
''''''''''''''''''''''''''''''''''''''
Public Sub PreEnd()
On Error GoTo cmnErr
    
    ' ボタンを活性にする
    shtScore.btnOutput.Enabled = True
    
    ' 入力フォームも非活性にする
    shtScore.txtSyussekiNumber.Enabled = True
    
    ' マウスポインタを砂時計に
    Application.Cursor = xlDefault
    
    ' 画面更新をしないように設定
    Application.ScreenUpdating = True
    
    'マクロ終了
    Exit Sub
    
cmnErr:
    MsgBox "エラーが発生しました" & vbCrLf & _
            "エラー番号:" & Err.Number & vbCrLf & _
            "エラーの種類:" & Err.Description, vbOKOnly + vbExclamation, _
            mdlDefine.ERROR_WINDOW_TITLE
    'マクロを終了する
    Exit Sub
End Sub


これで終了です。さっきのFlaseがTrueになって、xlWaitがxlDefaultになっただけです。
後は、これをメインの処理に組み込みましょう。

Sub Main()
'一般のエラーをキャッチする
On Error GoTo cmnErr
    
    ' 事前の処理をする
    Call mdlStartEnd.PreStart
    
    ' エラーのチェックをする
    '''' エラーならマクロを終了する
    
    ' 成績表を読み込む
    
    ' 成績表を出力する
    
    ' 事後の処理をする
    Call mdlStartEnd.PreEnd
    
    'マクロ終了
    Exit Sub
    
cmnErr:
    MsgBox "エラーが発生しました" & vbCrLf & _
            "エラー番号:" & Err.Number & vbCrLf & _
            "エラーの種類:" & Err.Description, vbOKOnly + vbExclamation, _
            mdlDefine.ERROR_WINDOW_TITLE
    'マクロを終了する
    Exit Sub

End Sub


簡単ですね。Callで呼び出しているだけです。恐ろしく簡単です。以前に作ったメインの処理と是非比べてみてください。メイン処理が非常に簡単であることがわかると思います。

次回は、エラーのチェックですね。


今日はここまで!


かしこ