• 締切済み

「AccessViolationException」と出てしまい、困っています

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 & "'") どこか記述がおかしい所があるのでしょうか。ご教授よろしくお願いします。

  • mnk
  • お礼率100% (3/3)

みんなの回答

  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.1

興味がわいたのでちょっとサンプル作成... 「じゃんぬねっと」さんのページを拝見しながら、書いたので参照リリース漏れは無いはず.... COM オブジェクトの参照カウントを解放する http://jeanne.wankuma.com/tips/programing/releasecom.html このサンプルはレポートを表示してから、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

mnk
質問者

お礼

AlexSunsさん、回答ありがとうございます。 >>app.OpenAccessProject(Accessファイルのパス) >と記述していますが、「Accessファイルのパス」の拡張子は"adp"ですか? >たぶん、「Accessファイルのパス」と記述しているので >app.OpenCurrentDatabase(Accessファイルのパス) >と記述しなければならないのでは? Accessファイルと書いてしまいましたが、プロジェクト(adp)でした。申し訳ありません。 クリスタルレポートも考えたのですが、現在私が持っているのがVisualStudio Standardで、 クリスタルレポートがついていないので、やむを得ずAccessのレポートを使おうと思ったのです。 それで、早速試してみたところ、Access2003が入っているパソコンだとレポートを見ることができました。 ところが、Access2000のパソコンだとやはり「AccessViolationException」と出てしまいます。 Accessのバージョンの違いによるものなのでしょうか。

mnk
質問者

補足

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

