LoginSignup
4
4

More than 5 years have passed since last update.

ACCESS2013 Access 2016 でAccess2003の新しいMDBファイルを作る

Last updated at Posted at 2017-06-23
CreateAccessDataBase.ps1
# https://gallery.technet.microsoft.com/office/28a08699-7d60-492c-bc97-d6456a6c3739
# Set-ExecutionPolicy RemoteSigned -Scope Process -Force
# Success Windows 10 Access 2013(32bit)
# Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントインストール済み
# QiiQ From Qiita
# CreateAccessDataBase.ps1
Function Check-Path($Db)
{
If(!(Test-Path -path (Split-Path -path $Db -parent)))
{
Throw "$(Split-Path -path $Db -parent) Does not Exist"
}
ELSE
{
If(Test-Path -Path $Db)
{
Throw "$db already exists"
}
}
} # Check-Path関数の終わり

Function Create-DataBase($Db)
{

$application =New-Object -ComObject Access.application
$application.NewCurrentDataBase($Db,10)
$application.CloseCurrentDataBase()
$application.Quit()
} # Create-DataBase関数の終わり

Function Invoke-ADOCommand($Db, $Command)
{
$connection = New-Object -ComObject ADODB.Connection
#$connection.Open("Provider= Microsoft.Jet.OLEDB.4.0;Data Source=$Db")
$connection.Open("Provider= Microsoft.Ace.OLEDB.12.0;Data Source=$Db")
$connection.Execute($command)
$connection.Close()
} # Invoke-ADOCommand 関数の終わり

# *** スクリプトのエントリポイント***

$Db =  [Environment]::GetFolderPath('Desktop') + "\TEST2003.mdb"
$table = "MyTest"
$Fields = "F1 Counter, F2 Date, F3 Integer, F4 Text"
$command = "Create Table $table `($Fields`)"

Check-Path -db $Db
Create-DataBase -db $Db
Invoke-ADOCommand -db $Db -command $command

Access 2003 のMDBファイルは作成できる

以前、
Access 2016(64 bit +win10Home)でmdbファイルは開ける MS Access 2013 Later can Open mdb file
という記事がかなりアクセス数が多く、実は一番参照されているようだ。
今回は97は無理だが、2003はできた

今回のOSとAccessのバージョン

Access2013(32bit) + Windows 10
Access2016(64bit) + Windows 10
の2種類。というのも上記のパワーシェル版は2016は失敗するからだ。

Access2013は公式サイトの書き換えで成功する

上記のパワーシェルスクリプトは
Hey, Scripting Guy! Windows PowerShell を使用して Office Access データベースを作成する方法はありますか
のものだが、1行書き換えないと動かなかった。
それは
\$connection.Open("Provider= Microsoft.Jet.OLEDB.4.0;Data Source=\$Db")

\$connection.Open("Provider= Microsoft.Ace.OLEDB.12.0;Data Source=\$Db")
に書き換えるという点である。

Access 2016 64 bitはVBAなら可能

しかし、このPowershell ScriptはAccess 2016 64bitではエラーになった。
しかもDao3.6に参照設定をすることができなくなっている。(下記:フィロの村note参照)
しかし、実際はその必要がないようだ。

VBAの場合は以下のライブラリに参照設定していること

Microsoft Office 2016 Access database engine object Library
C:\Program Files\Common Files\Microsoft Shared\Office16...
この先は読めない。どうも隠しフォルダのようだ。エクスプローラーで開いても見えない。
この参照設定で作成できる
そして以下のコードでE:\にtest36.mdbができる
このMDBファイルはAccess 2002-2003形式である

CreateDao36Db
Sub test()
Dim db As DAO.Database
Dim ws As DAO.Workspace
Dim DE As DAO.DBEngine
Set ws = DBEngine.Workspaces(0)
Const DbName = "E:\test36.mdb"
ws.CreateDatabase DbName, dbLangJapanese, dbVersion40
End Sub

Access2016 AdoxでできるMDBファイル

次のAdoxへの参照設定がカギである

Microsoft ADO Ext. 6.0 for DDL and Security
C:\Program Files\Common Files\System\ado\msadox.dll

そのうえで以下のコードを実行する

上記のDaoより時間がかかる
しかしAccess2007-2016形式のmdbファイルが作成される

adoxtest2016
Sub adoxtest()
Dim Cat As ADOX.Catalog
Set Cat = New ADOX.Catalog
  Cat.Create "Provider= Microsoft.Ace.OLEDB.16.0;Data Source=F:\db216.mdb;Jet OLEDB:Encrypt Database=False;"
  Set Cat = Nothing
End Sub

Access2013

