【VBA中級】Save As ステートメントを1Moduleに集約して分散管理を回避

システム開発では、構造化プログラミングができるようになると、可読性も高まり、不具合リスクを低減することができます。


システム開発では、構造化プログラミングができるようになると、可読性も高まり、不具合リスクを低減することができます。

みなさん、こんにちは。セルネッツ竹本です。


今回は、「ワークブックの外部保存を一箇所にまとめる」をテーマに、解説をしたいと思います。

◆同じ処理は1つのModuleに集約する

保存(SaveAs)や、印刷設定(print)、ファイル操作(Open)、メール送信など、同じ処理なら1Moduleに集約しましょう。

複数のモジュールに分散し書いてしまうと、改修の際、修正箇所も増えるので、「改修漏れリスク」が高まります。

システム規模が大きいケースでは、数十個から100を超えるプロシージャ数も現実味を帯びてきます。

【Point】同じ処理は1つのModule内に集約する。

例えば、「ファイルを指定先に出力する」といった処理であれば、ファイル形式が異なる場合でも、基本的な考え方は同じです。

何故なら、パラメーター受け渡しに必要な情報は、シンプルに、以下の3つだからです。

場所はどこに、何ていう名前で、どんな形式で出力するか。

1、出力場所(フォルダ名)

2、出力名称(保存名)

3、出力形式(ファイル種類)

xls、xlsx、xlsm、PDF、txtなど


1Module内に、同様の処理や記述を集約するメリットは、メンテナンス性や改修面でとても大きく、修正が容易になります。

これは物理的に、1箇所のみで済むためです。

【Point】ソース記述の量をいかに低減できるか


と簡単そうにか書きましたが、実は全体把握力と変数命名に標準化ルールがないと難しいのです。

その為には、各プロシージャ毎に変数宣言を行なう書き方ではなく、「Public型」変数を上手に活用するスキルが必要になります。

【ファイル出力~保存を1モジュールに集約した例】

Public PO_TmpBK01 As Workbook
Public PO_TmpSt01 As Worksheet

‘※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Sub M_外部ブック保存(P_出力PH名, S_保存区分 As String, P_出力BK名)
‘※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

On Error GoTo L_SaveErr: ’エラーの場合は、システムMsgを表示

Dim S_Fin行 As Long

Select Case S_保存区分

    Case "xlsx"

        UF01.Caption = "[STATUS] 外部ブック保存"
        UF01.txt経過時間.Value = "( " & Format(Int(Timer - P_Time始), "0000") & " 秒)"
        UF01.txtステータス.Value = "[" & P_出力BK名 & ".xlsx]"
        UF01.Repaint
        DoEvents

        ActiveSheet.Copy

        Set PO_TmpBK01 = ActiveWorkbook
        Set PO_TmpSt01 = ActiveSheet

        '◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
        '◆ ここは *.xlsx 形式の出力
        '◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

        PO_TmpBK01.SaveAs FileName:=P_出力PH名 & "\" & P_出力BK名 & ".xlsx", FileFormat:=xlOpenXMLWorkbook

        PO_TmpBK01.Activate

        Set PO_TmpBK01 = Nothing
        Set PO_TmpSt01 = Nothing

    '◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
    '◆ ここは、PDF形式
    '◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
    Case "PDF"

        UF01.Caption = "[STATUS] PDF保存" & P_Cnt請PDF件数 & "件目"
        UF01.txt経過時間.Value = "( " & Format(Int(Timer - P_Time始), "0000") & " 秒)"
        UF01.txtステータス.Value = P_出力BK名 & ".pdf"
        UF01.Repaint
        DoEvents

        PO_読BK01.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _
            P_出力PH名 & "\" & P_出力BK名 & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

    '◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
    '◆ ここは csv形式
    '◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
    Case "csv"

        PO_TmpBK01.SaveAs FileName:=P_出力PH名 & "\" & P_出力BK名 & ".csv", FileFormat:=xlCSV

        O_00.Activate

        PO_TmpSt01.Activate

Set PO_TmpBK01 = Nothing
Set PO_TmpSt01 = Nothing

End Select

Exit Sub

‘///////////////////////////////////////////////////////////////////////////////
L_SaveErr:

On Error GoTo 0

MsgBox "" & vbCrLf & vbCrLf & _
"--------------------------------------" & vbCrLf & _
"■S_保存区分: [" & S_保存区分 & "]" & vbCrLf & _
"■ActiveWorkbook.Name: [" & ActiveWorkbook.Name & "]" & vbCrLf & _
"--------------------------------------" & vbCrLf & _
"■Err.Number   : " & Err.Number & vbCrLf & _
"■Err.Description: " & vbCrLf & _
"  " & Err.Description & vbCrLf & vbCrLf & _
"※[Saveエラー]", , "[★★Save処理失敗★★]"

End

End Sub

Excel業務の効率化を目的としたツール開発で、複数人プロジェクトという開発体制はまずありません。

このため、「標準化ガイドライン」、「変数の命名規約」、「Module呼び出し方」など、安全な運用ルールさえ適用できれば、Public型を有効に使うことができ、大幅なStep短縮になります。

複数のModuleに、同じ処理を何度も書かない、分散させない、まとめられる処理はまとめる。これがシンプル記述の基本です。


今回のテーマは、「ワークブックの外部保存を一箇所にまとめる」について、解説を行いました。

本記事が、Excel実務の効率化において、ご参考お役立てになれば幸いです。


全国対応!お気軽にお問い合わせください