Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Microsoft 365)
PDFを分割して出力したい
投稿日時: 23/09/06 13:37:35
投稿者: yurappy

お世話になります。
 
PDF出力をしたいのですが、わからずに困っているので教えてください。
 
 
現在、レポートで請求書をプリンターから印刷しておりますが、幾つかのお取引先様からPDFにしてメールで送るように変更するように言われました。
 
PDF化したいお取引先様だけ抽出することができたので、プリンターを「 Microsoft Print PDF 」に切り替えてPDFにしたところ、複数の会社の請求書が1つのファイルになってしまいました。
 
手作業で、お取引先様毎にページ指定をすればお取引先様ごとのファイルになるのですが、自動でお取引先様毎にファイルを別けるか、1ページずつPDFファイルにする方法はないでしょうか?
 
ネットで調べてみてもわからず、もし良い方法をご存知の方がおられましたら手順などご指導ください。
 
10月からのインボイス制度に間に合わせなくてはいけなく、困ってます。
 
よろしくお願い申し上げます。

回答
投稿日時: 23/09/06 14:30:44
投稿者: sk

引用:
現在、レポートで請求書をプリンターから印刷しておりますが、
幾つかのお取引先様からPDFにしてメールで送るように変更する
ように言われました。

引用:
手作業で、お取引先様毎にページ指定をすればお取引先様ごとの
ファイルになるのですが、自動でお取引先様毎にファイルを別けるか、
1ページずつPDFファイルにする方法はないでしょうか?

Access の機能のみで実現したい、ということなのであれば、
VBA のコードを用いてそういう自動処理を実行するしかないでしょう。

投稿日時: 23/09/06 14:56:49
投稿者: yurappy

sk様
 
ご指導ありがとうございます。
 
ネットで調べてこちらのページを拝見させていただいたのですが、まったくわからずにおります。
 
https://tasukete-access.com/2023/01/18/vba_pdf_output/
 
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11280389871?__ysp=44Ki44Kv44K744K5ICBWQkEgIFBERg%3D%3D
 
https://oshiete.goo.ne.jp/qa/6681709.html
 
真似てマクロを試してみたのですが、エラーばかりで動作しなくていろいろ試してるのですが、そもそもVBAの知識がないのでわからずにおります。
 
もし、ご参考になるページなどご存知でしたら、すみませんがお教えください。
 
よろしくお願い申し上げます。

回答
投稿日時: 23/09/06 15:19:43
投稿者: sk

ではとりあえず、以下の情報を明記して下さい。
 
・請求書として使用されるレポートの名前。
 
・そのレポートの[レコードソース]プロパティの設定値。
 
・レポートのレコードソースがテーブルである場合は、
 そのテーブルの定義内容(各フィールドの名前、データ型、
 主キーに関する情報)。
 
・レポートのレコードソースがクエリである場合は、
 そのクエリの SQL ビューの内容。

回答
投稿日時: 23/09/06 15:59:45
投稿者: Suzu

引用:
手作業で、お取引先様毎にページ指定をすればお取引先様ごとのファイルになるのですが、自動でお取引先様毎にファイルを別けるか、1ページずつPDFファイルにする方法はないでしょうか?

 
1ページ づつでも良いのであれば
フリーで、分割ツールはありますから、WEB検索をしてみてはどうでしょう。

投稿日時: 23/09/06 16:37:16
投稿者: yurappy

sk様
  
お世話になります。
ご親切に、ありがとうございます。
 
 

引用:
・請求書として使用されるレポートの名前。

 
レポートの名前は、請求書_PDF発行 です。
 
レポートの中にサブレポートで商品明細などを読み込んでます。
 
 
引用:
・そのレポートの[レコードソース]プロパティの設定値。

 
レコードソースとはクエリの名称でよろしいでしょうか。
クエリの名称でしたら、請求書発行_PDF です。
 
 
 
