none
[Access2010 PDF出力]OutputTo実行時のError2501について RRS feed

  • 質問

  • Access2010を使用し、vbaで以下のことを実現しようとしています。
     ・検索画面から検索条件を取得し、TEST_TABLEの情報を、"レポート帳票"というレポート形式に沿って、PDF出力する
     ・TEST_TABLEにあるIDカラムごとに異なるファイル名で複数出力する

    下記のコードを実行すると、成功するときと失敗するときがあります。(成功/失敗の成否要因がつかめていません)
    デバッグ実行を行い、失敗するときはDoCmd.OutputToの箇所で、エラーコード"2501"が発生することを確認しています。
    Closeが完了する前にOpenReportが実行されることで発生しているのかと思い、ループごとに10秒の待ち時間を入れてみましたが回避できませんでした。


    原因、回避策についてご教示いただければと思っております。

    OSはWindows10, Windows7で現象(失敗)が再現することを確認しております。

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

    '''''''''''''''''''''''''''下記コード''''''''''''''''''''''''''''''''''''''''''''''''''''

          Dim strWhere As String
          Dim rs As ADODB.Recordset
          Set rs = New ADODB.Recordset

         '///////この間のコードで、検索条件を抽出し、strWhereに格納////

          Dim strSql As String
          'IDの一覧抽出
          strSql = strSql & "SELECT DISTINCT ID FROM TEST_TABLE"

          'IDごとにファイルを分割する
          rs.Open strSql, CurrentProject.Connection, adOpenStatic, adLockReadOnly

          '1件もなければエラー終了
          If (rs.BOF = True) And (rs.EOF = True) Then
            MsgBoxEx "印刷データ件数 0件", "", _
                    vbOKOnly + vbExclamation, pcstrAppName
            Exit Sub
          End If

          'IDの数だけループ
          Do Until rs.EOF
            On Error Resume Next
            'レポートの形式で出力
            DoCmd.OpenReport "レポート帳票", acViewReport, , strWhere & " AND ID = '" & rs!ID & "'", acWindowNormal
            'PDF形式に変換
            DoCmd.OutputTo acOutputReport, "レポート帳票", acFormatPDF, "C:\test\PDFファイル" & i & ".pdf"

            DoCmd.Close acReport, "レポート帳票"

            i = i + 1
            rs.MoveNext
          Loop


          rs.Close
          Set rs = Nothing

                                          

    • 編集済み naka10 2017年8月8日 6:44
    2017年8月8日 6:39

すべての返信

  • このように成功する場合と失敗する場合があるとき、現象を再現できる条件が明確でないと、原因を特定するは難しいですね。

    とりあえず、気になるのは、レポートビュー(acViewReport)で開いている点、ここはプレビュー(acViewPreview)に変更してみて試してみてください。

    あと、レポートビュー(プレビュー)で開くことが必須でないなら、レコードソースのSQLを書き換えて、OutputToする方法を推奨します。処理もこの方が高速です。

    コード例(前後は省略) 

        Dim db As DAO.Database
        Dim qd As DAO.QueryDef
        Set db = CurrentDb
        Set qd = db.QueryDefs("レコードソースのクエリ")
        strSQL = Replace(qd.SQL, ";", "")
    
        'IDの数だけループ
        Do Until rs.EOF
            On Error Resume Next
            'レコードソースのクエリにWHERE句を追加
            qd.SQL = sSQL & " WHERE " & strWhere & _
                     " AND ID = '" & rs!ID & "'"
            'PDF形式で出力
            DoCmd.OutputTo acOutputReport, "レポート帳票", _
                acFormatPDF, "C:\test\PDFファイル" & i & ".pdf"
            i = i + 1
            rs.MoveNext
        Loop
        'クエリのSQLを元に戻す
        qd.SQL = strSQL & ";"

    参考

    レポートをグループ毎に分割してPDFファイルとして保存したい - hatena chips

    2017年8月16日 9:33
  • hatena19様

    アドバイスありがとうございます!

    プレビューで表示する必要はないため、sqlでの実施を試してみようと思います。

    私側の問題で申し訳ございませんが、8月いっぱいまで別件で手一杯のため、9月上旬には

    アドバイスをもとに実施いたします。また、試行した結果を記載いたします。

    ありがとうございました。

    2017年8月22日 14:29
  • hatena19様

    あらためて、アドバイスありがとうございます。

    ・acViewReportをacViewPreviewに変更する

    ・Report出力ではなく、sqlを用いる

    教えていただいた2点、それぞれの観点で修正し、確認してみました。

    しかし状況変わらず、私の環境では成功・失敗ともに発生しました。失敗時のエラーコードは2501でした。

    2017年9月1日 5:39