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

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

詳細はこちら
VBA

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

Access

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

Q&A

解決済

1回答

4493閲覧

名前を付けて保存ダイアログ

techiko

総合スコア10

VBA

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

Access

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

0グッド

0クリップ

投稿2019/10/08 04:50

開いているフォームのレポートを
名前を付けて保存ダイアログを使ってデスクトップにPDFで保存したいです。

見よう見真似で試しているのですが
キャンセルボタンをクリックしてもメッセージが出ず
ドキュメントにファイルが保存されてしまいます。
また、何も入力されていない時にボタンを押すと
ダイアログが開きなんらかのアクションの後に
実行時エラー’3075’が出るので
ダイアログが出る前にメッセージを出したいです。
(今のコードだと後から出ます)

よろしくお願いいたします。

Function GetFileName(OpenOrSaveFlg As Boolean, strFilter As String, _ strTitle As String, strDefaultPath As String) As String Dim wScriptHost As Object, strInitDir As String Dim returnValue As Integer Dim strFilePath As String strFilePath = strDefaultPath If strFilter = "" Then strFilter = "全てのファイル (*.*)|*.*" End If WizHook.Key = 51488399 'WIZHOOK有効 returnValue = WizHook.GetFileName( _ 0, "", strTitle, "", strFilePath, "", _ strFilter, _ 0, 0, 0, OpenOrSaveFlg _ ) WizHook.Key = 0 ' WizHook 無効 GetFileName = strFilePath End Function Private Sub コマンド55_Click() DoCmd.RunCommand acCmdSaveRecord Const cstrRptName As String = "受注票" On Error GoTo Err_Handler Dim strFileName As String Dim ExpFileName As String Set wScriptHost = CreateObject("WScript.Shell") strInitDir = wScriptHost.SpecialFolders("Desktop") ExpFileName = "受注票_" & Format(Now(), "yyyymmdd_hhnnss") strFileName = GetFileName(False, "PDFファイル (*.pdf)|*.pdf", "", ExpFileName & ".pdf") If Len(strFileName) = 0 Then MsgBox "キャンセルしました。" Else Echo False DoCmd.OpenReport "受注票", acViewPreview, , "受注ID=" & 受注ID DoCmd.OutputTo acOutputReport, "受注票", acFormatPDF, strFileName, False End If OpenAfterPublish = False Exit_Here: On Error Resume Next DoCmd.Close acReport, cstrRptName Echo True Exit Sub Err_Handler: If Err.Number = 3075 Then MsgBox "保存できるものがありません" & vbLf Else MsgBox "エラーが起こりました" & vbLf End If Resume Exit_Here: End Sub

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

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

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

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

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

Youbun

2019/10/08 07:37 編集

strFilePath = strDefaultPath が入っているため、キャンセルボタンをクリックしたときに保存してしまうのではないでしょうか? returnValueの値を見て戻り値を変更すればいける気がします
guest

回答1

0

ベストアンサー

・「キャンセル」を押すと**「strFilePath = strDefaultPath」の値のまま**なので
戻り値を「""」にしないといけない
・一応、ジャンプ後の処理の前で「Exit Sub」で処理を終了させる

この2つの処理を追記しました。
これでエラーはなくなり、想定通りの処理を行うと思います。
▼ 追記の部分は※でコメントしてます

vb

