VBAの技術者とはかなり多く話をしてきたのですが、「冗長でも基本に忠実に書いたほうが良い」と思っている人が多い気がしました。
自分も長年VBAの案件をやってきたため、そのような考えを持っていました。
VBAでこのような考えが浸透している理由としては、親オブジェクト省略の危険性がある場合も多いからだと思います。
例えばですが
Application.ThisWorkBook.WorkSheets
ThisWorkBook.WorkSheets
WorkSheets
上記3つは同じような感じで使えますが、1番下のWorkSheetsは若干危険な使い方です。ActiveWorkBookが親となるからです。
仮に、別のワークブックからのコールが実施された場合にActiveWorkはこのブックとは限らないため、不具合に繋がる可能性があります。
上記のようなミスを回避するためにも、基本的に固くきっちり書くという文化なのかもしれません。
他言語では省略記述を推奨されることが多い
例えばjavaScriptなどですが、最近は無名関数などを使用することが多くなってきました。
またJava等においても「三項分岐でいけるところはIF文で書かないでよ」などとレビュー指摘をもらうことが多いです。
VBA界隈でIIFとか使ったら、むしろ「三項分岐は使わないでよ」と指摘を貰ってしまいそうな気もしますw
正直、面倒でも冗長な記法をするというのは時代遅れな気がします。
こういった経験から、自分の中で特にコード規約がない場合は積極的に省略記法を使おうという気持ちになりました。
そこでオススメの省略について記載したいと思います。
If文が1行だけの時、End Ifは省略
記事のタイトル名にもしたIf文の省略記法です。
If str = "" then str = "1"
上記は、End Ifがないためエラーになる…と思われるかもですが特に問題ありません。
下記のように書くのとどちらが良いでしょうか。
If str = "" then
str = "1"
End if
今は、どう考えても前者が良いかと思っています。理由としては
- やりたいことは1つだけなので1行で書くほうが自然
- ネストを書くと読みにくいし、処理のまとまりも見にくくなる
処理のまとまりも見にくくなるとは…
str = sh.cells(1,1).value
If str = "" then str = "1"
sh.cells(1,2).value = str
Open "C:\test.txt" For Input As #1
str = sh.cells(1,1).value
If str = "" then
str = "1"
End if
sh.cells(1,2).value = str
Open "C:\test.txt" For Input As #1
str = sh.cells(1,1).value
If str = "" then
str = "1"
End if
sh.cells(1,2).value = str
Open "C:\test.txt" For Input As #1
セルの値を操作した後に、全く別のファイル読み込み処理をする時、処理の間に1行入れたくなります。
その場合、If文で3行で書いてあると上3つと下1つが違うということが読みづらい気がしませんか。
1番上の省略記述が一番見やすくて良いと思います。
単純代入の場合はIIFを使う
やはり三項分岐もIf分だと長くなるため、IIFも積極的に使うべきだと思います。
理由としては、前述したEndIfの省略と同じで一行で書くのは圧倒的に読みやすいからです。
IIFを否定する意見として、「IIFはTruePartもFalsePartも実行されるバグが有る」という意見があります。
これについては、以下のブログを読んで完全に腑に落ちたので、IIFは危険だという認識から脱却することが出来ました。
要は「IIFは制御文ではなく関数。関数に引数に渡せば評価されるのは当然」ということです。
上記をしっかり理解できれば、安全に使えるかと思います。
For Nextの後ろの添字は不要
For i = 0 to 10 step1
next i
上記については以下のように省略することが可能です。
For i = 0 to 10
next
そもそもSTEPを書く人はいない気もしますが…、Nextの後ろの添字を書く人は多いのではないでしょうか。
これ、仮に変数の値が変更になった時に割と面倒じゃないですかね。
逆に省略しないメリットとしては、for文のネストが深くなった時にわかりやすいというものがあるかと思います。
For i = 0 to 10
For j = 0 to 10
next j
next i
For i = 0 to 10
For j = 0 to 10
next
next
ただ、ちゃんとインデント揃えれば、どちらもわかりやすいので問題ないかなあと思います。
まあ上記のnextとnextの間に100行くらいコードがあったらわからなくなるかもしれませんが…、稀なケースだと思うので基本は省略していこうかなと思います。
コメントを残す