VBからAccess2003のレポートプレビュー

解決


さとし  2012-06-01 18:05:20  No: 147619  IP: 192.*.*.*

はじめまして。
VisualBasic2010 で  Access2003内で作成しているレポートのプレビューを
したいのですが、Accessファイルにはパスワードがかかっています。
Accessさえ起動できれば、マクロで自動で指定したレポートプレビュー
が表示されるような仕組みは作っています。
何かよい方法はないでしょうか?

やむを得ない場合はパスワードを解除することも考えていますが、セキュリティが心配なので、最終手段と考えています。

編集 削除
魔界の仮面弁士  2012-06-02 01:46:14  No: 147620  IP: 192.*.*.*

実行環境に Access はインストールされているのですよね?

Access をオートメーション操作しているのであれば、mdb を開く時に
OpenCurrentDatabase メソッドを利用しているかと思いますが、その
第3引数にて、パスワードを指定することができます。

あるいは、Process.Start 等で msaccess.exe を起動しているのであれば、
/pwd パラメータにてパスワードを指定できます。
http://office.microsoft.com/ja-jp/access-help/HA010166605.aspx

編集 削除
さとし  2012-06-02 08:14:53  No: 147621  IP: 192.*.*.*

まずは、ご教授ありがとうございました。
パスワードが aaaa の場合、
教えていただいたページでを参考に、Windows(XP)のファイル名を指定して
実行より、msaccess.exe /ro "D:\Sdata.mdb" /pwd aaaa で実行してみたのですが、accessが起動し、ログオン  で名前とパスワードを求められてしまいました。そこでパスワードを  aaaaと入力しても開かず、またWindowsのログインパスワードを入れても起動しませんでした。
また、これをProcess.StartでVB.NET で実行する場合、
Process.Start("msaccess.exe", "D:\Sdata.mdb")  にパスワード  aaaa は構文的にどう入れ込むのでしょうか?

編集 削除
魔界の仮面弁士  2012-06-02 14:59:08  No: 147622  IP: 192.*.*.*

> まずは、ご教授ありがとうございました。
http://www.tt.rim.or.jp/~rudyard/torii009.html

> msaccess.exe /ro "D:\Sdata.mdb" /pwd aaaa で実行してみたのですが
/pwd に指定するのは、JET のユーザーレベルセキュリティのパスワードでしたね。

mdb 自体にかけられたパスワードの方を指定する場合は、
> OpenCurrentDatabase メソッドを利用しているかと思いますが、その
> 第3引数にて、パスワードを指定することができます。
を用いてみてください。

たとえば、
  Dim acc As Object = CreateObject("Access.Application")
  acc.Visible = True
  acc.OpenCurrentDatabase("C:\temp\test.mdb", , "aaaa")
  MsgBox("レポートを表示します")
  Dim doCmd As Object = acc.DoCmd
  Const acViewPreview As Integer = 2
  doCmd.OpenReport("レポート1", acViewPreview)
  System.Runtime.InteropServices.Marshal.ReleaseComObject(doCmd)
  MsgBox("終了します")
  acc.Quit()
  System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)
のような感じです。


ただし OpenCurrentDatabase は、パスワードの間違いを検出できません。
(間違っていた場合、パスワード入力画面が表示されます)

パスワード指定の成否も検出したい場合は、DAO の OpenDatabase メソッドを併用します。
こちらの場合、間違わったパスワードの場合に例外が発生するため、それを
Catch することで、パスワードの入力ミスを検出できます。

  Dim acc As Object = CreateObject("Access.Application")
  acc.Visible = True
  Dim de As Object = acc.DBEngine
  Dim db As Object = de.OpenDatabase("C:\temp\test.mdb", False, False, ";PWD=aaaa")
  acc.OpencurrentDatabase("C:\temp\test.mdb")
  db.Close()
  System.Runtime.InteropServices.Marshal.ReleaseComObject(db)
  System.Runtime.InteropServices.Marshal.ReleaseComObject(de)
  MsgBox("レポートを表示します")
  Dim doCmd As Object = acc.DoCmd
  Const acViewPreview As Integer = 2
  doCmd.OpenReport("レポート1", acViewPreview)
  System.Runtime.InteropServices.Marshal.ReleaseComObject(doCmd)
  MsgBox("終了します")
  acc.Quit()
  System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)

もちろんパスワードが正しい場合は、OpencurrentDatabase だけで十分です。

編集 削除
さとし  2012-06-02 17:14:57  No: 147623  IP: 192.*.*.*

魔界の仮面弁士さんの前回発言の、パスワードの間違いを検出できないやり方では、acc.OpenCurrentDatabase("C:\temp\test.mdb", , "aaaa")
の部分で、指定されたパラメーターの数が期待された数と一致しませんでした。とエラーになりました。
後者のパスワード指定の成否も検出したい場合のやり方でやってみると、うまくいきました。
感謝します。ありがとうございました。

編集 削除
魔界の仮面弁士  2012-06-02 20:50:48  No: 147624  IP: 192.*.*.*

> 指定されたパラメーターの数が期待された数と一致しませんでした
Access 97 や Access 2000 を使っているわけでは無いのですよね?
Access 2003 であればパスワード引数を扱えるはずなのですけれど…妙ですね。


【Access 2000 以下のバージョン】
Sub OpenCurrentDatabase(filepath, Exclusive)

【Access 2002 以上のバージョン】
Sub OpenCurrentDatabase(filepath, Exclusive, bstrPassword)
Sub OpenCurrentDatabaseOld(filepath, Exclusive)  … 非表示属性

編集 削除
さとし  2012-06-03 08:54:15  No: 147625  IP: 192.*.*.*

Accessは2000で開発をしていますが、配布先のパソコンには
2003もあるので両方で対応できたらと思っています。

編集 削除