プロが教えるわが家の防犯対策術!

使用MS Access 2010

以前から何度かここでお世話になっております。よろしくお願いします。

「受注一覧」という表形式フォームに日々の受注客百件程度が表示されています。レコードのフィールドに[ID]という受注IDコードがあります。
受注確認のメールにPDFの添付ファイルを作成するための「受注確認PDF」というレポートがあり、
それを使って"受注確認書(受注ID:" & [ID] & ")"というファイル名で"C:\PDF"フォルダーに一件(1ページ)づつ保存するボタンを作成する必要に迫られておりますが、ネットでいろいろ調べて、もう少しというところでなかなうまくいきません。

「受注一覧」フォーム上のボタンに レポートを開くマクロの実行(2000回)-次のレコード としたマクロを登録し、「受注確認PDF」レポートの”開くとき”イベントに

Private Sub Report_Open(Cancel As Integer)
DoCmd.OutputTo acOutputReport, "受注確認PDF", acFormatPDF, "C:\PDF"
Reports!受注確認PDF.Caption = "受注確認書(受注ID:" & [ID] & ")"

と書きました。
マクロは上から順にPDFは開いているようなのですが、フォルダーにはPDFが一枚も保存されません。
どうも開いているだけで保存されないようです。
またマクロも最後のレコードになったときのアクションを書いていないため、「次のレコードがありません」というエラーメッセージで終わります。

フォーム上の全件を"受注確認書(受注ID:" & [ID] & ")"という名前で"C:\PDF"に別々にPDFで保存し、最後のレコードになったら完了するVBAを完成したいのですが、どなたか助けていただける方がいたらお願いいたします。当方、VBAは見よう見まねで書いているだけで意味はあまり理解できないレベルです。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

間違いがいくつかあります。



DoCmd.OutputTo acOutputReport, "受注確認PDF", acFormatPDF, "C:\PDF"

上記のコードで、出力ファイル名が指定されていない。
ちゃんと拡張子も含めてファイル名を指定する必用があります。
さらにファイル名には、: は使用できません。

レポートを開くときのイベントでOutputToを実行してますが、このイベントではOutputToは実行できません。フォーム上のボタンのイベントプロシージャで OutputTo を実行しましょう。

「一件(1ページ)づつ保存する」ということですが、具体的にはどのように1件だけ抽出しているのでしょうか。レポートのレコードソースをパラメータクエリにしているのでしょうか。それともレポートを開くアクションで Where条件式を設定しているのでしょうか。

パラメータクエリで、受注一覧フォームの受注IDを参照しているとして回答します。

また、マクロとイベントプロシージャを混在させるのは煩雑ですので、イベントプロシージャのみで記述します。

受注一覧フォーム上のコマンドボタン(コマンド1)のクリック時のイベントプロシージャ

Private Sub コマンド1_Click()
DoCmd.GoToRecord acActiveDataObject, , acFirst
Do
If Me.Recordset.RecordCount = Me.CurrentRecord Then
MsgBox "最終レコードまで出力しました。"
Exit Sub
End If
DoCmd.OutputTo acOutputReport, "受注確認PDF", acFormatPDF, "C:\PDF\受注確認書(受注ID " & Me.顧客コード & ").pdf"
DoCmd.GoToRecord acActiveDataObject, , acNext
Loop
End Sub

この回答への補足

hatena1989様

ご連絡が遅くなり、申し訳ありません。
出来ました!完璧です!ありがとうございました。
私のレベルだとすべての記述を理解するのは困難ですが、少しずつ勉強していきたいと思います。
またご相談すると思いますのでその時はよろしくお願いします。

補足日時:2011/02/18 10:45
    • good
    • 0
この回答へのお礼

hatena1989様

早速のご回答ありがとうございます!

>パラメータクエリで、受注一覧フォームの受注IDを参照しているとして回答します。
はい、そのとおりです。


ただいま帰宅してしまったため、明日出社次第ご教授いただいた記述でチャレンジしてみます。ありがとうございました。

お礼日時:2011/02/17 22:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAcccess レポートをグループ別に出力する

