1

同じ基準に基づいて2つの異なるレポートを開いて保存する2つの関数があります。それらは、参照を除いて同一です:

Function Export_MLR()
On Error GoTo Export_MLR_Err

Dim strReportName As String

DoCmd.OpenReport "Market Rate Notification Final", acViewPreview
strReportName = "S:\National Installations\Market Labor Rates\MLR_INV\MLR\" & Format    (Reports![Market Rate Notification Final].Market_ID, "00") & " " & Replace(Reports![Market  Rate Notification Final].Product_Code, " / ", "_") & "-" & "Market Rate Notification Final" & "_" & Format(Date, "mmddyy") & ".pdf"

DoCmd.OutputTo acOutputReport, "Market Rate Notification Final", "PDFFormat(*.pdf)", strReportName, False, , , acExportQualityScreen
DoCmd.Close acReport, "Market Rate Notification Final", acSaveNo

Export_MLR_Exit:
Exit Function

Export_MLR_Err:
MsgBox Error$
Resume Export_MLR_Exit


End Function

次に、この関数を作成してデータを選択し、参照を1行ずつレポートするテーブルに配置します。

Function MassMarket()
On Error GoTo MassMarket_ERR

Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset


'this query creates my rs1 recordset'
DoCmd.SetWarnings (warningsOff)
DoCmd.OpenQuery "mass_market", acNormal, acEdit
DoCmd.SetWarnings (warningsOn)



Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Mass_market_Rate_change")
Set rs2 = db.OpenRecordset("tbl_Form_Auto")


'this checks and clears any records in rs2' 
If rs2.EOF = False And rs2.BOF = False Then
rs2.MoveFirst
rs2.Delete
End If
rs1.MoveFirst



'loop goes through and adds 1 line runs reports saves them and deletes line'
 Do Until rs1.EOF


    Set rs2 = db.OpenRecordset("tbl_Form_Auto")
        rs2.AddNew
        rs2![MarketID] = rs1![MarketID]
        rs2![Product_ID] = rs1![Product_ID]
       rs2.Update
    Call Export_Invoice
    Call Export_MLR

    rs1.MoveNext
    rs2.MoveFirst
    rs2.Delete

 Loop

MassMarket_Exit:
Exit Function

MassMarket_ERR:
MsgBox Error$
Resume MassMarket_Exit

End Function

これはすべて魅力のように機能しましたが、1分あたり平均16個の.pdfファイルが作成され、820個の.pdfファイル(約50分)を作成する必要がありました。これが私にできる最善のことなら、私はそれを取りますが、可能であれば今回を半分に減らしたいと思います。ありとあらゆる入力をありがとう。NR

4

1 に答える 1

1

コメントで、レポートをPDFにエクスポートする関数に大部分の時間が費やされていることを示しました。それらをスピードアップできるかどうかはわかりません。

レポートを開き、PDFファイル名の一部として使用するためにそのレポートの値を参照してOutputToから、同じレポート名でメソッドを呼び出してPDFとして保存しているようです。

そのような状況では、「内部」で何が起こるのかわかりません... Accessがレポートオブジェクトの2番目のインスタンスを開くのか、それとも既にインスタンスが開いていることを確認して代わりにそのインスタンスを使用するのに十分賢いのか。

テストとして、最初のレポートインスタンスを使用するようにAccessに通知してみてください。メソッドのObjectNameパラメーターのオンラインヘルプからOutputTo

アクティブオブジェクトを出力する場合は、ObjectType引数にオブジェクトのタイプを指定し、この引数を空白のままにします。

だから私が提案しているのはあなたのコードでこれを試してみることです:

DoCmd.OutputTo acOutputReport, , "PDFFormat(*.pdf)", _
    strReportName, False, , , acExportQualityScreen

Accessが文句を言う場合は、 ObjectNameパラメーターに空の文字列を使用して試してください。

DoCmd.OutputTo acOutputReport, "", "PDFFormat(*.pdf)", _
    strReportName, False, , , acExportQualityScreen

この提案があなたのコードをどれだけスピードアップするか(あるいはたとえそうだとしても)はわかりません。しかし、どういうわけかこれらのエクスポート機能を高速化できない場合は、全体の時間を半分に短縮するというあなたの希望は不安定な提案です。

于 2012-09-17T16:33:07.327 に答える