AccessVBAでExcel自動オープンの実装例、最後のひと手間をゼロにする方法

AccessVBA

AccessVBAで指定したEXCELファイルを開くには

AccessVBAのプログラム処理中にAccessから作成したEXCELファイルなどをすぐに開きたい場合があります。

シチュエーション

出力を配布前に即チェック
名簿などをExcelに出力した直後、自動で開いて内容確認まで流れるように実施。出力場所を探す手間をなくし、作業時間と問い合わせを削減

日次・月次の定型帳票を“迷わせない”運用に
毎回同じ帳票を出す現場ほど、出力後に自動表示が効く。担当者はボタン押下→Excel表示→印刷/送付まで一直線。

動的SQLで抽出条件が変わる一覧出力
画面条件に応じてSQLを組み立て、クエリを作成してExcel出力。出力後すぐ開くことで「条件が合っているか」をその場で検証できる。

ヘルプデスク/問い合わせ対策(“どこに出た?”をなくす)
「出力したはずだが見つからない」を定番トラブルにしない。メッセージでフルパス表示+自動オープンで、迷いを根本から消す。

サンプルコード

サンプルコードを紹介します。
フォルダ選択、クエリ作成、EXCELエクスポートの処理を行っている一番最後に記載していますので一連のながれの一部として紹介します。

この画面は筆者が作成した釣り船の乗船者管理システムの一画面です。
この画面の左下【EXCEL出力】ボタンを押下した際の処理を例とした説明となります。

'乗船者マスタの一覧をEXCELで出力する
Private Sub Cmd_ExportJyosensya_Click()

    Dim l_strExportFolder As String
    Dim l_strDate As String
    Dim l_strTime As String
    
    Dim l_strFileName As String
    
    '出力先フォルダをフォルダ選択ダイアログから取得する。
    l_strExportFolder = gf_getFolderName()
    
    '【キャンセル】ボタンが押下された場合は処理を抜ける。
    If l_strExportFolder = "" Then Exit Sub

    'クエリ用のSQLを作成する。
    g_SQL = ""
    g_SQL = g_SQL & "SELECT"
    g_SQL = g_SQL & "   乗船者コード"
    g_SQL = g_SQL & "   , 氏名"
    g_SQL = g_SQL & "   , フリガナ"
    g_SQL = g_SQL & "   , 性別"
    g_SQL = g_SQL & "   , 生年月日"
    g_SQL = g_SQL & "   , 郵便番号"
    g_SQL = g_SQL & "   , 都道府県"
    g_SQL = g_SQL & "   , 市町村"
    g_SQL = g_SQL & "   , ビル名"
    g_SQL = g_SQL & "   , TEL"
    g_SQL = g_SQL & "   , email"
    g_SQL = g_SQL & "   , 備考"
    g_SQL = g_SQL & " FROM M_乗船者マスタ"
    g_SQL = g_SQL & " WHERE 乗船者コード IS NOT NULL"
    
    g_SQL = g_SQL & " ORDER BY 氏名,フリガナ"

    'SQLからクエリを作成する。
    If gf_CreateQuery("Q_乗船者マスタ一覧", g_SQL) = False Then
        MsgBox "名簿データの作成に失敗しました。", vbCritical
        Exit Sub
    End If
    
    'ファイル名に日付と時刻を入れる。
    l_strDate = Format(Date, "yyyymmdd")
    l_strTime = Format(Time, "hhmmss")
    
    'EXCELファイル名をフルパスで構築する。
    l_strFileName = l_strExportFolder & "\乗船者マスタ一覧_" & l_strDate & l_strTime & ".xlsx"
    
    'EXCELファイルをクエリから作成する。
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Q_乗船者マスタ一覧", l_strFileName, True

    '出力先をメッセージとして表示する。
    MsgBox "ファイルを出力しました。" & vbCrLf & vbCrLf & "出力先: " & l_strFileName, vbInformation
    
    
    
    'フルパスをハイパーリンクとして関連付けられた既定アプリで開く
    Application.FollowHyperlink l_strFileName
    
End Sub

処理の流れ

1,gf_getFolderName()フォルダ選択ダイアログで出力先フォルダを返す(キャンセル時は ""

2,gf_CreateQuery(クエリ名, SQL文字列)SQLからクエリを作成する

3,フォルダを選択すると、DoCmd.TransferSpreadsheetの処理でEXCELファイルが作成されます。
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Q_乗船者マスタ一覧", l_strFileName, True:選択フォルダに 「乗船者マスタ一覧_yyyymmddhhmmss.xlsx」 が出力されます。

4,出力完了メッセージ表示後、Application.FollowHyperlink により、関連付けされた既定アプリ(通常はExcel)でファイルが自動で開きます。

どのような処理なのか

Application.FollowHyperlink はその文字列を「URL/ファイル/UNC パス」のような ハイパーリンクとして解釈します。

実際の起動は Access 自身ではなく Windows(シェル)が行います。

Windows は .xlsx の拡張子に関連付けられた既定アプリ(通常 Excel)を調べて、Excel を起動してそのファイルを開く、という動きになります。

つまり、FollowHyperlink は「Excel を開け」と命令しているのではなく、“このリンク先を開いて”と Windows に依頼しているといったイメージになります。

結果として .xlsx の既定アプリが Excel なので Excel が起動します。

上記仕組みの為、テキストファイルやWordファイルを開いても同じように規定アプリが開くという動作になります。

最後に

今回は、DoCmd.TransferSpreadsheetで作成したExcelを、Application.FollowHyperlinkでそのまま自動オープンする小技を紹介しました。

出力はできても「保存先を探して開く」のが地味に手間で、利用者のストレスや問い合わせにつながりがちです。

出力直後に既定アプリで開けば、確認作業までが一気通貫になり、運用が安定します。さらに日付+時刻でファイル名をユニーク化しておけば上書き事故も防げます。

フォルダ選択や動的クエリ生成と組み合わせ、まずは一つの出力処理に組み込んで効果を体感してみてください。

コメント

タイトルとURLをコピーしました