1

会社のコンピュータの 1 つが MS Access レポートを印刷して電子メールに添付できないという非常に奇妙な問題が発生しています。私は多くの調査を行いましたが、この問題は社内にある 20 台以上の PC のうち 1 台でのみ発生しているため、私のケースにはほとんど当てはまりません。これは、取得しているエラーの印刷画面です。 ここに画像の説明を入力

私が使用しているコードは次のとおりです。

If PrintMode = "Email" Then

            Dim mAcc As New Access.Application
            Dim DefaultPrinterName As New String("")
            Dim PDFPrinterName As New String("")

            Maintain__Loading.Setup()

            Try
                mAcc.CloseCurrentDatabase()
                mAcc.DoCmd.Close()
                System.Runtime.InteropServices.Marshal.ReleaseComObject(mAcc)
                mAcc = Nothing
            Catch ex As Exception
            End Try

            Dim startInfo As New ProcessStartInfo("C:\Program Files (x86)\PDFCreator\PDFCreator.exe") 'starts PDF Creator so it can save the report to PDF
            startInfo.WindowStyle = ProcessWindowStyle.Minimized
            Process.Start(startInfo)

            AttachmentName = "C:\PDFs\pdf.pdf" 'PDF has been set up to save all files as TestPrint.pdf
            PDFPrinterName = "PDFCreatorDistribution"
            '------ GETS DEFAULT PRINTER NAME -------
            Dim oPS As New System.Drawing.Printing.PrinterSettings
            Try
                DefaultPrinterName = oPS.PrinterName
            Catch ex As System.Exception
                DefaultPrinterName = ""
            Finally
                oPS = Nothing
            End Try

            'sets PDFCreatorDistribution as default printer
            Shell(String.Format("rundll32 printui.dll,PrintUIEntry /y /n ""{0}""", PDFPrinterName))

            Try
                If Not UCase(Trim(Database)) = "TEST" Then
                    mAcc.OpenCurrentDatabase("R:\Distribution\Access\Distribution-Reports.mde")
                Else
                    mAcc.OpenCurrentDatabase("R:\Distribution\Access\Test-Distribution-Reports.mde")
                End If
            Catch ex As Exception
                MsgBox(Err.Description)
            End Try

            If IO.File.Exists(AttachmentName) Then 'if file exists it deletes it
                IO.File.Delete(AttachmentName)
            End If

            Select Case Trim(Grid.Rows(Grid.CurrentRow.Index).Cells("Passing1Type").Value.ToString)
                Case "String"
                    mAcc.DoCmd.OpenReport(Trim(Grid.Rows(Grid.CurrentRow.Index).Cells("MacroName").Value.ToString), Access.AcView.acViewPreview, , Trim(Grid.Rows(Grid.CurrentRow.Index).Cells("Passing1").Value.ToString) & " = '" & Number & "'", Access.AcWindowMode.acWindowNormal)
                Case "Numeric"
                    mAcc.DoCmd.OpenReport(Trim(Grid.Rows(Grid.CurrentRow.Index).Cells("MacroName").Value.ToString), Access.AcView.acViewPreview, , Trim(Grid.Rows(Grid.CurrentRow.Index).Cells("Passing1").Value.ToString) & " = " & Number & "", Access.AcWindowMode.acWindowNormal)
            End Select

            mAcc.DoCmd.PrintOut()
            mAcc.Visible = True
            mAcc.CloseCurrentDatabase()
            mAcc.DoCmd.Close()
            System.Runtime.InteropServices.Marshal.ReleaseComObject(mAcc)
            mAcc = Nothing

            Do While Not System.IO.File.Exists("C:\PDFs\pdf.pdf")
                Threading.Thread.Sleep(2000) 'if doesn't exist, wait for 2 seconds

                If Not System.IO.File.Exists("C:\PDFs\pdf.pdf") Then 'if doesn't exist, wait for another 2 seconds
                    Threading.Thread.Sleep(2000)
                End If

                If Not System.IO.File.Exists("C:\PDFs\pdf.pdf") Then 'if doesn't exist, wait for another 2 seconds
                    Threading.Thread.Sleep(2000)
                End If

                If Not System.IO.File.Exists("C:\PDFs\pdf.pdf") Then 'shows error message
                    MsgBox("Error creating PDF. Please try again")
                    Exit Do
                End If
            Loop

            'sets default printer name
            Shell(String.Format("rundll32 printui.dll,PrintUIEntry /y /n ""{0}""", DefaultPrinterName))

            'saves file as
            Dim saveFileDialog As New SaveFileDialog()
            saveFileDialog.Filter = "PDF files (*.pdf)|*.pdf|All files (*.*)|*.*"
            If saveFileDialog.ShowDialog() = DialogResult.OK Then 'if OK clicked
                FileName = saveFileDialog.FileName 'get file name and move to new location/name
                FileNameOnly = System.IO.Path.GetFileName(FileName)
                Try

                    If IO.File.Exists(FileName) Then 'if file exists it deletes it before saving
                        IO.File.Delete(FileName)
                    End If

                    IO.File.Move(AttachmentName, FileName)
                Catch ex As Exception
                    MsgBox(Err.Description)
                Finally
                    Shell(String.Format("rundll32 printui.dll,PrintUIEntry /y /n ""{0}""", DefaultPrinterName))
                End Try
            Else 'user clicked cancel
                FileName = ""
            End If

            Maintain__Loading.Dispose()

            'GETS TO HERE AND AFTER THIS I GET THE ERROR MESSAGE DISPLAYED IN THE IMAGE ABOVE

            If IO.File.Exists(FileName) Then
                Try
                    Send_Email()
                Catch ex As Exception
                    MsgBox(Err.Description)
                End Try
            Else
                If Not FileName = "" Then MsgBox("An error has occured. Please try again")
            End If

            Shell(String.Format("rundll32 printui.dll,PrintUIEntry /y /n ""{0}""", DefaultPrinterName))

            PhysicallyPrintedOrEmailed = True
    End If 'Printmode = Email

問題を解決すると思われるスレッドを見つけましたが、残念ながら解決しませんでした: COM オブジェクトをキャストできません - Microsoft Outlook & C#

どんなアドバイスでも大歓迎です

4

2 に答える 2

0

私はこれを解決することができました。おそらく最善の方法ではありませんが、Outlook を再インストールしたところ、問題は解決しました。インストールされている別のプログラム (Outlook の連絡先を電話と同期するプログラムである可能性が最も高い) によって何かが破損したと思われます。とにかくありがとう :)

于 2013-04-05T12:05:30.557 に答える
0

プログラム ファイルの場所へのパスをハードコーディングしたため、これを 32 ビット マシンで実行している場合、PDFCreator.exe が見つかりません。

Environment.GetFolderPathハードコーディングする代わりに、マシン上のパスを見つけるために使用します。

また、全体をブロックでラップして、予期Try Catchしない場所にエラーがあるかどうかを確認すると役立つ場合があります

于 2013-04-04T11:29:49.433 に答える