クリエイティブを楽しむ新メディア 牛の歩みで更新中!クリエイティブを楽しむ新メディア 牛の歩みで更新中!
プログラム・IT
マクロにコメントを書こう! ~VBAで"脱コピペ"プログラミング①
2023年5月7日(日曜日)

プログラミング初心者としての階段を一歩ずつのぼっていくため、さっそく「脱コピペ」の道を進み始めましょう。

最初にやることは、「これまで作ったマクロのコードにコメントを書く」ことです。

やること①「これまで作ったマクロのコードにコメントを書く」

コードにコメントを書くことは大切です。

わざわざ難しい「仕様書」を書かない、ちょっとしたマクロのようなプログラムではメモを書いておくことでその代用にもなり、あとでいろいろ役に立ちます。

ところがネットで公開されているようなマクロは、記事としてその内容を紹介しているぶん、コードのなかにはコメントがないものが少なくありません。また、紹介記事では大雑把な説明しかしておらず、コード1行ごとの意味までは説明してくれないことがほとんどです。

そこで、まずは過去に使ったものなど、手元にあるマクロにコメントをつけてみることから実践してみることにしましょう。

ただし、コードをきちんと読めなければコメントをつけることは簡単ではありません。ですから、まずはコメントをつけながら、自分がそのマクロの内容を「いかに理解していないか」を実感することになります。でも、それでいいんです。

コードを見ても、なにをやっているのかわからない場合は、無理せずに「?」とだけ書いておけばOKです。

なお、いくつものマクロを扱ってきた場合は、それらすべてにコメントをつける作業はあまりにタイヘンです。「今後も使いまわしそうなもの」に限って試しにコメントをつけてみるのが良いでしょう。

ためしにやってみる

なお、読者のみなさんに言うだけで自分ではやらないのはズルイですから、筆者自身もやってみることにします。とはいえ自分で書くコードにはいつも細かくコメントを付けているので、あまりやることがありません。

そこで今回は、流行りの(?)AIにコードを書いてもらって、それにコメントをつけてみることにします。

Bingのチャットで「VBAで1000以下の素数を抽出するコードをください」とお願いしたところ得られたコードが次のものです。

Sub PrimeNumbers()
 Dim i As Long, j As Long
 Dim isPrime As Boolean
 For i = 2 To 1000
  isPrime = True
  For j = 2 To i - 1
   If i Mod j = 0 Then
    isPrime = False
    Exit For
   End If
  Next j
  If isPrime Then Debug.Print i
 Next i
End Sub

ただし、このマクロをいきなり実行しても何が起きているかわからないかもしれません。実行してもメッセージボックスが表示されるわけでもなく、一見、画面に何も変化がないからです。

ネットで検索して自分の目的に合致したマクロをゲットしても、具体的にその結果がどこに現れるかはコードを読み解かないとわからない、ということは意外とよくあることです。

さっそく、コメントをつけながら中身を見ていきましょう。

'1000以下の素数をイミディエイトウィンドウに表示するマクロ
Sub PrimeNumbers()
 Dim i As Long, j As Long
 '(変数 i=素数か確認する数値・被除数,j=確認のために割ってみる数値・序数)
 Dim isPrime As Boolean
 '(変数 素数か否かの結果 True=素数である,False=素数ではない)

 '被除数ループ
 For i = 2 To 1000 '2から1000までの数値を順に判定していく

  isPrime = True '最初に判定対象の被除数を「素数である」と仮定しておく

  '除算ループ
  For j = 2 To i - 1 '被除数より小さい序数で順に除算していく
   If i Mod j = 0 Then '剰余が0なら割り切れたということ
   '(割り切れた=非素数の場合の処理)
    isPrime = False '素数ではないよ!
    Exit For '除算ループを抜ける
   End If '非素数の場合の処理を終了
  Next j '除算ループ終了、次の序数へ

  If isPrime Then Debug.Print i
  '(isPrime=Trueなら素数、イミディエイトウィンドウに表示)

 Next i '被除数ループ終了、次の被除数へ

