マクロの編集・デバッグ

わずかな知識で VBA!

マクロの編集
デバッグ


 

マクロの編集デバッグ



  マクロ編集の基礎知識

   Excelでマクロを記録したら、次に、そのマクロの編集が必要になります。

  記録したマクロの編集をして汎用性を持たせ、繰り返し作業や、
  条件分岐等のソースコードを加えていきます。

  マクロの編集作業は、とても重要な、最も頻繁に行う作業です。

  その分、ちょっとした知識が必要になり、
  はじめての方には、取っ付きが悪いかもしれません、

  でも、ガマンして、最後まで、読んでください!

  
  マクロはExcel VBEの「コードウィンドウ」に書けばよいということが、

  なんとなくわかったと思います。
   
     ExcelのVBEは、Excelとは別のプログラムみたいだ!ということも、

  なんとなくわかったと思います。

   また、それ以外のことも、何となくだと思います。

  ここで一度、マクロ編集の基礎知識について整理していきましょう。
  後半では、デバッグについて説明します。
      

わずかな知識で
VBA!





    
         

  この操作で、編集したいマクロのコードウィンドウが開き、画面に表示されマクロの編集が行えます。

    Sub 式の入力()
       
'
       ' Macro1 Macro
       ‘マクロ記録 :2007/*/* ユーザー名:** **

    
       
'
       Range("E6").FormulaR1C1 = "=ROUND(RC[-2]*RC[-1],2)"
       Range("E6").NumberFormatLocal = "0.00_ "
       Range("E6").Font.FontStyle = “太字”
       
    End Sub



   はじめと終わりに合図が必要

   一番最初の行にある

      Sub 式の入力()

   というのが、「マクロの名前」と「式の入力」というマクロが、ここから始まることをExcelに知らせる合図です。

   その下の「」(シングルコォーテーション)のついた行はコメント行で、
   Excelのバージョンによって違ってきますが、自動記録のときに記入された項目です。

   Excelはこの「」以降は無視します。

    その下の

       Range("E6").FormulaR1C1 = "=ROUND(RC[-2]*RC[-1],2)"

   から3行がマクロ(プロシージャ)の本体です。

   マクロの編集とは、この部分を編集することを指します。

   VBAでは、セルのことをRangeで表します。

       End Sub

   が、このマクロの終了をExcelに示します。

   マクロは

   Sub マクロ名() から始まって
   End Sub で終わる英語を基にした記号の並びなのです。

   実際の操作では、Sub マクロ名まで入力し、Enterキーを押せば、End Subは自動的に記述されます。

   Sub、Range、FormulaR1C1など、マクロのためにあらかじめ用意されている単語を「キーワード」と呼びます。


  操作は文字で記録される!

    マクロの記録を開始すると、キーボードやマウスによるあなたの操作が、
   英語に似た文字で命令群に記録されます。

    その記録された命令群に名前を付け、その名前をExcelは識別して、そのマクロを実行します。

   この文字だけの命令群をソースコードと呼びます。


   あなたが普段、手作業で行っている操作は、「マクロの記録」がプロシージャという命令群に変換してくれます。

    つまり、あなたが手作業でできる操作のマクロは、簡単に作ることができます。

   逆を言えば、知らない命令文(ソース)でも、
   手作業で行えれば「マクロの記録」が教えてくれます。

   あとは、「マクロの記録」で記録できない部分を編集で加えていきます。

 
    マクロを実行するとき、Excelは記録された文字の命令を1つずつたどりながら、
   そこに書かれた通りに実行します。


   途中に無駄な操作があっても、書かれた通りにしか実行しません。

   無駄な操作を省いたり、絶対参照を相対参照に変更したりする編集作業だけでも、
   実用に使えるマクロはできあがります。


   VBEの操作は、基本的にワープロと同じですが、半角文字で入力します。

  全角の日本語は、マクロの名前のほかは、
  データ(文字列)としての取扱のみで、その場合は、” “ ダブルコーテーションで囲んで使用します。


  オブジェクトとプロパティ

      Range.(“A5”).Value = “明日の天気”

   上のソースコードは、セル(“A5”)に「明日の天気」と入力します。

  この例でのVBEの構文は

     オブジェクト.プロパティ = プロパティ値

   となっています。

  
   オブジェクトとは、対象物を指し、プロパティとは、物の特製(設定値)を指します。

      Range.(“A5”).Value = “明日の天気”

    は、セルA5の内容(値)は「明日の天気」と読めます。

   Valueプロパティは、FormulaR1C1プロパティとほぼ同じで、「値」を意味します。


  メソッドと引数

   VBAがオブジェクトに対して行う操作をメソッドと呼びます。

      Application.Quit

     エクセルを終了します。

  メソッドの種類によっては、細かい指示が必要になります。その指示を「引数」と呼びます。

      Worksheets.Add After:=WorkSheets(2)

   ワークシートを「Sheet2の右側」に追加という具合で、この場合の
 
      After:=WorkSheets(2)

   が、引数です。


  編集作業でのマウス操作
   

  

   Module1を選択しただけではModule1のコードは表示されません。
  必ず「コードの表示」ボタンを押してください。

  コードウィンドウ各部の名称

      

  コードウィンドウ内でも、ExcelやWordと同じように、ドラッグや、Shiftキーを使っての範囲選択、
  右クリックからの操作メニューの表示も行えます。

  単語内でのダブルクリックも、Wordと同じように単語全体が選択されます。

   ただし、Wordなどのワープロと違い、VBAのコードウィンドウでキーワードを入力するときには、
  アルファベットの大文字、小文字を意識しなくても、スペリングが正しければ入力後に自動的に変換されます。

  入力後に先頭の文字が大文字に自動変換されない場合は、スペリングミスということです。


  変わった使い方をする「Tab」キー

  VBEには、入力するときに構文を自動的にヒントとして表示する機能があり、「自動メンバー表示」と呼びます。

   また、オブジェクトの後に「.」(ドット)を入力すると使用できるメソッドの一覧が表示されます。
  その一覧からメソッドをクリックして「Tab」キーを押すと選択したメソッドが入力されます。

  この時に「Enter」キーを押すと、入力後にカーソルが次行に移動してしまいます。

  状況によって使い分けてください。

  もちろん、「Tab」キーには、1回押すとインデントが設定されるという機能もあります。

  また、「自動メンバー表示」は、オートワードセレクト機能もあって、一覧が表示されてもそのまま文字を入力すると
  その文字に対応した一覧が表示されます。


  コンテナという概念

  子供のころに、口の端を指で広げながら「机の上の文庫」と言う遊びを思い出しましたが、
  この場合の、「文庫」の場所を示す「机の上」の方が、文庫より上位にあると考えます。

  これをエクセルVBA風に書くと

     机の上.(ドット)文庫    です。

  エクセルも、ワークブック、ワークシート、グラフシートや、セルなどのオブジェクトがありますが、
  エクセル自体もオブジェクトの一つです。

  それらには、階層があってセルのすぐ上位に位置するのが、ワークシートであり、
  ワークシートのすぐ上位にあるのがワークブックです。


  それぞれのすぐ上位のオブジェクトをコンテナと呼びます。

  英語では「容器、入れ物」という意味ですが、貨物列車のコンテナ同様に、
  いくつも繋げて場所を限定します。

  Workbooks(“マクロのテスト.xls”).Worksheets(“sheet1”).Range(“A5”).Value = "今日のニュース”

  このように、オブジェクト同士を貨物列車の様に連結していくと、開いている別のブックのセルにも入力できます。


  この作業は、手作業の操作ではできません。
  手作業で行える操作は、アクティブになっているシートにしかできないからです。


  マクロの記録でこの操作を記録すると次の様になります。

      Windows(“マクロのテスト.xls”).Activate

      Sheets(“sheet1”).Select

      Range(“A5”).Select

      Range(“A5”).Value = “今日のニュース”


  どうですか、最初のプロシージャと比べて無駄を感じませんか?


  また、エクセルでブックやシートなどをアクティブにする処理は、以外に時間がかかる処理だそうですが、

  オブジェクトをアクティブにする必要のないステートメントは、
  処理時間が短く済むそうです。

  
  「マクロの記録」だけで踏み止まっていると、このような無駄な部分が見えてきません。
  知らなければそれで済むのですが、
  もうこのことを知ってしまったあなたは、VBAへの学習意欲が沸々と沸いてきたと思います。


  コレクション

  同一種類のオブジェクトの集合体のことをコレクションと呼びます。

  一つのオブジェクトの場合「Workbook」。「Worksheet」と英語の単数形ですが、
  同一の複数のオブジェクトだと「Workbooks」、「Worksheets」のように複数形になります。

  ただし、例外として「Range」のようなものもあります。

     Worksheets(“sheet1”).Select

     ワークシートコレクションの中のシート1を選択する。

  また、単一のオブジェクトだけではなく、コレクション全体を同時に操作するステートメントもあります。

     Workbooks.Close

     開いているブックすべてを閉じる

  などが、そうで、これを単一形にすると

     Workbooks(“マクロのテスト.xls”).Close

  開いているブックのうち「マクロのテスト.xls」だけを閉じる


  というふうに、どのコレクションも後ろに( )を付け、その中で単一のオブジェクトを指定します。

  コレクションはエクセルに参照させる場所を指示するものですが、
  エクセルの決まりごとと覚えた方が、理解が早いかもしれません。


  構文エラーを見つける「プロジェクトのコンパイル」

  構文エラーのチェック

    VBEの画面上にあるツールバーの「デバッグ(D)」をクリックして「VBAProjectのコンパイル(L)」をクリックします。

        


    編集したマクロに文法的なエラーがあるかどうかが分かります。
    ただし、このチェックは、最初のエラーで止まるので、修正したあとに再び実行し、
    正常に終了するまで、繰り返します。

    このチェックでわかるのは、あくまでもVBAの文法的なエラーのチェックだけです。
    正常に動作するかどうかは別問題です。

  Option Explicitステートメント

    このステートメントを各Moduleの先頭で宣言すると、宣言した変数以外は使用できなくなります。
    つまり、実行時にエラーと判断されるわけです。

    また、「プロジェクトのコンパイル」でスペリングミスをした変数を見つけることができ、大変便利です。

    新しくモジュールを作成するたびに、
    「Option Explicit」ステートメントを自動的に挿入されるようにすることもできます。
 
    VBEのメニューから「ツール(T)」⇒「オプション(O)」を選択し
    表示されたダイアログボックスの「変数の宣言を強制する(R)」チェックボックスにチェックマークを入れます。

      


  エラーとデバッグ

    簡単なものは別として、ある程度複雑な処理を行うプロシージャですと、
    1回目の実行時に完璧に動作することは、滅多にありません。
 
    何かしらのエラーがでるのが普通(私ダケ? どうでもいいですよ。でもそんなの関係ない、オッパピー)です。
 
    「VBAProjectのコンパイル」で引っかからなくても、実行してみて初めて見つかる「実行時エラー」や、
    予定した動作と異なる結果となる「論理エラー」は、必ず発生します。そういうものです。

 
    実行時のエラーの場合は、下の図のようなエラーメッセージが表示されます。

     

    
     このダイアログボックスの「デバッグ(D)」をクリックすると、
     コードウィンドウのエラーが発生した行を黄色くし、インジケーターの矢印が表示されます。


   
 
  
    ただし、必ずしも示された行の中にエラーの原因があるとは限りません。
    その近辺の行や、変数の指定間違いなどに原因がある場合もあります。

    また、予定した動作と異なる結果となる論理エラーの場合は、
    このような間違っている箇所は教えてもらえず、後述する方法で捜します。

    プログラムでは、記述間違いや、それらのために現れる意図しない動作を「バグ」と呼びます。
    Bugとは、小さな虫のことですが、これを取り除く作業を「デバッグ」と呼んでいます。


  実践的なデバッグ方法
  
    1. 論理エラーの場合、まず、どの辺で起きているエラーなのかを予想します。

    2. VBEには、指定した行まで実行したら一時実行を中止させる「ブレークポイント」というものがあります。
      見当を付けた場所に、ブレークポイントを設定して、実行してみます。
 
      設定方法は、いたって簡単で、VBEの画面で、設定したい行を選択してから「F9」キー、
      または、ツールバーの「デバッグ(D)」から 「ブレークポイントの設定」をクリックすればOKです。
 
      解除の場合も同じ作業で行えます。

    3. マクロを実行すると、ブレークポイントを設定した行で実行が中断されるので、
      そこまでの作業に誤りがないかを確認します。
 
      このときに、中断されたプロシージャ内で使用している変数、Value値や、
      Setステートメントで参照したオブジェクトの内容は、
      マウスカーソルをその語句の上に持っていくと表示されます。
 
      続行させるには、VBEツールバーの「Sub/ユーザーフォームの実行」ボタンをクリックします。
      実行を終了させる場合は、「リセット」ボタンをクリックして終了させます。

       

       ブレークポイントは、一度に何箇所でも設定することができるので、怪しいと思われる箇所に設定し、
       動作確認を行いながら実行をしていくとエラーの出現する範囲が大体わかります。

     4. それでも、まだ、はっきりとわからない場合は、エラーの出現する少し前にブレークポイントを設定します。
 
       そして、今度は「F8」キーによりワンステップづつ実行してゆき、
       プログラムが自分の思惑通り動いているか確認しながらバグを探していきます。

       この作業も、ツールバーの「デバッグ(D)」から「ステップイン」をクリックすることで可能です。


  ウォッチ式の追加

     こちらも、「ブレ−クポイント」と似たような機能ですが、
     ある変数の内容がどう変わっていくかなどを調べるのには、便利です。

     マウスカーソルで、変数の一部を範囲選択します。

     ツールバーの「デバッグ(D)」から「ウォッチ式の追加」をクリックすると、
     下の図のダイアログボックスが表示され、左下の項目の中から「式の内容が変化したら中断」を選択します。

             


     モジュールウィンドウの下部に「ウォッチウィンドウ」が表示され、
     プログラムを実行し、指定した変数の内容が変化すると中断(ブレーク)します。

     ウォッチウィンドウで変数の内容が確認できます。
     VBEツールバーの「Sub/ユーザーフォームの実行」ボタンをクリックして続行すると、
     その変数の内容が変化する度にブレークします。

     ほかにもありますが、これだけ知っていれば充分(?)です。

     デバッグ時には、Excelの画面とVBEの画面を2つ同時に表示した方が、作業が行い易くなります。

     また、作成時にはわかっていたことも、2,3ヶ月経つと忘れてしまうため、
     後で行う修正や、カスタマイズするときのために、
     プロシージャはわかり易く見やすい物にする工夫が必要です。

     作成時に考えたことは、「’」を使用してコメント行として残すとか、
     作業内容を見出しとしてコメント行として記述するなどです。
 
     ステートメントの中は、1段下げて記述を始めるのもそのためです。
     次に見たときに、目が拒絶反応を示すようなプロシージャは避けましょう!

        


  HOME       TOP

  マクロで何ができる?   ユーザーインターフェース    マクロの記録   マクロの登録
 
  イベントについて      マクロの編集とデバッグ     ゲームで覚えるVBAプログラミング
 
  オブジェクトの操作     セルの操作            MsgBox関数・InputBox関数
 
  変数の型           ヘルプの活用          イミディエイトウィンドウ  
 
  Withステートメント      Setステートメント
 
  条件分岐のステートメント   If Then Else,Select Case
 
  繰り返しのステートメント   Do Loop
 
  繰り返しのステートメント   For Next
  
  ダイアログボックスを作ってみよう1             ダイアログボックスを作ってみよう2 【実践編】
  
  ActiveXコントロール   各コントロールのプロパティ      文字列の操作        Endプロパティ
  
  リンク・検索   相互リンク    マイプロフィール       YouTubeの部屋 

Copyright (C) わずかな知識でVBA! All Rights Reserved