adoxtest2013
Sub adoxtest()
Dim Cat As ADOX.Catalog
Set Cat = New ADOX.Catalog
  Cat.Create "Provider= Microsoft.Ace.OLEDB.15.0;Data Source=F:\db213.mdb;Jet OLEDB:Encrypt Database=False;"
  Set Cat = Nothing
End Sub

Access2016 64Bitのエラーの原因をみていく

DAO

dbVersion40はdbVersion36のようにそれ以前のバージョンを指定するとエラーになる。
にすると「インストール可能なISAMドライバーが見つかりませんでした」
というエラーが出る。
しかし
Access 2000 でファイルをインポート、エクスポート、またはリンクすると、エラー メッセージ "インストール可能な ISAM ドライバが見つかりませんでした" が表示されるか、一部のファイルの種類が表示されない
にあるようなレジストリ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel
はJet以下がそもそもないためこのヘルプはWindows10では無効なようだ。
そこで、さらに手動で調べると、Windows10で以下が上記に対応するらしい
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Jet 3.x
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\ISAM Formats
このJet 3.xのレジストリの値からすると、C:\Program Files\Common Files\microsoft shared\OFFICE14\ACER3X.DLL
がJet臭いとしているが、参照設定はできない。
Access 2013 で廃止、変更された機能

Jet 3.x IISAM ドライバーのサポートが削除されたのは、このドライバーが提供されなくなったためです。

また
Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントのインストールによって、Access2010の接続文字列Microsoft.Ace.OLEDB.12.0が使えるようになる。

ADOX

以下のような昔のADOXのVBAのコードの接続文字列ではJet.OLE.4.0というクラスがないというメッセージがでてエラーになる
ADOX で Access97 の暗号化されたデータベースを作成するには?
ADOXを用いてAccess2000形式のデータベースを作成する
"Provider=Microsoft.Jet.OLE.4.0;"DataSource=F:\Sample.mdb"
なのでMicrosoft.Jet.OLE.3.5.1などは当然だめで、書き換える必要がある。(下記フィロの村参照)

JET自体の対応はあるのだが再頒布可能コンポーネントが必要

Jet4.0の書き換えについては、
64bit版Windowsでの「Microsoft.Jet.OLEDB.4.0」について
にあるように
Access2013以降の64bit版は
Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントのインストールをインストールしたうえで書き換える。この場合64bitと32bit両方のドライバが必要となる。32bitと64bitを共存させること。

まとめ

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントがインストールすると
Access2016 Access2013ともDaoを用いることでAccess 2002-2003のMDBファイルがつくれる
Access 2013 32BitではMSの公式のPowershellScriptを書き換えるとできる。しかしAccess2016 64bitではできない。
Access97形式のMDBファイルを作成する方法は見つからなかった。やはりISAMが削除された影響と考えられる。
ただしAccess97のMDBファイルを変換することはPowershellによって可能である。

参考

Powershell Socript 元記事

Hey, Scripting Guy! Windows PowerShell を使用して Office Access データベースを作成する方法はありますか
Create Blank Access Database Using Powershell
この記事を作成したあとで実は同様のことがStackoverflowにあった。これからすると
Access 2010でも成功するようだ

使用メソッド

DBEngine.CreateDatabase メソッド (DAO)
Workspace.CreateDatabase メソッド (DAO)
dbVwesion40 dbLangJapanese 等の変数はこのメソッドに解説がある

再配布可能コンポーネント関連

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント
64ビット版Windows環境に、32ビット版/64ビット版双方のMicrosoft Access ODBCドライバを共存させる方法

DAO参照設定関連

【VB6・VBAメモ】DAOの参照先(32bit/64bit)(mdb形式/accdb形式) - フィロの村note

 Access2007以降、上記を残したまま、以下のライブラリが追加されました。
 「Microsoft Office XX.X Access Database Engine Object Library」
 ※XX.XはExcelのバージョンで異なります。(2007→12.0, 2010→14.0, 2013→15.0)
「Microsoft DAO 3.6 Object Library」は、mdb形式への接続はAccessが32bitであれば動作するようですが、Accessが64bitだと動作しない(動作しないどころか参照の選択時にエラーとなる)ようです。
 また、accdb形式への接続の場合も動作しないようです。
これらのような場合は「Microsoft Office XX.X Access Database Engine Object Library」へ参照を変更する必要がありそうです。
(こちらであれば全て動くようなので、むしろ早めに移行したほうが無難な気がします)

Microsoft.Ace.OLEDB.12.0 は2007からのもの

実行時にMicrosoft.ACE.OLEDB.12.0プロバイダーはローカルコンピュータに登録されていませんが出てしまう
2007 Office system ドライバ: データ接続コンポーネント
Office 2007 用はこちらからダウンロードする それ以降は上記のものをダウンロードする
sp_addlinkedserver (Transact-SQL)

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4