引用:
・レポートのレコードソースがクエリである場合は

 
SQLビューをそのままコピーたのが次のものです。
 
 
SELECT tokuisaki.[c-code], tokuisaki.tokuisaki, tokuisaki.shime, tokuisaki.post, tokuisaki.address, tokuisaki.tel, tokuisaki.fax, personal.company, personal.address, personal.tel, personal.fax, personal.bank, personal.bank_1, personal.bank_2, personal.bank_3, Sum(uriage.price) AS priceの合計
FROM (tokuisaki INNER JOIN personal ON tokuisaki.prm = personal.prm) INNER JOIN uriage ON tokuisaki.[c-code] = uriage.[c-code]
WHERE (((Format([hiduke],"yy/mm"))=[Forms]![start]![tx1]))
GROUP BY tokuisaki.[c-code], tokuisaki.tokuisaki, tokuisaki.shime, tokuisaki.post, tokuisaki.address, tokuisaki.tel, tokuisaki.fax, personal.company, personal.address, personal.tel, personal.fax, personal.bank, personal.bank_1, personal.bank_2, personal.bank_3
HAVING (((tokuisaki.shime)=31) AND ((Sum(uriage.price))>0));
 
c-codeで親子関係をしてます。
 
 
よく理解ができていないので、間違っていたらすみません。
 
 
 
 
引用:
フリーで、分割ツールはありますから

 
助言いただいて、ありがとうございます。
 
https://www.ilovepdf.com/ja などで、試してみましたが毎日の事なので、できればアクセスだけで
作業ができればと思いまして、わがままですみません。
 
お手数をおかけしている上に、ちゃんとしたご回答やお願いがでなくて、失礼ながらすみません。
 
お願いできれば、たいへん助かります。
 
よろしくお願い申し上げます。

回答
投稿日時: 23/09/06 16:51:24
投稿者: sk

引用:
SELECT tokuisaki.[c-code],
       tokuisaki.tokuisaki,
       tokuisaki.shime,
       tokuisaki.post,
       tokuisaki.address,
       tokuisaki.tel,
       tokuisaki.fax,

引用:
c-codeで親子関係をしてます。

テーブル[tokuisaki]の主キーが[c-code]であるとして、
このフィールドのデータ型は何でしょうか。
 
引用:
レポートの名前は、請求書_PDF発行 です。

引用:
WHERE (((Format([hiduke],"yy/mm"))=[Forms]![start]![tx1]))

レポート[請求書_PDF発行]を開く命令(マクロ、またはイベントプロシージャ)は
フォーム[start]上のコマンドボタンの[クリック時]イベントで実行されているのでしょうか。

投稿日時: 23/09/06 18:27:57
投稿者: yurappy

sk様
  
ご指導ありがとうございます。
説明不足ですみません。
 
難しいことをお願いして、本当にすみません。
申し訳ないです。
 
 

引用:
フィールドのデータ型は何でしょうか。

 
仰る通り、テーブルの主キーで 数値型 です。
 
 
引用:
フォーム[start]上のコマンドボタンの[クリック時]イベントで実行されているのでしょうか。

 
こちらも、仰る通りでテキストボックスに今日の年と月を入力して、フォーム上のボタンをクリックすると動くようになってます。
 
ボタンは、デザインモードのボタンのアイコンをクリックして追加して、ウィザードに従って「レポートの操作」、「レポートのプレビュー」と進んで設けてます。
 
印刷をする前に、内容を確認したかったので「レポートのプレビュー」にしてます。
 
 
上手に説明ができなくて、すみません。
 
間違っていたら、ご指示ください。
 
よろしくお願い申し上げます。
 

回答
投稿日時: 23/09/07 10:43:43
投稿者: sk

引用:
テキストボックスに今日の年と月を入力して、
フォーム上のボタンをクリックすると動くようになってます。

1. フォーム[start]をデザインビューで開く。
 
2. 上記のコマンドボタンとは別に、新たなコマンドボタンを
   フォーム[start]の任意の位置に挿入する。
   (その際にコマンドボタンウィザードが起動した場合は、
   [キャンセル]ボタンをクリックしてウィザードの実行を中止する)
 
3. 上記 2 のコマンドボタンの[名前]プロパティと[標題]プロパティの値を
   適宜設定する。
 (以下、このコマンドボタンの名前が[cmdOutputPdfEachCustomer]であると仮定する)。
 
4. [cmdOutputPdfEachCustomer]を選択した状態で、プロパティシートの
   [イベント]タブ上にある[クリック時]プロパティの右側の[...]ボタンを
   クリックする。
 
5. 表示された[ビルダーの選択]ダイアログのリストから
   「コード ビルダー」を選択して[OK]ボタンをクリックする。
 
