dポイントプレゼントキャンペーン実施中!

VisualBasic2005でプログラミングしているのですが、
フォームからAccessのレポートを開こうとしたら、
「System.AccessViolationException」というメッセージが出てしまい、
レポートが表示されません。

Dim app As New Access.Application

app = New Access.ApplicationClass()
app.OpenAccessProject(Accessファイルのパス)
app.DoCmd.OpenReport("レポート", Access.AcView.acViewPreview, , "[番号]='" & txt_No.Text & "'")

どこか記述がおかしい所があるのでしょうか。ご教授よろしくお願いします。

A 回答 (1件)

興味がわいたのでちょっとサンプル作成...



「じゃんぬねっと」さんのページを拝見しながら、書いたので参照リリース漏れは無いはず....
COM オブジェクトの参照カウントを解放する
http://jeanne.wankuma.com/tips/programing/releas …

このサンプルはレポートを表示してから、10秒でアクセスごと終了します
そこらへんは工夫が必要ですw

普通にクリスタルレポートを使用したほうが、もうちょっとスマートにいけそうですね
あと、気になったのは
>app.OpenAccessProject(Accessファイルのパス)
と記述していますが、「Accessファイルのパス」の拡張子は"adp"ですか?
たぶん、「Accessファイルのパス」と記述しているので
app.OpenCurrentDatabase(Accessファイルのパス)
と記述しなければならないのでは?

開発環境:WindowsXP+VB2005+Access2003
※ちなみにWindowsVista+VB2005+Access2007でやったら、セキュリティがうんたらかんたら('A`)マンドクセ

Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices
Imports System.IO

Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim acApp As Access.Application = Nothing

    Try
      acApp = New Access.Application

      Dim filePath As String = Path.Combine( _
        Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), _
        "db1.mdb")

      If (File.Exists(filePath)) Then
        acApp.OpenCurrentDatabase(filePath)
        acApp.Visible = True

        Dim doCmd As Access.DoCmd = acApp.DoCmd
        Try
          Dim reportName As String = "testReport"
          doCmd.OpenReport(reportName, Access.AcView.acViewPreview)
          System.Threading.Thread.Sleep(10 * 1000)
        Finally
          Marshal.ReleaseComObject(doCmd)
        End Try

        acApp.CloseCurrentDatabase()
      Else
        Dim message As String = String.Format("指定されたファイルは存在しません「{0}」", filePath)
        MessageBox.Show(Me, message, "IO Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
      End If
    Finally
      If Not acApp Is Nothing Then
        Try
          acApp.Quit()
        Finally
          Marshal.ReleaseComObject(acApp)
        End Try
      End If
    End Try

  End Sub

End Class

この回答への補足

自己解決しました。
「じゃんぬねっと」さんのページが参考になりました。
レポートを開く前に、Accessへ接続していたことが原因だったようです。切断したらAccess2000でも表示されました。
ただ、なぜAccess2003なら大丈夫で、Access2000のときは駄目だったのかはわかりませんが。

AlexSunsさん、ありがとうございました。

補足日時:2007/02/19 18:59
    • good
    • 0
この回答へのお礼

AlexSunsさん、回答ありがとうございます。

>>app.OpenAccessProject(Accessファイルのパス)
>と記述していますが、「Accessファイルのパス」の拡張子は"adp"ですか?
>たぶん、「Accessファイルのパス」と記述しているので
>app.OpenCurrentDatabase(Accessファイルのパス)
>と記述しなければならないのでは?

Accessファイルと書いてしまいましたが、プロジェクト(adp)でした。申し訳ありません。

クリスタルレポートも考えたのですが、現在私が持っているのがVisualStudio Standardで、
クリスタルレポートがついていないので、やむを得ずAccessのレポートを使おうと思ったのです。

それで、早速試してみたところ、Access2003が入っているパソコンだとレポートを見ることができました。
ところが、Access2000のパソコンだとやはり「AccessViolationException」と出てしまいます。
Accessのバージョンの違いによるものなのでしょうか。

お礼日時:2007/02/19 16:01

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