Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : 指定なし)
ExcelVBAで、"JRO.JetEngine" がエラーになる
投稿日時: 21/11/07 15:02:49
投稿者: WinArrow
投稿者のウェブサイトに移動

Excel2019です。
 
最初の開発環境は、OFFICE 2017です。
AccessMDBを処理の最後に最適化するコードを記述してあります。
64Bit & VBA7になったが、エラートラップでスキップしていたので、
気がつっかなかったが、
 
>Set objJRO = CreateObject("JRO.JetEngine")
でオブジェクトがないというエラーになってしまいました。
 
対処法を教えてください。

投稿日時: 21/11/07 17:31:15
投稿者: WinArrow
投稿者のウェブサイトに移動

↑の説明で
開発環境:Excel2007をExcel2017はと書いてしまいました。
  
原因が、分かりました。
Excel2019は、[Microsoft.ACE.OLEDB.12.0]がサポートされている。
その「Microsoft.ACE.OLEDB」では、「JRO.JetEngine]をサポートしていない
ということが分かりました。
  
対応方法は調査中です。

回答
投稿日時: 21/11/08 09:23:22
投稿者: Suzu

引用:
開発環境:Excel2007をExcel2017はと書いてしまいました。

 書いてはいないですよね??
 
手元では 確認ができない 環境なのですが、
事前バインディング
実行時バインディング
どちらでしょうか?
 
JROの参照設定は、
Microsoft Jet and Replication Objects
だったのでは?
 
実行時バインディングであり、
JRO の dll がなく CreateObject にて失敗する という事なんでしょうか?
 
 
引用:
対応方法は調査中です。

最適化 が行いたいのであれば、 JRO ではなく、DAOで良いと思いますが。。。
 
 
余談です。
32bit Windows時代、DAO 3.6 を使用し、Accessがインストールされていないマシンにおいて
VBS にて、Accessファイルに対し最適化を行う処理を行っていました。
(バックアップ、容量圧縮、自動インクリメントの初期化目的)
 
64bit OS に乗り換えると、エラーになりました。
調べたところ、VBSファイルをダブルクリックだけでは は、64bit にて 実行される事になり
32bit しか用意されていない DAO3.6 ではエラーになる事が発覚
 
C:\Windows\SysWOW64\cscript.exe 経由にて、VBSを実行させる為、
BATファイル契機に変え、無事最適化する事が出来たのですが、
インクリメントの初期化が出来ていない事が判明。。
 
Access再頒布可能コンポーネント をインストールするのが面倒だったので
VBS ではなく、Excelから、DAO 12.0を使用し処理に変え、インクリメント初期化に成功しました。

投稿日時: 21/11/09 22:44:37
投稿者: WinArrow
投稿者のウェブサイトに移動

Suzu さんの引用:

引用:

開発環境:Excel2007をExcel2017はと書いてしまいました。

 書いてはいないですよね??

  
そうでした。
Office2017って書いていました。
同じ書き方をするならば、OFFICE2007です。
  
  
Suzu さんの引用:

手元では 確認ができない 環境なのですが、
事前バインディング
実行時バインディング
どちらでしょうか?

  
実行時バインディングです。
  
  
Suzu さんの引用:

 
実行時バインディングであり、
JRO の dll がなく CreateObject にて失敗する という事なんでしょうか?

  
そうです。その通りです。
  
Suzu さんの引用:

 
最適化 が行いたいのであれば、 JRO ではなく、DAOで良いと思いますが。。。

 
情報ありがとうございました。
試してみました。
コードは↓
 
    Private Sub Command0_Click()
    Dim objDAO As Object
    Const srcMDB As String = "D:\TEST\名簿管理.mdb"
    Const decMDB As String = "D:\TEST\名簿管理TMP.mdb"
    Const dbLangJapanese As String = ";LANGID=0x0411;CP=932;COUNTRY=0"
    Const dbVersion120 = 128
    Const psw As String = ";pwd=xxxxxx"
    Set objDAO = CreateObject("DAO.DBEngine.120")
    objDAO.CompactDatabase srcMDB, decMDB, dbLangJapanese & psw, dbVersion120, psw
 
    End Sub

これで、最適化できたと思うんですが、・・・・
なぜか、ファイル容量が、最適化前のより、最適化後の方が大きくなっている?
 
内容を確認してみたが、問題はなさそう!!
ファイル容量が増えるところに違和感があります。

回答
投稿日時: 21/11/10 10:05:59
投稿者: Suzu

引用:
そうでした。
Office2017って書いていました。
同じ書き方をするならば、OFFICE2007です。

 
開発環境として、2007 で 実行環境が 2019 でしょうかね。
 
 
引用:
Suzu さんの引用:

 
実行時バインディングであり、
JRO の dll がなく CreateObject にて失敗する という事なんでしょうか?

  
そうです。その通りです。

 
了解しました。
 
 
引用:
    Private Sub Command0_Click()
    Dim objDAO As Object
    Const srcMDB As String = "D:\TEST\名簿管理.mdb"
    Const decMDB As String = "D:\TEST\名簿管理TMP.mdb"
    Const dbLangJapanese As String = ";LANGID=0x0411;CP=932;COUNTRY=0"
    Const dbVersion120 = 128
    Const psw As String = ";pwd=xxxxxx"
    Set objDAO = CreateObject("DAO.DBEngine.120")
    objDAO.CompactDatabase srcMDB, decMDB, dbLangJapanese & psw, dbVersion120, psw
 
    End Sub

これで、最適化できたと思うんですが、・・・・
なぜか、ファイル容量が、最適化前のより、最適化後の方が大きくなっている?
 