関連するQ&A

  • VB6.0でパスワードのかかったAccsessを開く

    VB6.0を使って簡単なプログラムを作成しているのですが、 アクセスのレポートをプログラムから使用したいため下の関数を作りました。ところが、今扱いたいDBがパスワードがかかっているため、毎回パスワードを聞かれてしまいます。どうにかパスワードをプログラムから引き渡せないでしょうか? Public Function usrAccessRpt(strRptName As String, intMode As Integer) As Integer On Local Error GoTo usrAccessRpt_Err Dim AccessAp As New Access.Application 'データベースファイルのOPEN AccessAp.OpenCurrentDatabase App.Path & "\db1.mdb", False 'レポート出力 If intMode = acViewNormal Then AccessAp.DoCmd.OpenReport strRptName, acViewNormal AccessAp.CloseCurrentDatabase Else AccessAp.DoCmd.Maximize AccessAp.DoCmd.OpenReport strRptName, acViewPreview AccessAp.Visible = True End If Exit Function usrAccessRpt_Err: usrAccessRpt = 1 End Function

  • access2000で作成したVisual Basicがaccess2007で使えないのはなぜ?

    教えてください。 access2000で作成したVisual Basicがaccess2007で使えないのです。 フォームにボタンを設定し、(1)(2)ボタンをクリックすればイベントを行う機能にしました。 (1)検索  DoCmd.OpenReport "レポート名", acViewPreview, "フィールド名" (2)印刷  DoCmd.OpenReport "レポート名", acViewNormal, "フィールド名" もちろんセキュリティオプションでコンテンツを有効にしています。 なぜか、関連付けされていないオブジェクトにフォームが入っています。 2000ではできるのに、なぜか2007ではできません。 どうしてでしょうか。教えていください。

  • AccessVBAについての質問

    こんにちわ。 Access VBAについて質問します。 フォーム上で、DoCmd.OpenReportを使用して、 テーブルの中身全てをレポート表示しているので すが、IDの何番~何番までを表示するといった処理を するにはどのようにすればよいでしょうか? 下記は、作成途中のPGです。 Private Sub cmdPrev_Click() Dim jyoken1 As String jyoken1 = "コード=" & cmbCode1 DoCmd.OpenReport "マスタ一覧表", acViewPreview, , jyoken1 End Sub これでは、cmbcode1へ入力されたデータのみの抽出 になってしまうので、範囲抽出ができるように改良 してください。お願いします!!

  • Accessのレポート印刷について教えて下さい。

    Accessのフォームでフィルタを使い絞り込んだデータをレポートで 印刷する場合について教えて下さい。 DoCmd.OpenReport "レポート名", acViewPreview, , Me.Filter では、フォームとレポートが同じレコードソースだと使えるという事ですが、 フォームとレポートのレコードソースが別の場合はどのようにすると フィルタで絞り込んだ条件のレポートを印刷できますか? 教えて下さい。よろしくお願いします。

  • Accessのコード入力

    アクセス初心者です。 レポート内の検索結果を再びレポートで表示したいため、フォームのコードで下記のようにしたのですが、フォームで前後の文字を入れなくても検索できるようにするにはどのようにしたら良いでしょうか。 (テーブルなどで検索する時の、*a* のような感じです) DoCmd.OpenReport "R1", acViewDesign Reports!R1.FilterOn = True Reports!R1.Filter = "[a]='" & Me.テキスト1.Value DoCmd.OpenReport "R1", acViewPreview 宜しくお願い致します。

  • ACCESSフォームフィルタで抽出したデータのみをレポートで表示する方法

    フォームフィルターでデータを抽出した後,抽出されたデータのみをレポート上に表示させるコマンドボタンをフォーム上に作っています。 下記のコードを作成しましたが,これだと抽出前の全部のデータが表示されてしまいます。 どうしたら良いでしょうか。 Private Sub ラベルプレビュー_Click() Dim stDocName As String DoCmd.Echo False, stDocName = "rpt宛名ラベル" DoCmd.OpenReport stDocName, acViewDesign DoCmd.SelectObject acReport, stDocName, False ' Reports(stDocName).RecordSource = Me.RecordSource DoCmd.OpenReport stDocName, acViewPreview End Sub

  • アクセス 開いているレポート名を取得する。

    アクセス初心者です。 VBAにて フォーム1でレポート、レコードを選択後に レポートを開くと同時に印刷フォームも開くように組んでます。 その印刷フォームで印刷をすると、印刷フォーム自体が印刷されてしまうので ”レポート名”を認識させてから印刷しています。 その時の”レポート名”を開いたときに自動的に変数として印刷フォームに引き継ぎたいのですが やり方が分かりません。 意図としては、印刷フォームを汎用的に使いたいためです。 印刷フォームの呼び出しコードは下記にて Private Sub コマンド18_Click() Dim report_name As String Dim report_value As String If Not IsNull(コンボ50.Value) = True Then report_name = コンボ48.Value  ’レポート名です report_value = コンボ50.Value DoCmd.OpenReport report_name, acViewPreview, , "[現場名]='" & report_value & "'" DoCmd.MoveSize Width:=10000, Height:=13000 Reports(report_name).ZoomControl = 75 Else MsgBox "項目を選択してください。" End End If DoCmd.OpenForm "印刷_フォーム", acNormal End Sub Private Sub コマンド53_Click() Dim new_date As String Dim form_name As String If Not IsNull(コンボ48.Value) = True Then form_name = コンボ48.Value DoCmd.OpenForm form_name, acNormal, , , acFormAdd DoCmd.MoveSize Width:=12000, Height:=13000 Else MsgBox "[取引先名]を入力してください。" End If End Sub 下記は印刷フォームにて、印刷設定をする場合のコードです Private Sub コマンド0_Click() Dim report_name As String report_name = "レポート名" On Error Resume Next DoCmd.SelectObject acReport, report_name, True DoCmd.RunCommand acCmdPrint End Sub

  • ACCESS でフォームフィルターをレポートに引き継ぐ方法

    こんにちは。 いつもありがとうございます。 現在、ACCESSで名簿管理ソフトを作っています。 フォームで条件を指定し、該当する人を抽出できるようになっているのですが、その条件をそのままレポートのソースに使用するにはどうれすばいいでしょうか? DoCmd.OpenReport "rpt_名簿", acViewPreview,, Me.Filter としているのですが、実行時エラー 438が出てしまいます。

  • ACCESSのレポートについて

    ACCESSでフォームから印刷ボタンを押すとレポートの印刷プレビューが表示されるという簡単なアプリケーションを作成したんですが、レポートの余白・向きを保存→アクセスを終了→アクセスを起動→レポートを表示→レポートを閉じる→レポートを表示という操作をすると、ページ設定で設定し保存した余白・ページの向きが元に戻ってしまいます。どうすればちゃんと保存できるのでしょうか? ちなみにDoCmd.OpenReport "hoge", acViewPreviewでレポートを表示させてます。

  • アクセスのMDEファイルでレポート印刷したい。

    MDEファイルからレポート印刷できません。 下記構文の下から4行目「acViewDesign」を開けないからだと思います。 回避しようと「acViewDesign」を省くようにいろいろ試みているのですが、 レポート印刷はできるようになっても、 レポート内容(詳細セクション)が空になってしまいます。 どなたかご教授くだされば幸いです。 よろしくお願いいたします。 ---------------------------------------------------------------------- Dim strDate As String strDate = "#" & Month(Me.txt日付) & "/" & Day(Me.txt日付) & "/" & Year(Me.txt日付) & "#" Sql = "SELECT * FROM q棚卸_結果表示 WHERE 日付 = " & strDate & " " & strWhere & "ORDER BY メーカー名, カナ" DoCmd.OpenReport "r棚卸_結果表示", acViewDesign [Reports]![r棚卸_結果表示].[RecordSource] = Sql DoCmd.OpenReport "r棚卸_結果表示", acViewPreview End Sub ----------------------------------------------------------------------

専門家に質問してみよう