End Sub 'マクロ終了

結果から言えば、抽出された素数は「イミディエイトウィンドウ」に表示されます。コード終盤の"If isPrime Then Debug.Print i"がその部分で、"debug.print i"によってイミディエイトウィンドウへの出力(表示)が実行されています。

この「イミディエイトウィンドウ」は、マクロの動作確認時にその動作状況を表示してデバッグ(不具合修正)の手助けとするものですが、あまり初心者が活用するものでもないうえに表示をOFFにできるので、みなさんのVBA環境では表示されていない場合がありえます。

AIが生成したこの例のように、目的とする動作の結果をとりあえずイミディエイトウィンドウに表示するのはよくあることです。ゲットしたマクロを実行してみたけど何も起きない……と思ってマクロを破棄してしまうのは早計というもの。イミディエイトウィンドウは大切なものなので、表示されていない場合は[表示]メニューで[イミディエイトウィンドウ]のチェックをONにしておきましょう。

特に重要なポイント3つ

なお、今回はお題が簡単だったので、すべての行にコメントを付けることができました。ただ、いつもそううまくいくとは限りません。

前述のように、わからなければコメントを「?」にしておけばいいのですが、次の3点は特に重要なので面倒くさがらずにできるだけコメントをつけるようにしましょう。

①マクロの動作内容

このマクロは"Sub PrimeNumbers"の記述から始まっていますが、AIが付けた「PrimeNumbers」というマクロ名自体がかなりわかりにくく、あとで見返したときに「これ、なんだっけ?」となりかねません。

まずは「このマクロの動作が何なのか」をコメントとして書きたいところです。

今回の例ではまず「1000以下の素数を表示するマクロ」と書きましたが、先程読み取ったようにイミディエイトウィンドウに表示するという具体的な動作がわかったので、あとから「1000以下の素数をイミディエイトに表示するマクロ」に書き換えました。

最初は動作の内容がよくわからなくても、あとでわかってきたらコメントを書き換えていくことも大切です。

②変数宣言

次に、マクロのなかで宣言されている「変数」について、それぞれの用途を書いてみましょう。上記の例では"Dim"によって"i"、"j"、"isPrime"の3つの変数が宣言されています。

変数についてのコメントも、もちろんわかる範囲でOKです。

ただ、できれば「数値」とか「文字列」という分類(変数の型)だけでも書いておくようにしましょう。動作のコメントというよりも「日本語訳」でしかないのですが、英語前提のプログラミングにおいて母語でわかるようにしておくことは意外と助けになります。

③IFの終わりと始まり

"If"で始まり"End If"で終わる、「指定条件を満たした場合の処理」の始まりと終わりをコメントによって明確にすることも重要です。

特に"If"の始まりはコード自体に指定条件の内容が書かれている一方で、"End If"は「何が終わりなのか」がわかりません。IFによる条件判断は複雑化しやすいので、"End If"に「何が終わるのか」を書いておくとコードが見やすくなり、あとで他のマクロに流用したり、自分なりの拡張をするときに便利です。

もちろん、IFの指定条件そのものを理解できない場合もあると思います。そういう場合は、"If"に「IFその1開始」、"End If"に「IFその1終了」と書くだけでもOKです。

わからないポイントを次につなげていく

初心者がコードにコメントを書いてみることで一番大切なことは、自分が何をわかっていて、何をわかっていないかを把握することにあります。最初はなにもわからなくて「?」だらけになっても全然問題ありません。

次に、もうひとつ別のマクロにコメントをつけてみたときに「また変数のことがわからない」とか「またIFの条件がわからない」という感じで「また」と思えたら、それがステップアップの第1歩となります。よく出てくることだからちょっと調べてみよう、という気持ちになりますよね。

そうして、山ほどある「?」をひとつひとつ書き換えていくことでプログラミングの知識を深めていけるのです。

(つづく)

コメントを記入

メールアドレスが公開されることはありません。 が付いている欄は必須項目です