🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

Q&A

解決済

2回答

12110閲覧

Access レポートのPDF化 保存先ダイアログを開いて決定し、名前はVBAコードで指定

NGK

総合スコア1

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

0グッド

0クリップ

投稿2020/12/18 05:16

前提・実現したいこと

こんにちは。Access VBAを用いたレポートのPDF出力について質問です。出力・保存されるPDFファイルのファイル名だけはこちらで指定して、保存先は都度保存ダイアログを開いて選択する方法を教えていただきたいです。

以下のように、何パターンかコードを書き変えて試したのですが、うまくいきませんでした。

上手くいかなかったコード

DoCmd.OutputTo acOutputReport, "R_レポート名", acFormatPDF, "C:保存先パス\保存するPDF名.pdf" ➞名前はこちらで決められるが、保存先を事前にコードで指定しなくてはならず、都度保存ダイアログを開けない。 DoCmd.OutputTo acOutputReport, "R_レポート名", acFormatPDF, "保存するPDF名.pdf" ➞名前はこちらで決められるが、勝手にPCのドキュメントに保存される。 DoCmd.OutputTo acOutputReport, "R_レポート名", acFormatPDF ➞都度保存ダイアログを開いて保存先を決められるが、ファイル名が「R_レポート名」に固定されてしまう。

以下2つの条件を満たすには、どうすればいいのでしょうか。
➀出力するPDFの名前はこちらで決められる
➁保存先は都度ダイアログを開いて決められる

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

  • ファイル名はコードで指定する(ユーザーは勝手に変更できない)。
  • 保存するフォルダーはユーザーに選択させたい。

ということでしょうか。

下記で紹介されているgetFolderName関数を使うといいでしょう。

AccessのVBAでファイルダイアログからフォルダを指定する方法|アズビーパートナーズ

vba

1'-------------------------------------------------------------------- 2'フォルダ選択ダイアログ 3'--------------------------------------------------------------------- 4 5Public Function getFolderName(tmpFilePath As String) As String 6 7 Dim intret As Integer 8 9 With Application.FileDialog(msoFileDialogFolderPicker) 10 11 'ダイアログのタイトルを設定 12 .Title = "フォルダ選択ダイアログ" 13 14 'デフォルトのフォルダパス 15 .InitialFileName = tmpFilePath 16 17 'ダイアログを表示 18 intret = .Show 19 If intret <> 0 Then 20 'フォルダが選択されたとき戻り値に設定 21 getFolderName = Trim(.SelectedItems.Item(1)) 22 Else 23 'フォルダが選択されなければ長さゼロの文字列を返す 24 getFolderName = "" 25 End If 26 End With 27 28End Function

上記のコードをコピーして標準モジュールに貼り付けます。
[ツール]-[参照設定]で「Microsft Office xx.x Object Library」 にチェックをいれておく。
(リンク先に画像付きで解説されます。)

上記の関数を使って下記のようなコードにすればいいでしょう。

vba

1 Dim FolderName As String 2 FolderName = getFolderName(“”) '引数に初期値のフォルダーパスを設定、""にするとドキュメントフォルダー 3 4 If FolderName = "" Then 5 MsgBox "キャンセルされました。" 6 Else 7 DoCmd.OutputTo acOutputReport, "R_レポート名", acFormatPDF, _ 8 FolderName & "\保存するPDF名.pdf" 9 End If

投稿2020/12/18 08:33

hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/12/18 08:48 編集

質問はフォルダではなくファイル名ですよ。 ああ、前提付きの回答なんですね。
hatena19

2020/12/18 08:59

タイトルの「名前はVBAコードで指定」とか、質問の「➀出力するPDFの名前はこちらで決められる」「➁保存先は都度ダイアログを開いて決められる」からファイル名はコードで固定、ユーザーは保存先(フォルダ)をダイアログで選択できるのが質問者さんの希望と解釈しました。 この解釈が前提です。
sazi

2020/12/18 09:07

私の方が勘違いですね。
NGK

2021/01/10 03:31

要件をしっかり伝えきれずにいたのにも関わらず、意図をくみ取ってくださりありがとうございました。こちらに記載していただいたコードで、希望通りの動きをすることができました。sazi様、hatena19様共にベストアンサーを差し上げたいのですが、今回は素人目にコードの理解・転用が簡単なhatena19様をベストアンサーとさせていただきます。
guest

0

保存先を選択ダイアログで決定し、後は以下の処理で行えば良いかと。

VBA