6. cmdOutputPdfEachCustomer_Click プロシージャ内の
   コードを次のように記述する。
 
(フォームモジュール)
----------------------------------------------------------------
Private Sub cmdOutputPdfEachCustomer_Click()

    Const OutputReportName As String = "請求書_PDF発行"

    If Not Nz(Me![tx1].Value, "") Like "##/##" Then
        MsgBox "抽出対象となる売上年月を yy/mm 形式で入力して下さい。", _
               vbExclamation, _
               "入力エラー"
        Me![tx1].SetFocus
        Exit Sub
    End If

    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rs As DAO.Recordset
    
    Set db = CurrentDb
    
    Set qdf = db.CreateQueryDef("")
    With qdf
        .SQL = "SELECT [c-code], [tokuisaki]" & _
               " FROM [請求書発行_PDF]" & _
               " GROUP BY [c-code], [tokuisaki]" & _
               " ORDER BY [c-code]"
        .Parameters("[Forms]![start]![tx1]").Value = Me![tx1].Value
        Set rs = .OpenRecordset(dbOpenSnapshot)
    End With
    
    If rs.EOF Then
        MsgBox "指定された年月において、出力対象となるデータはありません。", _
               vbInformation, _
               "データなし"
        Set rs = Nothing
        Set qdf = Nothing
        Set db = Nothing
        Exit Sub
    End If
    
    Dim strOutputFolderPath As String
    
    strOutputFolderPath = CurrentProject.Path & "\請求書PDF"
    
    If Dir(strOutputFolderPath, vbDirectory) = "" Then
        MkDir strOutputFolderPath
    End If
    
    strOutputFolderPath = strOutputFolderPath & "\" & Format(Now(), "yyyymmdd_hhnnss")
    
    If Dir(strOutputFolderPath, vbDirectory) = "" Then
        MkDir strOutputFolderPath
    End If
    
    Dim strOutputFilePath As String
    
    Do Until rs.EOF
        DoCmd.OpenReport OutputReportName, acViewPreview, , "[c-code]=" & rs![c-code].Value, acHidden
        strOutputFilePath = strOutputFolderPath & "\" & _
                            Replace(Me![tx1].Value, "/", "") & "_" & rs![c-code].Value & "_" & Nz(rs![tokuisaki].Value, "(名称不明)") & ".pdf"
        DoCmd.OutputTo acOutputReport, OutputReportName, acFormatPDF, strOutputFilePath
        Debug.Print strOutputFilePath & " を出力しました。"
        DoCmd.Close acReport, OutputReportName, acSaveNo
        rs.MoveNext
    Loop

    Set rs = Nothing
    Set qdf = Nothing
    Set db = Nothing

    Shell "explorer.exe """ & strOutputFolderPath & """", vbMaximizedFocus

    MsgBox "フォルダ'" & strOutputFolderPath & "'にPDFファイルを出力しました。", _
           vbInformation, _
           "実行完了"

End Sub
----------------------------------------------------------------
 
以上のような感じでよろしいのではないかと。
 
引用:
ボタンは、デザインモードのボタンのアイコンをクリックして追加して、
ウィザードに従って「レポートの操作」、「レポートのプレビュー」と進んで設けてます。

ちなみ、こちらのコマンドボタンの[クリック時]イベントで実行されているのは
イベントプロシージャではなく埋め込みマクロですね。

投稿日時: 23/09/07 11:46:00
投稿者: yurappy

sk様
 
お世話になります。
ご親切に、ありがとうございます。
 
たいへんな、ご面倒とお手数をおかけして申し訳ございません。
こんなに、親切に助けていただいてすみません。
 
 
いただいた手順の通りに試しましたら、思うように動作しました。
ありがとうございます。
 
なんか、とても難しいコードで私にはとても作れないし理解もできていないのですが、動作するのを拝見して驚きと感動です。
 
なんと御礼を言ったら良いのか、言葉もわからずお恥ずかしいのですが、とっても嬉しくて本当にありがとうございます。
 
めちゃめちゃ嬉しいばかりです。
 
申し訳ないばかりで、ちゃんとしたお礼の言葉が言えずにすみませんが、本当にありがとうございます。
たいへん助かりました。
 
また困った時は、助けてください。
 
本当に本当にありがとうございます。
 
嬉しい限りです。
 
ありがとうございます。
 
よろしくお願い申し上げます。