叡智の三猿

〜森羅万象を「情報セキュリティ」で語る

当サイトは、アフィリエイト広告を使用しています。

マクロ活用の業務改善とGoto

日本企業が業務効率化の手段として、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文の使用を否定しますが、それは長いプログラムの保守性に比重を置いているからです。要は関心の分野が違うということなんですね。