1DoCmd.OutputTo acOutputReport, "R_レポート名", acFormatPDF, "C:保存先パス\保存するPDF名.pdf" 2➞名前はこちらで決められるが、保存先を事前にコードで指定しなくてはならず、都度保存ダイアログを開けない。

VBA:AccessのFileDialogを使用して[名前を付けて保存]ダイアログボックスを表示するサンプルプログラム
追記

こんな感じ。
※msoFileDialogSaveAsの場合は、フィルター出来ないのが難点ですけどね。

VBA

1Function SaveAsFileDialog() 2 With Application.FileDialog(msoFileDialogSaveAs) 3 'FileDialogオブジェクトの各種プロパティを設定 4 .Title = "別名保存" 5 .ButtonName = "保存実行" 'デフォルトは[保存(&S)] 6 .InitialFileName = CurrentProject.Path 7 '複数ファイル選択を許可しない 8 .AllowMultiSelect = False 9 10 '[名前を付けて保存]ダイアログボックスを表示する 11 If .Show Then 12 SaveAsFileDialog = .SelectedItems(1) 13 Else 14 SaveAsFileDialog = "" 15 End If 16 End With 17End Function 18Sub PDF化コード() 19 Dim FileName As String 20 FileName = SaveAsFileDialog 21 If FileName <> "" Then 22 DoCmd.OutputTo acOutputReport, "R_レポート名", acFormatPDF, FileName 23 End If 24End Sub

フォルダ選択だったようなので、自作のFunctionを提供しておきます。

VBA

1Public Function MyFileDialog(pType, pTitle, Optional pFileterTitle, Optional pFileter, Optional pPath="") As String 2 Dim wGetFileName 3 wGetFileName = "" 4 With Application.FileDialog(pType) 5 'ダイアログのタイトルを設定 6 .title = pTitle 7 If pType = 3 Then 8 'ファイルの種類を設定 9 .Filters.Clear 10 .Filters.Add pFileterTitle, pFileter 11 .FilterIndex = 1 12 '複数ファイル選択を許可しない 13 .AllowMultiSelect = False 14 End If 15 '初期パスを設定 16 If Nz(pPath) <> "" Then 17 .InitialFileName = pPath 18 Else 19 .InitialFileName = CurrentProject.path 20 End If 21 'ダイアログを表示 22 If .Show <> 0 Then 23 'ファイルが選択されたとき 24 'そのフルパスを返り値に設定 25 wGetFileName = Trim(.SelectedItems.Item(1)) 26 End If 27 End With 28 MyFileDialog = wGetFileName 29End Function 30Sub PDF化コード() 31 Dim FldName As String 32 FldName = MyFileDialog(4, "PDF保存先を選択") 33 If FldName <> "" Then 34 DoCmd.OutputTo acOutputReport, "R_レポート名", acFormatPDF, FldName & "\保存するPDF.pdf" 35 End If

投稿2020/12/18 06:22

編集2020/12/18 09:26
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NGK

2020/12/18 07:01

頂いたサイトのコードを参考にやりたい挙動を再現しようと思ったのですが、理解が足りず実装できませんでした。「保存先を選択ダイアログで決定し、後は以下の処理で行えば良いかと。」とのことでしたが、もう少し詳細な手順を教えていただけないでしょうか…。 Function GetFileName(OpenOrSaveFlg As Boolean) As Variant Dim returnValue As Integer Dim strFilePath As String WizHook.Key = 51488399 'WIZHOOKを有効化する returnValue = WizHook.GetFileName( _ 0, "", "", "", strFilePath, "", _ "PDF (*.pdf)|*.pdf", _ 0, 0, 0, OpenOrSaveFlg _ ) WizHook.Key = 0 ' WizHook 無効化 'returnValueとstrFilePathの2つの値を返す 'returnvalueの値を返すことで[キャンセル]が押されたかを判断するため GetFileName = Array(returnValue, strFilePath) End Function sub PDF化コード() Dim ReturnArray As Variant ReturnArray = GetFileName(False) 'この引数をFalseにすると保存ダイアログ If ReturnArray(0) = -302 Then 'キャンセルボタンが押されたときの処理を記述 MsgBox "キャンセルが押されました。" Else DoCmd.OutputTo acOutputReport, "R_レポート名", acFormatPDF, "C:保存先パス\保存するPDF名.pdf" End If ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' End Sub
sazi

2020/12/18 08:50 編集

なんで、Accessのウィザード用のダイアログでやろうとしてるのか分かりませんが、追記しておきました。 ※参照設定は忘れずに。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問