VB2010にてアクセス2000のレポートを以下の構文で表示させています。
Dim acc As Object = CreateObject("Access.Application")
acc.Visible = True
Dim de As Object = acc.DBEngine
Dim db As Object = de.OpenDatabase(DataMdb, False, False, ";PWD=" & SPass) 'SPass=パスワード
acc.OpencurrentDatabase(DataMdb)
acc.DoCmd.RunCommand(10) ' ウィンドウの最大化
db.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(db)
System.Runtime.InteropServices.Marshal.ReleaseComObject(de)
Dim doCmd As Object = acc.DoCmd
Const acViewPreview As Integer = 2
doCmd.OpenReport(RepName, acViewPreview)
doCmd.Restore()
doCmd.Maximize() 'レポートの最大化
System.Runtime.InteropServices.Marshal.ReleaseComObject(doCmd)
System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)
今までこれで、レポートのプレビュー画面を表示させていました。
ところが、アクセス側でレポートに日付(挿入→日付と時刻)を配置してあったのを削除したところ、VBからアクセスを起動しても、開いた直後に閉じてしまうようになりました。再度日付を配置すると、表示されるようになります。どうしても原因がわかりません。
詳しい方いましたら教えてください。よろしくお願いいたします。
なお、OSはXPです。
再度、調査したところ元々、日付かページ数のいづれかがレポートに配置
されていた場合、それを削除してしまうと上記のような現象が起こるみたい
です。日付とページ数を両方配置している場合はどちらか一方を削除した場合は現象は起こらないですが、両方削除すると起こります。
上記の構文に問題があるのか、Access側の問題なのかもわかりません。
一応Accessで直接レポートを開くことはできます。
VBから起動したときだけ、この現象が起こるみたいです。
追記:
最後の構文の
System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)
の部分でアクセスが終了してしまうようです。
これをしないとプロセスが残ってしまうので必要ですが、なぜこの構文
で、レポートによって、アクセスが終了する場合とプレビュー画面のまま
の場合があるのでしょうか?
CreateObject するのを止めて、Process.Start 等で起動してから
GetObject で拾いなおすようにしてみては如何でしょうか?
アクセスファイルにパスワードをかけているのですが、Process.Start の場合パスワードを聞いてこられます。
パスワードの入力なしに起動はできないでしょうか?
Process.StartでAccessを起動する場合の起動時オプション一覧です。
http://www.geocities.jp/masa7251/tips/access/acs00038.html
> Process.StartでAccessを起動する場合の起動時オプション一覧です。
Process.Start 経由ではパスワードを指定できません。
一応、/pwd というオプションはありますが、これは
ユーザーレベルセキュリティのパスワード指定であって、
データベースファイルのパスワード指定ではありません。
> Dim de As Object = acc.DBEngine
パスワード指定を DAO の OpenDatabase 経由で行っているようですが、
それを OpenCurrentDatabase メソッドにしてみた場合はどうでしょうか?
Dim acc As Object
'If CheckBox1.Checked Then
' 'GetObject法
' Dim p As Process = Process.Start("msaccess")
' p.WaitForInputIdle()
' acc = GetObject(, "Access.Application")
'Else
'CreateObject法
acc = CreateObject("Access.Application")
acc.Visible = True
'End If
DataMdb = "C:\temp\test.mdb"
SPass = "sato-c"
acc.OpenCurrentDatabase(DataMdb, , SPass)
Dim doCmd As Object = acc.DoCmd
doCmd.RunCommand(10) '最大化
Const acViewPreview As Integer = 2
doCmd.OpenReport("REPORT1", acViewPreview)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doCmd)
'acc.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)
教えていただいた方法で試してみましたが、結果は同じでした。
最終手段としては、日付・ページ数は消さずに可視のプロパティをいいえにしてやり過ごすしかないかなと考えています。
ツイート | ![]() |