2023年1月25日水曜日

【マクロVBA】VBA_TIPS-03 マクロの可読性

社内ツールの問題点 

よく社内DXや社内ツール、社内マクロ等で問題となる以下の事象があります。

・前任のSEが作ったツールのドキュメントが無い
・前任が作ったツールを改修したいが解読が難しい


社内ツール作成後、きちんと仕様書を残してくれれば後任は助かるのですが、たいていの場合作って「はい!終わり!」がほとんどだと思います。

また社内SEが社員ならまだ人事異動しても社内に残っているので聞ける可能性もありますが、社内SEが派遣社員だった場合、契約満了後は聞くことすらできなくなります。
実際、過去に私のいた部署で大規模なシステムを構築した際に、ドキュメントが無いままSEがいなくなり、そのシステムを改修をするのに3名の派遣SEを雇いましたが結局解読できずじまいだった。
そんなことも往々にしてあるようです。

作った本人は「なんでSEなのに読み解けないの?」だと思いますし、解読する側は「なんでこんなわかりづらい書き方するの?」だと思います。

それぞれのSEの技術の差があれど、仕様書等のドキュメントを残さないのであれば可読性の高い書き方(誰でも読めばわかる書き方)をすべきだと思います。


なぜ可読性が低いのか?

ネットに載っているコードのコピペ

プログラムを書く際に、ホームページ等のコードを参考にすることも多いかと思います。

ただプログラムを書く人はたいてい書き方にクセが出てくるので、同じようなコードのようでも変数の使い方や関数の使い方が微妙に違ったりします。
ネットのコピペを行うと、いろいろな人のクセが入り混じったコードになるので解読が難しくなります。

例えば以下のようなコードがあったとして、メッセージボックスに表示されるのはどれだかパッと出ますか?

Sub TEST()

Range("F5").Value = "鈴木"
Range("V5").Value = "佐藤"
Range("M5").Value = "田中"

MsgBox Cells(5, 13).Value

End Sub








正解は

正解は田中


きちんと見ればわかるのですが、RangeとCellsが混在しているだけでも少し混乱しませんか?
このようにネットのコピペばかり使うと統一感が無くなってしまうので、可読性は低くなります。


ドキュメント作らないくせに効率重視

プログラムに慣れてくるとどうしても効率を優先してしまう場合があります。

例えばこんなデータがあったとして

会員情報

以下のように1行ずつデータを処理しある要素をメッセージボックスに表示させるとします。

Sub TEST2()

Dim Arry() As String
Dim y As Long
Dim x As Integer

ReDim Arry(8)
For y = 2 To 2
    For x = 1 To 9
        Arry(x) = Cells(y, x).Value
    Next x
    MsgBox Arry(5)
Next i

End Sub
このとき表示されるのは”2023”ですが、この2023は対象期間(前)?それとも対象期間(後)?どちらでしょう。

こんな感じでドキュメントを残してくれればすぐわかるのですが、

配列名インデックス内容
Arry()0会員番号1
1会員番号2
2会員番号3
3会員番号4
4会員氏名
5対象期間(前)_年
6対象期間(前)_月
7対象期間(後)_年
8対象期間(後)_月

ドキュメントが無い場合はやはり解読に時間がかかります。

このようにドキュメント作らないくせに効率を求めたコードを書くと、後任がすごく困ります。


可読性を高くするには

変数の仕様書だけでもあると、SEは解読にさほどの時間がかかりませんが、それが無い(もしくは作らない)のであれば、これからのSEはたとえクソコードと言われようとも初心者でもわかるコードの書き方をすべきだと思います。

変数の統一

できるだけ変数はルール化しておくと理解が早くなります。

たとえば

Integer型ならintHogehoge
String型ならstrHogehoge

のように変数名の前に型の略称を入れておくと変数を見ただけで「これは文字列型」と理解が早くなります。

また、周回用のカウンタではiやcがよく用いられますが、Excelマクロで縦横周回させるようであれば縦y横xと誰もが学生時代に習ったxyを使用するとより理解度が増します。


たとえ行数が増えても、簡単な書き方を心がける

昔のPCはCPUやメモリが貧弱だったので、より効率よくプログラムを書く必要がありましたが、今の時代オフィス業務をやるにしては高性能なCPU、オフィス業務では絶対使いきれないメモリ容量と正直PCの性能が上がりすぎてあまり効率的に書く必要性が無くなってきたと思います。

例えば↑で書いた

Sub TEST2()

Dim Arry() As String
Dim y As Long
Dim x As Integer

ReDim Arry(8)
For y = 2 To 2
    For x = 1 To 9
        Arry(x) = Cells(y, x).Value
    Next x
    MsgBox Arry(5)
Next i

End Sub

ですが、

配列名インデックス内容
Arry()0会員番号1
1会員番号2
2会員番号3
3会員番号4
4会員氏名
5対象期間(前)_年
6対象期間(前)_月
7対象期間(後)_年
8対象期間(後)_月

があれば解読は簡単ですが無い場合はやはり解読に時間がかかります。

しかし以下のように記載すると

Sub TEST3()

Dim y As Long
Dim str会員番号1 As String
Dim str会員番号2 As String
Dim str会員番号3 As String
Dim str会員番号4 As String
Dim str会員氏名 As String
Dim str対象期間_前_年 As String
Dim str対象期間_前_月 As String
Dim str対象期間_後_年 As String
Dim str対象期間_後_月 As String

For y = 2 To 2
    str会員番号1 = Cells(y, 1).Value
    str会員番号2 = Cells(y, 2).Value
    str会員番号3 = Cells(y, 3).Value
    str会員番号4 = Cells(y, 4).Value
    str会員氏名 = Cells(y, 5).Value
    str対象期間_前_年 = Cells(y, 6).Value
    str対象期間_前_月 = Cells(y, 7).Value
    str対象期間_後_年 = Cells(y, 8).Value
    str対象期間_後_月 = Cells(y, 9).Value
    MsgBox str対象期間_前_年
Next i

End Sub

変数の内容も、メッセージボックスに表示される内容も一目瞭然です。


仕様書がきちんとあれば正直効率よくコードを書いてドキュメントを残す。これが一番きれいだと思いますが、社内SEの大きな利点は口頭で

社員「こういうの作ってほしい」
SE「できましたー」

だと思うので、仕様書を必ず作る必要はないと思いますが、ならばぜひコードの書き方を工夫するのも良いと思います。


↓よろしければクリックをお願いします!

TOPページに戻る


■関連ページ

【マクロVBA】VBA_TIPS-02 Select文とIf文


0 件のコメント:

コメントを投稿