1Option Compare Database 2 3Function GetFileName(OpenOrSaveFlg As Boolean, strFilter As String, _ 4strTitle As String, strDefaultPath As String) As String 5 6Dim wScriptHost As Object, strInitDir As String 7Dim returnValue As Integer 8Dim strFilePath As String 9strFilePath = strDefaultPath 10 11If strFilter = "" Then 12strFilter = "全てのファイル (*.*)|*.*" 13End If 14 15WizHook.Key = 51488399 'WIZHOOK有効 16returnValue = WizHook.GetFileName( _ 170, "", strTitle, "", strFilePath, "", _ 18strFilter, _ 190, 0, 0, OpenOrSaveFlg _ 20) 21WizHook.Key = 0 ' WizHook 無効 22 23' ※キャンセル時は戻り値を未記入にする 24If returnValue = -302 Then 25 GetFileName = "" 26Else 27 GetFileName = strFilePath 28End If 29 30End Function 31 32 33Private Sub コマンド55_Click() 34DoCmd.RunCommand acCmdSaveRecord 35Const cstrRptName As String = "受注票" 36On Error GoTo Err_Handler 37Dim strFileName As String 38Dim ExpFileName As String 39Set wScriptHost = CreateObject("WScript.Shell") 40 strInitDir = wScriptHost.SpecialFolders("Desktop") 41ExpFileName = "受注票_" & Format(Now(), "yyyymmdd_hhnnss") 42strFileName = GetFileName(False, "PDFファイル (*.pdf)|*.pdf", "", ExpFileName & ".pdf") 43If Len(strFileName) = 0 Then 44MsgBox "キャンセルしました。" 45Else 46Echo False 47DoCmd.OpenReport "受注票", acViewPreview, , "受注ID=" & 受注ID 48DoCmd.OutputTo acOutputReport, "受注票", acFormatPDF, strFileName, False 49End If 50OpenAfterPublish = False 51 52' ※ジャンプ後の処理の前に終了処理を入れる 53Exit Sub 54 55Exit_Here: 56 On Error Resume Next 57 DoCmd.Close acReport, cstrRptName 58 Echo True 59 Exit Sub 60Err_Handler: 61 If Err.Number = 3075 Then 62 MsgBox "保存できるものがありません" & vbLf 63 Else 64 MsgBox "エラーが起こりました" & vbLf 65 End If 66 Resume Exit_Here: 67End Sub

>>また、何も入力されていない時にボタンを押すと
ダイアログが開きなんらかのアクションの後に実行時エラー’3075’が出る

未記入の場合は保存ボタンは押せなくなっているはずですが・・・
何のボタンを押してエラーが出たのか分からなかったのでとりあえずスルーしました!

投稿2019/10/08 08:09

Youbun

総合スコア125

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

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

techiko

2019/10/08 08:25

どうもありがとうございます!! 無事にキャンセル処理できました。 「何も入力されていない」というのはフォームに入力がされていない時に 保存もしくはキャンセルボタンを押した場合のことでした。言葉足らずですみません。 でもこの問題もキャンセルボタンが使えるようになったのでクリアしました。 どもありがとうございました!!
techiko

2019/10/09 03:59

解決済み後にすみません… 実際に保存してみたら、メニューバー部分が印刷プレビューのメニューとなってしまい 閉じるを押すとAccessがフリーズしてしまうようになってしまいました。 プレビューを閉じる設定に問題が生じているのでしょうか…
Youbun

2019/10/09 04:25

https://www.mccoy.jp/chie/zaitaku/access/vba/vba_report1.html このリンクを見る限り DoCmd.OpenReport "受注票", acViewPreview, , "受注ID=" & 受注ID のコードですが、 「acViewPreview=印刷プレビュ」を表示する処理になってます。 意図がわからないので何とも言えないですが、 そもそもこの行がいらないのではないかと思います。 フォームの処理は問題なく動いています。 Echo False DoCmd.OpenReport "受注票", acViewPreview, , "受注ID=" & 受注ID DoCmd.OutputTo acOutputReport, "受注票", acFormatPDF, strFileName, False エラーの原因はこの部分なので、 自分の意図通りのコードを書いているか確認してみてください。
techiko

2019/10/09 05:27

解決後にもかかわらずご回答ありがとうございます。 >DoCmd.OpenReport "受注票", acViewPreview, , "受注ID=" & 受注ID についてご指摘ありがとうございました。 入力フォームよりの開いているものだけをレポート保存したくいろいろ検索してこのコードを入れました。 閉じるコードを追加した Exit Sub の前に入れることで解決できました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問