システム開発では、構造化プログラミングができるようになると、可読性も高まり、不具合リスクを低減することができます。
みなさん、こんにちは。セルネッツ竹本です。
今回は、「ワークブックの外部保存を一箇所にまとめる」をテーマに、解説をしたいと思います。
◆同じ処理は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実務の効率化において、ご参考お役立てになれば幸いです。