クエリ「納品書」を元にしたレポート「納品書」(※'クエリ名とレポート名は同名)は
フィールド「顧客番号」(テキスト型)でグループ設定をしています。

レポートをPDF出力する際、グループごとにファイルを保存したいと思います。
しかし、VBA実行時に「パラメータが少な過ぎます。7を指定して下さい。」と
エラーが出てしまい、行き詰まっています。
VBAの知識もほとんど無い為、どこで躓いているか教えていただけないでしょうか。

また、
他サイトで申し訳ありませんが・・・、
●ACCESSVBA レポートをグループ毎に別のPDFファイルとして保存
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14108043684
こちらの回答を参考に、以下のように作成しました。
(以下、レコードソース)
---------------------------
Const TBL_NAME = "納品書"
Const RPT_NAME = "納品書" 
Const PDF_PATH = "C:\Users\Desktop\

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

rs.Open "SELECT DISTINCT 顧客番号 FROM 納品書", CurrentProject.Connection, adOpenStatic, adLockReadOnly
Do Until rs.EOF

pdfName = rs!顧客番号
DoCmd.OpenReport RPT_NAME, acViewPreview, ,"顧客番号=" & rs!顧客番号, acWindowNormal
DoCmd.OutputTo acOutputReport, RPT_NAME, acFormatPDF, PDF_PATH & Format(date,"yyyymmdd") & ".pdf"
DoCmd.Close
rs.MoveNext

Loop
---------------------------

クエリ「納品書」を元にしたレポート「納品書」(※'クエリ名とレポート名は同名)は
フィールド「顧客番号」(テキスト型)でグループ設定をしています。

レポートをPDF出力する際、グループごとにファイルを保存したいと思います。
しかし、VBA実行時に「パラメータが少な過ぎます。7を指定して下さい。」と
エラーが出てしまい、行き詰まっています。
VBAの知識もほとんど無い為、どこで躓いているか教えていただけないでしょうか。

また、
他サイトで申し訳ありませんが・・・、
●ACCESSVBA レポートをグルー...続きを読む

Aベストアンサー

どの程度改善できるかは不明です。単なる思いつきなので試していません。

フォームを一つ作成します。仮に名前を「F_PDF出力」にします。
F_PDF出力のレコードソースを、SELECT DISTINCT 顧客番号 FROM 納品書 にします。
レコードセットはスナップショットにします。
フォーム上に顧客番号のテキストコントロールを置きます。
もう一つ非連結のテキストボックスを置き、コントロールソースには
=[CurrentRecord] & " / " & Count(*) とします。
上はどこまで進んでいるか確認するためです。
あとは、コマンドボタンを一個。

レポートのレコードソースをパラメータークエリにして
上記フォームの顧客番号を参照するようにします。

コマンドボタンのクリック時イベントなどに
Const TBL_NAME = "納品書"
Const RPT_NAME = "納品書" 
Const PDF_PATH = "C:\Users\Desktop\

Docmd.GoToRecord acDataForm,me.name,acFirst
  Do
DoCmd.OutputTo acOutputReport, RPT_NAME, acFormatPDF, PDF_PATH & Format(date,"yyyymmdd") & ".pdf"
    If Me.Recordset.RecordCount = Me.CurrentRecord Then
      MsgBox "最終レコードまで出力しました。"
    Exit Sub
    End If
    Docmd.GoToRecord acDataForm,me.name,acNext
  Loop
とします。
これで上手く行けばプレビューにかかる時間が短縮できるはずです。

どの程度改善できるかは不明です。単なる思いつきなので試していません。

フォームを一つ作成します。仮に名前を「F_PDF出力」にします。
F_PDF出力のレコードソースを、SELECT DISTINCT 顧客番号 FROM 納品書 にします。
レコードセットはスナップショットにします。
フォーム上に顧客番号のテキストコントロールを置きます。
もう一つ非連結のテキストボックスを置き、コントロールソースには
=[CurrentRecord] & " / " & Count(*) とします。
上はどこまで進んでいるか確認するためです。
あとは、コマンドボ...続きを読む

QAccessのレポートからPDFをページ毎に作成

Acrobat StandardがインストールされたマシンでAccessのレポート機能を使って、印刷を行うときに、出力先をAdobePDFにしたいのですが、ページ毎にファイルを分けて印刷を行いたいと考えています。

1ページずつページ指定をして出力するような手動方式ではなく自動で行う方法はありますか。

Aベストアンサー

Sub t()
Dim rpt As Report
Dim rptName As String
Dim printCount As Integer
Dim i As Integer
rptName = "あれを"
DoCmd.OpenReport rptName, acViewPreview ', wherecondition:=""
Set rpt = Reports(rptName)
printCount = rpt.Pages

Do Until i > printCount
DoCmd.PrintOut acPages, i, i
i = i + 1
Loop

DoCmd.Close acReport, rpt.Name
MsgBox "fin"

End Sub
とかで総ページ数を取得して・・
ところで、AdobePDFでは同名の既存ファイルがあった場合、
ファイル名に連番を付加するとか、
既定ファイル名を出力日時にするとかのオプションは
無いのですかね?
当方持ち合わせておりませんので分かりませんが。

あるいは妥協してスナップショットでしたらファイル名を指定できますが・・
DoCmd.OutputTo acOutputReport, "R発注書", "SnapshotFormat(*.snp)", strFileName,

Sub t()
Dim rpt As Report
Dim rptName As String
Dim printCount As Integer
Dim i As Integer
rptName = "あれを"
DoCmd.OpenReport rptName, acViewPreview ', wherecondition:=""
Set rpt = Reports(rptName)
printCount = rpt.Pages

Do Until i > printCount
DoCmd.PrintOut acPages, i, i
i = i + 1
Loop

DoCmd.Close acReport, rpt.Name
MsgBox "fin"

End Sub
とかで総ページ数を取得して・・
ところで、AdobePDFでは同名の既存ファイルがあった場合、
ファイル名に連番を付加す...続きを読む

QACCESS2010 レポートを分割しPDF化

ACCESS2010にて、数百件の宛先に向けた通知書を作成しています。

いくつかのテーブルから必要な部分をクエリで抽出し、それをレポートの落とし込む形式です。
レポートは宛先名称等が入ったヘッダーと詳細欄で構成しています。

作成した通知書を、それぞれの宛先ごとにメールへ添付し送付したいのですが、
レポートから印刷でPDF化すると全ての通知書が一つのPDFファイルとして出力されてしまいます。
そのため、メールに添付する際にはひとつひとつ手作業でPDFファイルファイルを分割しなければなりません。
これを一度の印刷作業でヘッダー毎にファイルが作成されるようにはできないのでしょうか。
マクロ、VBAも多少は扱えますのでコードを記述していただいても構いません。

イメージとしては、
【宛先】   A社     B社     C社
【通知書】  A通知書.pdf B通知書.pdf  C通知書.pdf
と出せるようにしたいです。

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

Aベストアンサー

参考になるかと
http://oshiete.goo.ne.jp/qa/8228404.html
とそのリンク先。

QAccessVBAでレポートをPDFで出力

いつもお世話になっております。

現在、AccessVBAを使用して、簡単なレポートを、PDFとして出力するプログラムを立てているのですが、レポート出力をループで回して、VBAよりPDFファイルを自動的に保存したいのですが・・・。

'(テーブル情報のIDが1の情報のみ、PDFで出力)
DoCmd.OpenReport "レポート名", acNormal, , "ID=1"

以上のロジックを、実行すると、「ファイルの保存先ダイアログ」が勝手に開きます・・。

プリンタの設定は事前にAcrobatに設定してあるので、PDF化は容易に出来るのですが、上記のロジックを実際には(IDの数だけ)ループで回しているので、毎回「名前を付けて保存」ダイアログが開くのがとても煩わしいです(:_;)。

VBA上で、保存先を指定して、「名前を付けて保存」ダイアログが開かないようにする方法はないでしょうか?
今日一日調べても有力な手がかりが無かったので、どなたかご教授下さい。

Aベストアンサー

> 開発環境はAccess2000なのですが、PrinterオブジェクトはAccess2002~
> 実装されているオブジェクトのようです。

その通りです。Access2000 ですか...

ほぼ同程度の情報取得関数を自前で用意するしかなさそうですね。
WMI を使ってます。それと MyDocument のパス取得に手抜きで WSH を
使ってますのでご注意を。

2つの関数+使い方サンプルです。
WinXP + Access2002 VBA で動作確認しましたが、多分 Excel や Word VBA
でも動きます。もちろん 多分 Access2000 でも。

自分の限られた環境でしかテストしてないので、できれば動作報告して
いただけると助かります。

Option Explicit

' プリンタ情報を保持する構造体
Public Type PRINTER_STRUCT
  PrinterName  As String  ' プリンタ名
  PortName    As String  ' ポート名
  DriverName   As String  ' ドライバー名
  DefaultPrinter As Boolean ' 通常使うプリンタか?
End Type

' // プリンタを列挙する(WMI版)
Public Function EnumPrinters(ByRef uPrinter() As PRINTER_STRUCT) As Long
  
  ' 引 数: uPrinter PRINTER_STRUCT ここにプリンタ情報が返る
  ' 戻り値: Long 成功時/インストールされたプリンタ数 失敗時: -1
  
  Dim Printers  As Object
  Dim Prt     As Object
  Dim lPrtCount  As Long
  Dim i      As Long
  Set Printers = CreateObject("WbemScripting.SWbemLocator").ConnectServer _
          .ExecQuery("Select * From Win32_Printer")
  lPrtCount = Printers.Count
  ReDim uPrinter(lPrtCount - 1)
  i = 0
  For Each Prt In Printers
    With uPrinter(i)
      .PrinterName = Prt.Caption
      .PortName = Prt.PortName
      .DriverName = Prt.DriverName
      .DefaultPrinter = CBool(Prt.Default)
    End With
    i = i + 1
  Next Prt
  If lPrtCount > 0 Then EnumPrinters = lPrtCount
  Set Printers = Nothing
  Exit Function
ERROR_HANDLER:
  EnumPrinters = -1
End Function

' // PDF プリンタのポート名からデフォルトの保存先パスを取得
Public Function GetPDFSavePath() As String
  
  ' 戻り値: 成功時/PDF プリンタの保存先パス 失敗時/""(長さ0の文字列)
  ' 注 意: 戻り値の終端に¥(パスセパレータ)があるかどうか要チェック
  
  Dim uPrinter() As PRINTER_STRUCT
  Dim lRet    As Long
  Dim lCnt    As Long
  Dim sTmp    As String
  Dim i     As Long
  GetPDFSavePath = ""
  lRet = EnumPrinters(uPrinter)
  If lRet > 0 Then
    lCnt = UBound(uPrinter)
    For i = 0 To lCnt
      ' ドライバー名で PDF プリンタか判定
      If UCase$(uPrinter(i).DriverName) Like "*PDF*" Then
        sTmp = uPrinter(i).PortName
        If UCase$(sTmp) Like "MYDOCUMENT*" Then
          sTmp = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
        Else
          sTmp = Left$(sTmp, InStr(sTmp, "*.pdf") - 1)
        End If
        GetPDFSavePath = sTmp
        Exit For
      End If
    Next i
  End If
  Erase uPrinter
End Function

Sub 使い方()
  ' EnumPrinters 関数
  Dim uPrinter() As PRINTER_STRUCT '<-- 構造体を配列で渡す
  Dim lRet    As Long
  Dim i     As Long
  lRet = EnumPrinters(uPrinter)
  Debug.Print "Installed Printer Device: " & CStr(lRet)
  For i = 0 To lRet - 1
    Debug.Print "----------------------------------------------------------"
    Debug.Print " Name  : " & uPrinter(i).PrinterName
    Debug.Print " Port  : " & uPrinter(i).PortName
    Debug.Print " Driver : " & uPrinter(i).DriverName
    Debug.Print " Default: " & CStr(uPrinter(i).DefaultPrinter)
  Next i
  Erase uPrinter
  Debug.Print "----------------------------------------------------------"
  ' GetPDFSavePath 関数
  Dim sPath As String
  sPath = GetPDFSavePath()
  If sPath = "" Then
    Debug.Print "PDF プリンタ発見できず...orz"
  Else
    Debug.Print "PDF Printer Save Dir Path"
    Debug.Print " " & sPath
  End If
End Sub

> 開発環境はAccess2000なのですが、PrinterオブジェクトはAccess2002~
> 実装されているオブジェクトのようです。

その通りです。Access2000 ですか...

ほぼ同程度の情報取得関数を自前で用意するしかなさそうですね。
WMI を使ってます。それと MyDocument のパス取得に手抜きで WSH を
使ってますのでご注意を。

2つの関数+使い方サンプルです。
WinXP + Access2002 VBA で動作確認しましたが、多分 Excel や Word VBA
でも動きます。もちろん 多分 Access2000 でも。

自分の限られた環境...続きを読む

Qアクセスで特定のレコードのみのレポートを印刷したいのですが。

アクセス2003である特定のレコードのみのレポートを印刷したいと思っています。現在開いているフォームのレコードのみを印刷(レポートとして)印刷するには、ファイル→印刷→ページ指定で現在印刷しているのですが、他に方法はないでしょうか?単に「レポートの印刷」とすると全てのレコードが印刷されてしまいます。今のところ特定のレコードのみ印刷するには、まずページ数を調べなければいけないので不便です。せっかくパラメータクエリなどで、そのレコードのフォーム画面を表示させても、レポート印刷につながらないので、どなたか良い方法を教えていただけないでしょうか?よろしくお願いいたします。

Aベストアンサー

レポートの基となるクエリを開きます。
フォームに表示されている項目の中で主キーとなるフィールドがどれかを決めます。
そのクエリの中でその主キーフィールドのWHERE条件の欄を選択してビルドを開きます。
レポートを選択するフォームの一覧を開きます。
先ほど選んだ主キーの項目を選んでダブルクリックします。
Ok
そうすれば、フォームから印刷ボタンを押せば開いているページだけが印刷されます。
但し、複数ページの指定をするには、更に複雑な設定が必要ですが、
今の照会した方法を応用すればできるはずです。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QACCESS フォームをそのまま印刷について

お世話になります。
ACCESSのフォームを印刷する方法ってどうすればいいのでしょうか?レポートは使いたくなくて・・・・
ボタンをクリックしたらボタンを非表示にして印刷させたいのですが、やり方がわかりません。
また、印刷プレビューを表示させるボタンも作りたいのですが・・・

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

Aベストアンサー

>ACCESSのフォームを印刷する方法ってどうすればいいのでしょうか?
普通に[ファイル][印刷]とすれば印刷できます
どのような形で印刷されるかは印刷プレビューで確認できます

>ボタンをクリックしたらボタンを非表示にして印刷させたいのですが
VBAなら印刷はPrintformメソッドです
印刷時非表示はDisplayWhenプロパティーで設定できます

>印刷プレビューを表示させるボタンも作りたいのですが・・・
プレビューはレポートにしかないようですね
フォームは表示されているんですよね、だったら要らないのでは

>レポートは使いたくなくて・・・・
フォームと同じフォーマットのレポートなら
右クリック、名前をつけて保存でレポートを選ぶだけで簡単に作れますよ

QMS_AccessからPDFファイルを開く方法?

MS_Accessのメニュー画面(フォーム形式)から、PDFファイルを開く方法を教えて下さい。
因みにパソコン環境は、以下のとおりです。
 OS:WindowsXP_Professional
DB:MS_Access 2003
PDF:Word文書を「いきなりPDF_Professional」の「一括PDF出力」で    作成
以上です。よろしくお願いします。

Aベストアンサー

一番簡単なのはボタンのハイパーリンクアドレスを使う方法でしょう
ボタンを置きハイパーリンクアドレスにpdfの場所を設定してやります

Qアクセスでエクセルに出力する際のファイル名を日付に

Access2010でレポートをエクセルに出力しています。
マクロで出力していますが、都度フォルダを選び、ファイル名を入力しなくてはなりません。
フォームのボタンをクリックすれば自動的に出力されるようにしたいのです。
出力先フォルダは決まっています。
ファイル名は当日の年月日で保存したいです。
どのようにすればいいのか教えてください。

Aベストアンサー

No1です。
同じ名前のファイルが存在した場合の処理を
付加しておきます。それと、一部変更します。



Private Sub コマンド0_Click()
  Dim strReportName As String
  Dim strPath As String
  Dim strFileName As String

  '対象のレポート名
  strReportName = "r1"
  出力先のフォルダ名
  strPath = "C:\Documents and Settings\user\デスクトップ\OKWeb2\登録Web1"
  '出力するExcelのファイル名
  strFileName = strPath & "\" & Format(Date, "yyyy" & "mm" & "dd")

  DoCmd.OpenReport strReportName, acViewPreview
  If MsgBox("レポートをExcelへ転送しますか", vbYesNo) = vbYes Then
    If Dir(strFileName & ".xls") = "" Then
      DoCmd.SetWarnings False
      DoCmd.OutputTo acOutputReport, strReportName, acFormatXLS, strFileName & ".xls", True
      DoCmd.SetWarnings True
    Else
      If MsgBox("同じ名前のファイルがあります。上書きしますか", vbYesNo) = vbYes Then
        DoCmd.SetWarnings False
        DoCmd.OutputTo acOutputReport, strReportName, acFormatXLS, strFileName & ".xls", True
        DoCmd.SetWarnings True
      Else
        DoCmd.Close acReport, strReportName
        Exit Sub
      End If
    End If
  End If
  DoCmd.Close acReport, strReportName
End Sub


なお、レポートをすでに開いている場合には、
コード中の、

DoCmd.OpenReport strReportName, acViewPreview
DoCmd.Close acReport, strReportName

などは、コメントアウトするか削除してください。

No1です。
同じ名前のファイルが存在した場合の処理を
付加しておきます。それと、一部変更します。



Private Sub コマンド0_Click()
  Dim strReportName As String
  Dim strPath As String
  Dim strFileName As String

  '対象のレポート名
  strReportName = "r1"
  出力先のフォルダ名
  strPath = "C:\Documents and Settings\user\デスクトップ\OKWeb2\登録Web1"
  '出力するExcelのファイル名
  strFileName = strPath & "\" & Format(Date, "yyyy" & "mm" & "dd")

  DoCmd.Open...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング