日本企業が業務効率化の手段として、ExcelやWordを使うようになったのは90年代半ばです。爆発的な浸透がされたのは、Windows95が販売されたあとです。
会社がひとり一台のパソコンを支給する動きにあわせて、ビジネス現場でExcelを中心としたマクロが広く使われるようになりました。
そのとき、わたしはいち社内システムエンジニアとして、社員にExcelマクロ機能の概要を教えていたのですが、若い事務職はこのツールを活用する動きが顕著でした。
作業をマクロ化することで、繰り返し作業が軽減されます。毎日残業してた時間が大幅に削減されます。データ処理、レポート作成などを手作業でやると、非効率というだけでなく、人的ミスも招きやすくなります。マクロはそれを軽減する役割を果たしました。
いまはあまり聞きませんが、当時はEUC(エンドユーザコンピューティング)という言葉が流行ってました。EUCは情報システム部門以外の一般従業員(エンドユーザー)が、自身の業務に必要なITツールやアプリケーションを自ら開発・運用することです。
情報システム部門にとって、それまではシステムの利用者とみていたエンドユーザーが、自らVBAを使ってアプリケーションを開発することに注目してました。「プログラミングは、情シスの聖域」と、考えているエンジニアは、ある意味で自分の立ち位置を見失う脅威を感じたかもしれません。
当時、先輩のプログラマーで、エンドユーザーがコーディングしたVBAを見ながら「こういう goto文 を使って、ジャンプさせると、処理の順序が追いにくくなるから、後々で苦労しますよ」と、聞き方によっては嫌味に聞こえる指摘を聞いたこともあります。
goto文は、コードの行先を示すジャンプ命令です。そのジャンプが「以前に実行した場所に戻る」ループなのか、それとも「単に別のコードを飛び越す」のか、コードの見た目からは意図が読み取りにくくなります。
でも、わたしはそこまでgoto文が悪の命令には思えません。goto文というのは、利用者の業務ロジックを言語に反映させるうえで、理解しやすいからです。
たとえば、VBAで「今日の日付」が記載された Excel sheet の名前があるかを確認し、あればA1セルに「おはようございます」を記録し、なければ「今日の日付」の sheet を生成し、A1セルに「おはようございます」を記録する作業を考えます。
Goto文を使用したバージョン
Sub SetGreetingWithGoto()
Dim todaySheetName As String
Dim ws As Worksheet
todaySheetName = Format(Date, "yyyy-mm-dd")
' 今日の日付のシートがあるかチェック
For Each ws In ThisWorkbook.Worksheets
If ws.Name = todaySheetName Then
GoTo SheetExists
End If
Next ws
' シートが存在しない場合:新規作成
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = todaySheetName
GoTo WriteMessage
SheetExists:
' シートが存在する場合:そのシートを取得
Set ws = ThisWorkbook.Worksheets(todaySheetName)
WriteMessage:
' A1セルに「おはようございます」を書き込み
ws.Range("A1").Value = "おはようございます"
ws.Activate
End Sub
Goto文を使わないバージョン
Sub SetGreetingWithoutGoto()
Dim todaySheetName As String
Dim ws As Worksheet
Dim sheetExists As Boolean
todaySheetName = Format(Date, "yyyy-mm-dd")
sheetExists = False
' 今日の日付のシートがあるかチェック
For Each ws In ThisWorkbook.Worksheets
If ws.Name = todaySheetName Then
sheetExists = True
Exit For
End If
Next ws
If sheetExists Then
' シートが存在する場合:そのシートを取得
Set ws = ThisWorkbook.Worksheets(todaySheetName)
Else
' シートが存在しない場合:新規作成
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = todaySheetName
End If
' A1セルに「おはようございます」を書き込み
ws.Range("A1").Value = "おはようございます"
ws.Activate
End Sub
Goto文を使用したバージョンと使用しないバージョンを単純にプログラムで使っている文字数(日本語は除く)で比較するとこうです。
- Goto文を使用したバージョン:427文字
- Goto文を使用しないバージョン:456文字
Gotoを使わない方が 29文字多い という結果です。すなわち、単純に文字数を比較すると、Goto文を使用することで省力化・書きやすくなります。
ですので、プログラミングを主たる仕事としていないシステムの利用者が Goto文を使って、業務の自動化を実現するのは間違ってないと思うのです。
ベテランのプログラマーは Goto文の使用を否定しますが、それは長いプログラムの保守性に比重を置いているからです。要は関心の分野が違うということなんですね。