内容を確認してみたが、問題はなさそう!!
ファイル容量が増えるところに違和感があります。

 
ファイルサイズについては、
最適化によって、増える事が無いわけではありません。
 
気になるのであれば
Const strFolder As String = "C:\DATA\Access\Temp\"
Dim DBEng As Object
Dim WS As Object
Dim db As Object
Dim Tdef As Object
 
Dim strFileName As String
 
strFileName = Dir(strFolder & "*.mdb")
 
Set DBEng = CreateObject("DAO.DBEngine.120")
Set WS = DBEng.CreateWorkspace("", "Admin", "", dbUseJet)
Do While strFileName <> ""
  Set db = WS.OpenDatabase(strFolder & strFileName)
  Debug.Print strFileName & vbTab & db.Version
  For Each Tdef In db.TableDefs
    If Tdef.Name Like "MSys*" Then
      Debug.Print vbTab & Tdef.Name
    End If
  Next
  db.Close
  strFileName = Dir()
Loop
 
で、指定フォルダ内の mdb のファイル毎に
 バージョン 隠しシステムオブジェクト テーブル を デバッグウィンドに吐き出しています。
 
比べてみてください。
 
特に、ファイルバージョン を、
 Const dbVersion120 = 128
で 12.0 に変えていますので、
 
その関係で システムオブジェクトが増えていないか確認ください。
 
 
余談 で、余計な事を考えさせてしまったかもしれません。
64bit OS 上で、VBS実行であるなら、DAO 3.6 は使用できない と言うことをだけですので
VBA上であれば、DAO 3.6 は使用できます。
 
ファイルバージョンが、4.0 であれば、ACE 12.0 ではなく DAO 3.6でも良いです。
試した限りでは、 ACE 12.0 にて、dbVersion40 を指定したのが 小さかったです。

投稿日時: 21/11/10 11:15:40
投稿者: WinArrow
投稿者のウェブサイトに移動

アドバイスありがとうございます。
 
環境変更経緯
          開発       実運用
    OFFICE  OS OFFICE OS
最初  2000 WinXP 2000 WinXP
変更1 2007 Win2000 2007 Win7
変更2 2007(32) Win10(32) 2007 Win7
変更3 2019(64) Win10(64) 2007 Win7
 
※変更3が現状です。
※変更2→変更3の理由は、変更2のPCのHDD故障してしまい。
 少し前に購入してあったPC(64bit)に、急遽、乗り換え・・・64bit対応したが、
 その時点でエラートラップで回避していたため、JRO非対応に気が付きませんでした。
 但し、実運用PCでは、JROが機能しています。
※既発PCには、Accessアプリ有、実運用PCには、Accessアプリ無
※実運用PCは、ネット環境も無し
 
 
dbVersion40に変更して、テストしてみました。
ファイル容量は、変わりませんでした。
テストで使用したファイルが最適化後のファイルでしたので、問題ないと思います。
 
これで、すっきりしました。
ありがとうございました。
 
 
 
 
 
 

回答
投稿日時: 21/11/10 17:30:28
投稿者: Suzu

解決した様でなによりです。
 
確認の際に ResumeNextの エラートラップを外さないと判らないですよね。
開発環境の方が運用環境より新しい場合に起こる事の一つですね。
 
実運用が 2007 との事ですので、ファイルバージョン は 12.0 でも大丈夫ですね。
 
JET 4.0 であれば、最適化のためのツールも配布されている様です。
 
Jet compact ユーティリティはダウンロード センターで利用できます
https://docs.microsoft.com/ja-jp/office/troubleshoot/access/jet-compact-utility-download
JETCOMP.exe
 
 
今更ですが。。
 

引用:
Excel2019は、[Microsoft.ACE.OLEDB.12.0]がサポートされている。
その「Microsoft.ACE.OLEDB」では、「JRO.JetEngine]をサポートしていない
ということが分かりました。

 
JROでDBを最適化する(CompactDatabaseメソッド)
https://www.moug.net/tech/acvba/0070029.html
 
JROも 32bitまでだったはずですが、実行時ではなく事前バインディングであれば
通ると思いますよ。
 
JROでDBを最適化する(CompactDatabaseメソッド)
https://www.moug.net/tech/acvba/0070029.html
 
を、参考に
32bit版 Excel2019 の VBE から参照設定なしで で 実行できました。
 
Dim strOldConnect As String
Dim strNewConnect As String
Dim objJRO As Object
Set objJRO = CreateObject("JRO.JetEngine")
strOldConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=C:\〜〜.mdb"
strNewConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=C:\〜〜Tmp.mdb"
' 最適化(JRO使用)
objJRO.CompactDatabase strOldConnect, strNewConnect
' 参照をクリア
Set objJRO = Nothing
 
プロバイダ は、ACE だと 64bit になるので、32bitで通す為、JET.OLEDB にしています。

投稿日時: 21/11/10 22:42:06
投稿者: WinArrow
投稿者のウェブサイトに移動

いろいろな情報ありがとうございます。
 
実運用環境は、開発環境とは離れた場所にあり、
操作する人も、職場リタイアした人(スキルは、ピンキリ)、毎年交代します。
また、ネット環境がないので、ツールを揃えることができないし、使いこなせない。
将来、実運用PCのバージョンアップが必要と考えているが、
かなり難しいのが実態です。
 
開発環境は、私のPCで、64bitでテストでOKでも、実運用PCで、動くとは限らないので
難儀しています。
 
おかげさまで、先が見えたので、これから、最適化プロシジャの改造を検討します。
 
ありがとうございました。
これで、閉じます。