21
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Access 2016(64 bit +win10Home)でmdbファイルは開ける MS Access 2013 Later can Open mdb file

Last updated at Posted at 2016-06-08

いままで誤読していた

Access 2013 で廃止、変更された機能 - Access - Office Support
Access 97 データベースは、Access 2013 では開くことができなくなりました。ファイルをアップグレードする必要があります。これを行うには、Access 2010 または Access 2007 でファイルを開き、.accdb ファイル形式で保存した後、Access 2013 で開きます。
この変更は、Access 97 データベースにリンクされているデータベースにも影響します。
と書いているが、そもそも自分がサポート外だの更新をしろだのと言っておいて何を言っているのだろうかと思っていたが、よく見るとAccess 97 データベースは…と書いてある。
つまりそれ以降のMDBファイルは開ける。
 なお本記事の手法はAccess2.0のMDBには使えません。ただしテーブルとクエリをSQLを用いて変換し、オブジェクトの概要を調べる手法をこちらに公開しました。(2018/7/1追加)

Access実践入門
に住所録 Ver1.0というMDBファイルがあるがこれも開くことはできた。
だがさらに驚くべきことに
Access 97 で作成されたファイルを Access 2013 のファイルに変換する方法
December 23, 2013に Kiyoshi_MasudaによりPowerShellのスクリプトが公開されていた。追記(2019/3/29)参照

Conv.ps1
## Set-executionpolicy Remotesigned -scope Process -Force ##
$db97 = Read-Host "変換したいファイルのパスを指定してください。"
$db2003=[Environment]::GetFolderPath('Desktop') + "\2003.mdb"
$dbLangJpn=';LANGID=0x0411;CP=923;COUNTRY=0'
$dbVer40=0x40
$dbe=New-Object -ComObject DAO.DBEngine.36 #Powershellは変数の宣言は必要ない。 DAO3.6
$dbe.CompactDatabase($db97,$db2003,$dbLangJpn,$dbVer40,$dbLangJpn)
Remove-Variable dbe #変数の削除
Set-ExecutionPolicy Restricted #毎回実行ポリシーの変更が必要

But I think this script is Japanese only. Because Language ID is Japanese.

C ドライブに「conv」フォルダを作成し、前述のファイルを「conv.ps1」の名前で保存
OS が 32bit の場合:%WINDIR%\System32\WindowsPowerShell\v1.0
OS が 64bit の場合:%WINDIR%\SysWOW64\WindowsPowerShell\v1.0
「powershell.exe」を右クリック、「管理者として実行」をクリックします。
実行ポリシーを変更
 Windows PowerShell で「conv.ps1」のフルパスを入力し、Enter
 変換したいファイルのフルパスを入力し、Enter
 最終的にデスクトップに変換されたファイルができあがるという。

$dbLangJpn=';LANGID=0x0411;CP=923;COUNTRY=0

ここを見るとLanguage IDが0x0411(1041)がロケールIDで日本語。そして文字コードがCP932であり、おそらく日本語でかつShift-Jis以外は変換できないのだと考えらえる。
ロケールID一覧LCID
Windows Codepage: 932 (Japanese Shift-JIS)
note このページはなぜかログインが要求される

DAO.DBEngine.36
 これから変換を実行しているのはDao3.6だろう。
DBEngine.CompactDatabase メソッド (DAO)
これをみると適用対象はAccess2013 Laterである。
式.CompactDatabase(SrcName, DstName, DstLocale, Options, password)
が構文
dbVersion40 最適化に Microsoft Jet データベース エンジン バージョン 4.0 のファイル形式を使用するデータベースを作成します。
 とある。
 MSのサイトからするとODBCドライバーの必要もない。最適化しつつデータベースを変換しているようだ。
 構文からするとパスワードがついていても大丈夫かもしれない。
 また、このことからするとロケールIDと言語を合わせれば日本語以外でも変換ができると思うが未実証である。何しろサンプルの入手が困難だ。
 むしろ先のHPのように歴代のサンプルを作ってダウンロードできるようにされている姿勢には頭が下がるところだ。

なお、最後の行
Set-ExecutionPolicy Restricted
で実行ポリシーをもとに戻しているので実行ポリシーの変更はスクリプトを起動するたびに必要となる。
 また学校や会社で実行ポリシーが変更できない人はあきらめる前に
PowerShellのExecutionPolicyのスコープとかについて詳しく

Set-ExecutionPolicy RemoteSigned -Scope Process
からスクリプトを実行することを試してみてほしい。

 これからすると公式はなぜできないと言っているのか。想像だが上記の通り、ロケールIDと文字コードの組み合わせがわからないとパワーシェルのスクリプトで変換ができないから無理なのだと思う。日本語で文句を言ってくる人は日本語LCIDでShift-JISだからなのだろう。

追記

その後さらに見つかった方法

VBScript を32bit で起動することによりJetエンジンを使う方法

以下のスクリプトがJetcompact.vbsというファイル名で
C:\hoge\Jetcompact.vbsにあるものとして
必ず CMD.EXEでコマンドプロンプトを起動し
~~%SystemRoot%\SysWow64\CScript.EXE "C:\hoge\JetCompact10.vbs"
で起動すること
VBScriptを32bit絶対強制起動に変えて、わざわざCscriptから立ち上げなくても起動しなおしてCscriptで動くように改良しました。

上記のPowershellも32bitのPowershell(2018/7/13追加)

OS が 64bit の場合:%WINDIR%\SysWOW64\WindowsPowerShell\v1.0
という部分はPowershellの32Bit版を起動しているということになる。というのもDao3.6は64bit版Powershellでは使えないためである。
Windows Vista Later VBScript Boot 64 bit Or 32 bit with Cscript or WScript Which you want to VBScriptを64bit 32bitのCscript Wscriptの起動を使い分ける

Jetcompact.vbs
Option Explicit
'%SystemRoot%\SysWow64\CScript.EXE "C:\hoge\JetCompact10.vbs"
' 絶対32bit Cscript起動
' ほかの方法で起動してもCscriptに再起動しなおす。
IF LCase(CreateObject("WScript.Shell").Environment("Process").Item("PROCESSOR_ARCHITECTURE"))="amd64" Then
   If InStr(LCase(WScript.FullName),"system32") OR InStr(LCase(WScript.FullName),"wscript.exe") Then
      CreateObject("WScript.Shell").Run """" &  Replace(Replace(LCase(WScript.FullName),"system32","syswow64"),"wscript.exe","cscript.exe") & """ //Nologo """ & WScript.ScriptFullName & """"
      WScript.Quit
   End If
Else
'32bit OSの場合はCscriptにする
   If InStr(LCase(WScript.FullName),"wscript.exe") Then
     CreateObject("WScript.Shell").Run """" & Replace(LCase(WScript.FullName),"wscript.exe","cscript.exe") & """ //Nologo """ & WScript.ScriptFullName & """"
     WScript.Quit
   End If
End If

Const Ac10J10 = 1
Const Ac11J11 = 2
Const Ac20J20 = 3
Const Ac97J30 = 4
Const Ac20J40 = 5
'何も指定しない Access2003形式
Const oldFile = "F:\testType97.mdb"
Const NewFile = "F:\test10_2003.mdb"
Const conP04 = "Provider=Microsoft.Jet.OLEDB.4.0;"

Dim JIRO : Set JIRO = CreateObject("JRO.JetEngine")
Dim strOldConnect : strOldConnect =conP04 & "Data Source=" & oldFile & ";"

'Access2002形式
'Dim strNewConnect : strNewConnect =conP04 & "Data Source=" & NewFile & ";Jet OLEDB:Engine Type =" & Ac20J40 & ";"

Access2003形式
Dim strNewConnect : strNewConnect =conP04 & "Data Source=" & NewFile & ";"
With CreateObject("Scripting.FileSystemObject")
If .FileExists(oldFIle)=False then Wscript.Quit
If .FileExists(NewFile)=True then Wscript.Quit
End With
JIRO.CompactDatabase strOldConnect, strNewConnect
Set Jiro = Nothing

最適化の手法にはDao.compactdatabeseだけではなくJet.compactdatabaseがある
これで
"F:\testType97.mdb"
"F:\test10_2003.mdb"
を行うとAccess2003形式のMDBが出来上がるので、これをAccess2013以降で開き、accdbに保存してもよい。
このJetCompact10.vbsは強力なツールでAccess1.0からAccess2.0Access 95以降の任意の後方mdb変換が可能だ。ただし97を1.0にすると言った過去(前方)変換はできない。詳細は
ACCESS2013以降(64/32bit)でAccess1.0のMDBを作り、Access2003以降のMDBに変換するに記載した
なお、まさかこの方法でWeb上のmdbを変換する方はいないと思うが、下記の情報からそれはできないと考えられる。
[ACC2002] Web サーバーにある mdb が開けない

現象
Access で Web フォルダにある MDB ファイルを開こうとすると、次のエラー メッセージが表示されます。

データ アクセス ページを開けません。
読み込もうとしたファイルは、HTML ファイルとして認識されませんでした。
正しいファイルが選択されなかったか、Web サーバーにないデータベース ファイルを開こうとした可能性があります。

状況
この現象は Jet データベース エンジン (以下 Jet) 4.0 の制限事項です。
原因
Web フォルダへの接続は HTTP 通信で行われますが、Access が使用する Jet 4.0 は、HTTP や FTP 通信でファイルを開く操作をサポートしていません。
なお、表示されるメッセージ 「データ アクセス ページを開けません。」 は、Web サイトにある MDB ファイルを開く場合、Access が Web での使用をデータ アクセス ページを想定しているため、メッセージ内容はデータ アクセス ページ向けの説明内容になっています。
解決方法
以下のどちらかの方法で解決してください。
Web フォルダで MDB ファイルを共有せずに、ネットワーク フォルダで共有します。
エクスプローラで Web ファルダにある MDB ファイルをローカルにコピーしてから開きます。

実験結果(7-zipを用意してください)

http://dekiru.impress.co.jp/download/access95/index.htm
https://web.archive.org/web/20181022113716/dekiru.impress.co.jp/download/access95/index.htm
https://web.archive.org/web/20181022113720/http://dekiru.impress.co.jp/download/access97/index.htm
からaccess07.exeをダウンロードします。これはlzhの自己圧縮形式のようです。Windows10ではWindows8互換とかWindows95互換にしても開けません。
 そこでこれを右クリックから7zipで解凍します。たぶん途中で止まりますがmdbファイルができます。受注管理.MDBです
このファイルを別のドライブに置きます。
 変換先のファイルを受注管理2003.MDBとします。
上記の設定でJetcompact10.vbsを書き換え、コマンドプロンプトで実行します。
受注管理2003.MDBができます。これを開きます。
ここでアップグレードしますか、と聞いてくるのでいったん「いいえ」を選択します。
20180623キャプチャ.JPG

MDBが終了します。(閉じるときに最適化するオプションは使用していません)
再びMDBをダブルクリックして開きます。
accdbにしたいときはこれを名前をつけて保存するでaccdbで保存します。
もし上記画面で「はい」をおしてaccdb形式で保存しようとしても
20180623aキャプチャ.JPG
MysysAccessObjectsテーブルが見詰まりません
というエラーが出て終了しますがAccdbはできません。いったん、MDBで終了させて、再起動させてからAccdbに変えます。おそらくいったんMDBで終了させたとき五MysysAccessObjectsの代わりのMysysObyjectsテーブル(これはシステムテーブルなので設定を変えないと普通は見えません)が構成されるのだと思われます(一瞬左下にメッセージが出る)。

Access2000時代の最適化ユーティリティを使用する

[[ACC2000] ダウンロード センターで入手可能な Jet 最適化ユーティリティ](https://support.microsoft.com/ja-jp/help/273956/acc2000-jet-compact-utility-available-in-download-center)

Jet コンパクト ユーティリティは、ダウンロード センターで利用できます - Microsoft 365 Apps | Microsoft Learn

2017-07-01_LI.jpg
このツールはAccess2016+64bi+Win10HOMEでも動作する。
Access97形式のF:\TESTType97.mdbをF:\TESTType97C.mdbに変換しながら最適化する。
言語を日本語にすることが可能だ。
この時Destination is 4.X database FormatにするとAccess2003形式のmdbになる。
Jet3.Xだと97/95形式のまま最適化する。
このサイトには説明がないが、実は変換ツールでもあるわけだ。
このツールはファイルを開いて閉じることなく最適化するため、高速でファイルが壊れていても最適化で復元できる可能性があるとされている。

Office Office製品のトラブルシューティング Access > Jet compact ユーティリティはダウンロード センターで利用できます 2021/04/09
2021/07/22現在このページからも英語版が直リンクでダウンロードされるため、上記リンクがなくなっても当面は存続しそうである。

Accdb形式から97形式のMDBに変換できるか

MDBを新たに作成し、そこにテーブルを作成して既存のAccdbからデータを流し込むことで可能となる。
[VBS 32bit] Access 2016 64Bit Windows 10 で Access97のテーブルにデータを流し込む方法

MDBを変換したあとにやるべきことDoc形式資料

Microsoft Access 2000 へのバージョンアップ方法とそのメリットホワイトペーパー
http://download.microsoft.com/download/4/6/8/46857b12-1bd9-4822-b5d9-6caaf52d5134/acc2kvup.doc
なぜかDoc形式のダウンロードになっている。
Access 2002 データベース (.mdb) の導入

Access2002への変換というDOC資料があった(2018/7/7)

Microsoft Access 2002 への変換
40ページほどの資料。DAO3.5とDao3.6で変更されたメソッドの比較は有用。文中のリンクは切れているものもある。

どうもMSはMDBを廃止する気がないようだ(2018/6/19)

 この記事、実は10000viewを超えており、2桁View数が普通な自分のページのなかで、いいねは少ないにも関わらず異常なView数をたたき出している。なにかお役に立っているのだろうか。それなら幸いである。
 MSはこのページをみて反省したのか見落としていたのか不明だが、使用が推奨される Access ファイル形式という記事が4月にできていた
 accdbから削った機能を使っている場合、mdbを使うことをMSは勧めているのである。特にIISを使いWebブラウザで開くことができるのはmdbだけなのである。
 またVisual C++でmdbファイルを新規に作成する方法も紹介されている(2018/4更新)

使用が推奨される Access ファイル形式

.mdb ファイル形式

mdbファイルには複数のバージョンがある

.accdb ファイル形式が Office Access 2007 で導入される以前は、Access ファイル形式は、.mdb ファイル拡張子を使用していました。.mdb ファイル形式には複数の異なるバージョンがあります。

一部は今でも開ける

 一部の .mdb ファイルは現在でも開くことができます。ファイルが Access 2002-2003 または Access 2000 ファイル形式で保存されている場合、それを開いて通常どおり使用できます。ただし、.accdb ファイル形式を必要とする機能を利用することはできません。

.accdb ファイルで使用できない機能を利用している場合、.mdb ファイルは変換せずにそのままにしてください。

.accdb ファイルでは使用できない .mdb ファイルの機能

ここは翻訳がカスなので、やり直してみた。

accdbからはmdbにリンク等はできない

 accdb形式とのファイルはAccess2007形式以前のバージョンのAccessで作成したMDB形式ファイルは開くこともリンクすることもできません。
 たとえば、あなたの所属している組織に以前のバージョンのアクセスを使用し(have)ているユーザー(People)がいるならば、、mdb ファイルを使用することを検討するのは良い選択です。
 しかも、忘れないでください。
 その場合、Access がインストールされているかどうかに関係なく、web ブラウザーで Access アプリまたは web データベースを使用することができます。

注意
  • accdb形式とのファイルはAccess2007形式以前のバージョンのAccessで作成したMDB形式ファイルは開くこともリンクすることもできない、たしかにバージョンを完全に混在させられたのはAccess2007だけでそれ以前はaccdbを開けず、これより後はmdbが一部開けない。Accss2013以降はJet 3.x IISAMを削除したので余計できない。
  • web データベース機能はIIS+Windows serverを利用しているサーバー上にある場合だけで、一般的なものではない。
データベースのレプリケーション

.Accdb ファイルでレプリケーションを使用することはできません。.accdb ファイル形式を使用する場合で、レプリケーション機能を使用しているときは、Access ソリューションは、、レプリケーションなしのソリューションを再作成する必要があります。

ユーザー レベル セキュリティ

.Accdb ファイル形式では、ユーザー レベル セキュリティを他のユーザーが必要とする情報を表示する機能をサポートしていません。 ユーザー レベル セキュリティはもはやデータベースの安全性に効果的ではありません。もはや陳腐化し情報漏えいが起こりやすい方法となってしまいました。

 ただし、ユーザー レベル セキュリティがユーザーの簡単なものを維持して使いやすさを向上させることもあります。
 たとえば、他のユーザーにはビジネス上の特定のフォームを使用する理由がなければ非表示にすることが可能です。
 また使いやすさを向上させるためにユーザー レベル セキュリティに依存している Access ソリューションがある場合は場合には、引き続き.mdbファイル形式を使用してソリューションを保持することが可能になります。

原語(英語)

Which Access file format should I use?

Mixed-version environment

 The .accdb file format cannot be opened or even linked to using versions of Access prior to Access 2007. If there are people in your organization who have an earlier version of Access, you should consider whether using an .mdb file is a better option. But don’t forget ? you can use an Access app or a web database in a web browser, regardless of whether Access is even installed.

Database replication

 You can’t use replication in an .accdb file. If your Access solution uses the replication feature, you will need to re-create the solution without replication if you want to use the .accdb file format.

User-level security

 The .accdb file format doesn't support user-level security, a feature that provides a way to help people see just what they need to see. User-level security is no longer effective for data security, as its security method is now obsolete and easily compromised. However, user-level security can improve usability by keeping things simple for people ? for example, if someone has no business reason to use a particular form, you could hide the form from them. If you have an Access solution that relies on user-level security to improve usability, you might want to keep using the .mdb file format so you can keep using your solution as-is.

Visual C++でもmdbファイルを作成する方法が公式にある

Visual C++ で Microsoft Access データベースの .mdb ファイルを作成する方法

特殊文字に注意

ワイルドカードになる文字等はANSI-92とANSI-82がある。ここで使われる文字は変換でうまくいかない可能性がある。
Accessワイルドカード文字リファレンス

またフィールド名等の特殊文字も変換の際予期しない挙動をする可能性がある
Accessデータベース作業の際使用すべきではない特殊文字

追記(2019/5/25) その後前方/後方互換で判明した問題

Dao3.6とMicrosoft Office Access 12.0と違う命令、定数

Access2007以降のDAOはDao3.6を参照設定しなくてもMicrosoft Office Access 12.0 Libraryがデフォルトで参照設定されその中にDAOがある。この12.0は2007のもので、その後、バージョンは上がって現在は16.0である。
このDAOはDao3.6に追加された RecordSet2がある。本記事のメインは古いMDBをAccdbに変えることにあるが、逆に変換する場合にはその時には使えなかったオブジェクト、定数がある。

参照設定しているDLL等のバージョンの違い

Access2010で作成したファイルを以前のバージョンで開いた場合のエラー
実際、参照設定(事前バインディング)はエラーが起きる。上記サイトは基礎的な例を示している。

DaoとADOの参照設定の順序の違いでエラーコード13が発生する(2021/07/22追加)

[vba覚書]mdbをaccdbへ変換したら動かない! 形部商事株式会社

元のページ https://support.microsoft.com/ja-jp/help/181542/you-receive-a-type-mismatch-error-when-you-run-the-openrecordset-metho
はリンク切れ。
You receive a "Type mismatch" error when you run the OpenRecordset method

SYMPTOMS

If you dimension an object as a Recordset and then set that object to databaseobject.OpenRecordset(source), you may receive the following error message:
Run time error '13': Type mismatch

CAUSE

If your project contains references to both the Data Access Objects (DAO) library and the ActiveX Data Objects (ADO) library, you may see multiple Recordset entries in the list when you dimension the Recordset object. This error occurs when you list the ADO library with a higher priority than the DAO library in the References dialog box, regardless of which Recordset entry you select from the list.
If you need only the DAO Recordset object, make sure that the reference for the DAO object library has a higher priority in the References dialog box, or clear the reference to Microsoft ActiveX Data Objects.
Data Access Objects (DAO) ライブラリと ActiveX Data Objects (ADO) ライブラリの両方に対する参照がプロジェクトに含まれている場合、Recordset オブジェクトを宣言すると、複数の Recordset エントリが一覧に表示されることがあります。このエラーは、どちらの Recordset エントリを一覧から選択するかに関係なく、[参照設定] ダイアログ ボックスで ADO ライブラリの優先順位を DAO ライブラリよりも高くした場合に発生します。

If you must reference and use both DAO and ADO Recordset objects, dimension the objects explicitly as follows:
DAO と ADO の両方の Recordset オブジェクトを参照および使用する必要がある場合は、各オブジェクトを次のように明示的に宣言します。

Dim adoRS As New ADODB.Recordset
Dim daoRS As DAO.Recordset


> #### MORE INFORMATION
Steps to reproduce the behavior

> 
 1. Start Visual Studio. The New Project dialog box appears.
 2. Click Open. The Form1 form appears.
 3. Right-click the Form1 form, and then click View Code. The Project1 - Form1 (Code) window appears.
 4. Paste the following code in the Project1 code page:


>```vb
    Dim dbs AS Database
    Dim rs AS Recordset  ' When you press the spacebar after "AS," the
                               ' list box includes multiple Recordset entries.
                               ' Pick any Recordset item, or type "Recordset."
    Private Sub Form_Load()
    Set dbs=OpenDatabase(dbname)
    Set rs=dbs.OpenRecordset(source)  ' The error occurs when this line
                                            ' of code executes.
    End Sub
  1. On the Project menu, click References. The References - Project1 dialog box appears.
  1. Click Microsoft DAO 3.x Object Library, click Microsoft ActiveX Data Objects 2.x Library, and then click OK.
    Note Make sure that the ADO library has the higher priority in the References dialog box list above the DAO library.
  2. On the Run menu, click Start to run the program. You may receive the error message that is mentioned in the "Symptoms" section.

Properties

Article ID: 181542 - Last Review: January 12, 2006 - Revision: 4.3
APPLIES TO
Microsoft Visual Basic 5.0 Enterprise Edition
Microsoft Visual Basic Enterprise Edition for Windows 6.0
Microsoft ActiveX Data Objects 2.7
Microsoft ActiveX Data Objects 2.1 Service Pack 2
Microsoft ActiveX Data Objects 2.5
Microsoft ActiveX Data Objects 2.6
Microsoft Visual Basic 5.0 Learning Edition
Microsoft Visual Basic 6.0 Learning Edition
Microsoft Visual Basic 5.0 Professional Edition
Microsoft Visual Basic 6.0 Professional Edition
Microsoft Access 2000 Standard Edition

Keywords:
kbprb KB181542

KB181542補足

かつてAccess2000時代、[参照設定でADOとDAOのどっちが上かでエラーが発生する()ことがあった。
これは以前は両方とも参照設定する必要があり、互換性のために大抵は両方設定していたが、ADOとDAOのRecordsetは同名のため、単純にAs Recordsetとすると順位が上の方がデフォルトで選ばれる仕様だったためである。しかし、現在はDAO3.6自体が64bitでは参照設定できない(ただし上記の通り、現在は既定でMicrosoft Office Access 12.0 Library以降が参照設定されているため、Dao3.6が参照設定できなくても、上記のような As Dao.Databaseのような宣言が可能となる。しかし、遅延バインディングDim DBE : Set DBE = CreateObject("DBEngine.Dao36")はエラーになる)しかしADOのみを参照していた場合には矛盾するためエラーが発生する。このため古いファイルとの互換性のためには32bitの方がトラブルが少ない。また、Access データベースでの参照の問題を解決する方法という記事はデータベース間でテーブルを参照するという記事ではなく、VBAの参照設定のエラーだが、上記のエラーコード13以外にも発生する。VBAのトラブルシューティングに参考になりそうな記事はこれだけで、あとはボロボロ。Access が Visual Basic for Applications リファレンスを解決する方法はほぼ役立たない。内容からすると、VBA Microsoft Office Access(2003,2007) データベースまたはプロジェクトに、ファイル名への参照がないか、または壊れています。というメッセージが表示される場合、Application.BrokenReferenceで参照設定を確認したうえでレジストリを編集して解決する方法としないと内容が不明な上、あまり解決につながらない。
 さらに参照が不足しているデータベースで Visual Basic for Applications (VBA) 関数が中断するはTiffファイルを参照するために入っていた、KODAK Image EDIT Control (Wang イメージ編集コントロール)についてのみ書いているが、参照設定が古い場合、KODAKのドライバに限らず発生する可能性がある。このように公式のサイトのトラブルシューティングはしれっと古いバージョンの記事を載せ替えたりしているだけで内容が古かったり、さらに翻訳がめちゃくちゃで、よくわからない状況である。
 なお、上記コードは、DAO と ADOの変換ではNew句を使っているので、原文のコードを修正している。
また、Visual Basic云々と書いているコードを修正すると、現在はこうなる。

' (フォーム)モジュールレベルの変数
' 現在はMicrosoft Office Access 12.0 Libraryが標準で参照設定されている
    Dim dbs AS Dao.Database
    Dim rs AS Dao.Recordset  ' When you press the spacebar after "AS," the
                               ' list box includes multiple Recordset entries.
                               ' Pick any Recordset item, or type "Recordset."
    Private Sub Form_Load()
    Set dbs = OpenDatabase(dbname)
    Set rs = dbs.OpenRecordset(source)  ' The error occurs when this line
                                            ' of code executes.
    End Sub

ADO(ADODB) を使う場合はこうなると考えられる。ただし、OpenのOptionは状況に応じて異なるのでこれが絶対というわけではない。

' (フォーム)モジュールレベルの変数

    Dim ars AS ADODDB.Recordset  ' When you press the spacebar after "AS," the
                               ' list box includes multiple Recordset entries.
                               ' Pick any Recordset item, or type "Recordset."
    Private Sub Form_Load()
    Set ars = New ADODB.Recordset
    ars.Open "Employees", CurrentProject.Connection, _
         adOpenKeySet, adLockOptimistic
    End Sub

これは参照設定を前提としているが、遅延バインディングの例がこちら
DAOとADOの併用に関して

この他、
Access のテーブル、フォーム、およびレポートを変換する

Access 2002 で導入された変更点が、Access Version 1.1 または 2.0 のアプリケーションの動作に影響を与える場合があります。以下に、変更の詳細を説明します。
.accdb ファイル形式にデータベースを変換する

などがある。

Sandboxの違い

Access2003で作られたmdbファイルをAccess2016で動かしたときの不具合について

DoCmd.TransferSpreadsheetメソッドでSpreadsheetTypeの引数を省略したとき
Environ関数をクエリ内で使用したとき
ただし、ここでSandboxは2007以降で導入されたとあるが、誤りである。
たしかに現在のヘルプ
サンド ボックス モードでブロックされている Access の関数とプロパティは適用対象がAccess for Office 365 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007となっているのでAccess2007から存在するように見える。
しかし
How to configure Jet 4.0 to prevent unsafe functions from running in Access 2003
https://support.microsoft.com/En-Us/help/294698/how-to-configure-jet-4-0-to-prevent-unsafe-functions-from-running-in-a
があり、少なくともAccess2000からは存在する
Moderate: Requires basic macro, coding, and interoperability skills.
This article applies only to a Microsoft Access database (.mdb).
For a Microsoft Access 2000 and Access 2002 version of this article, see 239482 .
The Microsoft Jet 4.0 database engine permits you to call unsafe Microsoft Visual Basic for Applications functions through the Microsoft Jet Expression Service. The Jet Expression Service is used to evaluate expressions in forms, in reports, and in queries.

For example, the following SQL statement may cause all files to be deleted from the current folder on your computer:

SELECT Shell("Cmd /c del *.*") As c1 From Customers

The security risk occurs when expressions contain Visual Basic for Applications commands that can do damage to the computer that is running the query, such as Shell commands to delete files or to format the computer.

INTRODUCTION

The evaluation of expressions is a behavior that is desirable in many circumstances. However, if part of the expression contains a Shell command, the Shell command is parsed and then executed on the computer.

You can use Sandbox mode to block such operations. However, the default for Jet 4.0 Sandbox mode is not to enable Sandbox mode for queries that are run in Microsoft Access. Sandbox mode is enabled for all other non-Access applications, such as Open Database Connectivity (ODBC).

Understand how to enable or how to disable Sandbox mode

Important This section, method, or task contains steps that tell you how to modify the registry. However, serious problems might occur if you modify the registry incorrectly. Therefore, make sure that you follow these steps carefully. For added protection, back up the registry before you modify it. Then, you can restore the registry if a problem occurs. For more information about how to back up and restore the registry, click the following article number to view the article in the Microsoft Knowledge Base:
322756 How to back up and restore the registry in Windows
You can enable Sandbox mode for non-Access applications. To do this, you must install Microsoft Jet 4.0 Service Pack 3 (SP3) or later. After you install this update, the next time that you run Jet a new registry key is added to the registry. This new registry key prevents this type of possible security risk. The following is the registry key that is added:

\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\engines\SandboxMode

For more information about how to obtain the latest Jet 4.0 Service Pack, click the following article number to view the article in the Microsoft Knowledge Base:

239114 How to obtain the latest service pack for the Microsoft Jet 4.0 Database Engine

To make your system more resistant to malicious attacks, and at the same time make it possible for older applications to keep running, the operation of Sandbox mode changed in Jet 4.0 Service Pack 8 so that Sandbox mode is completely under your control.

You can set the registry value to the following values, with 0 (zero) being the most permissive and 3 being the least permissive. This registry value is of type DWORD.
<<このレジストリの設定は現在と同じなので省略>>
When you set the Sandbox mode registry value in Access 2003, this registry value is tied to the Macro Security Level. When you set the Macro Security Level to Medium or to High, you are offered the option to block unsafe expressions. When you use the option to block unsafe expressions, this sets SandboxMode = 3. When you set Macro Security Level to Low, you are offered the option to turn off expression blocking. When you use the option to turn off expression blocking, this sets SandboxMode = 2. Access 2003 preferentially runs with Jet expression blocking turned on. If you open a database in Access 2003 with Macro Security Level set to Medium or set to High and Sandbox mode set to SandboxMode = 2, you are prompted to turn on expression blocking.

After you enable Sandbox mode, and then you try to use the unsafe Visual Basic for Applications functions in a Jet 4.0 query, you receive the following error message:

Undefined function 'functionname' in expression

Implement Sandbox mode operations

How you can implement Sandbox mode is extended in Jet 4.0 Service Pack 8 to be more compatible with Access databases. Previous implementations of Sandbox mode were too restrictive for most Access applications. Starting with Jet 4.0 Service Pack 8, the enhanced Sandbox mode continues to block unsafe Visual Basic for Applications functions, but Jet 4.0 Service Pack 8 now permits the execution of user-defined functions. Additionally, when you run Jet 4.0 Sandbox mode in combination with Access 2003, Jet 4.0 Sandbox mode can block certain Access functions and Access properties that are considered potentially unsafe.

Use Sandbox mode operations with Jet 4.0 Service Pack 3 and later

You can use the following list of functions in Jet queries when Sandbox mode is enabled. Any functions that do not appear in the list are not available in Sandbox mode.

次の表は、 Jet 4.0 Service Pack 3 and laterでサンド ボックス モードを友好で使用すると、Access データベース エンジン クエリで使用できる関数の一覧です。 一覧に表示されない関数は、サンド ボックス モードでご利用いただけません。

ABS array ASC ASCB ASCW ATN
CBOOL CBYTE CCUR CDATE CDBL choose
CHR CHR$ CHRB CHRB$ CHRW CHRW$
CINT CLNG COS CSNG CSTR CVAR
CvDate CVErr date DATE$ DATEADD dateDiff
datePart DATESERIAL DATEVALUE day DDB error
error$ EXP fix format format$ fv
hex hex$ HOUR IIF IMEStatus inStr
INT IPMT IRR isDate isEmpty ISERROR
isNull isNumeric isObject lCase lCase$ LEFT
LEFT$ LEFTB LEFTB$ LEN LENB LOG
lTrim lTrim$ MID MID$ MIDB MIDB$
MINUTE MIRR MONTH NOW NPER NPV
oct oct$ partition PMT PPMT PV
QBColor RATE RGB RIGHT RIGHT$ RIGHTB
RIGHTB$ rnd round rTrim rTrim$ SECOND
sgn SIN SLN space space$ sqr
str str$ strComp strConv string string$
switch SYD TAN TIME TIME$ timer
timeSerial TIMEVALUE TRIM TRIM$ typeName uCase
uCase$ val varType WEEKDAY YEAR

Understand Visual Basic for Applications functions that cause errors when called from a Jet query or an Access property when using Jet 4.0 Service Pack 8

The following Visual Basic for Applications functions will cause an error when the functions are called from an expression in a Jet query or from an Access property:

次の Visual Basic for Applications (VBA) の関数は、Access プロパティAccess データベース エンジン クエリの式で使われる(are Called)時にエラーが発生します。

AppActivate Beep Calendar CallByName ChDir
ChDrive Command Command$ CreateObject CurDir
CurDir$ DeleteSetting DoEvents Environ Environ$
EOF Err FileAttr FileCopy FileDateTime
FileLen FreeFile GetAllSettings GetAttr GetObject
GetSetting Input Input$ InputB InputB$
Kill Load Loc LOF Randomize
Reset SaveSetting Seek SendKeys SetAttr
Shell Spc Tab Unload UserForms
Width Dir Erl MacID

Jet 4.0 Sandbox mode blocks the following Access functions and properties when called from an expression in a Jet query or from an Access property. These functions and these properties are blocked only when enhanced Sandbox mode is running in Access 2003.
Access2003ではJet 4.0 のサンド ボックス モードでは、クエリの式とは、Access のプロパティから、関数を呼び出すときに、次の Access 関数がブロックされます。

Application Object

AddAutoCorrect AddToFavorites ADOConnectString AnswerWizard Application
Assistant AutoCorrect BeginUndoable CloseCurrentDatabase CodeContextObject
CodeDb COMAddIns CommandBars CompactRepair ConvertAccessProject
CreateAccessProject CreateAdditionalData CreateControl CreateControlEx CreateDataAccessPage
CreateForm CreateGroupLevel CreateNewWorkgroupFile CreateReport CreateReportControl
CreateReportControlEx CurrentDb DataAccessPages DBEngine DDEExecute
DDEInitiate DDEPoke DDERequest DDETerminate DDETerminateAll
DefaultWebOptions DefaultWorkspaceClone DelAutoCorrect DeleteControl DeleteReportControl
DoCmd Echo ExportXML FeatureInstall FileDialog
FileSearch FollowHyperlink GetHiddenAttribute ImportXML InsertText
LanguageSettings LoadFromText LoadPicture Modules NewAccessProject
NewCurrentDatabase NewFileTaskPane OpenAccessProject OpenCurrentDatabase Parent
ProductCode Quit References RefreshDatabaseWindow RefreshTitleBar
ReloadAddIns ReplaceModule Run RunCommand SaveAsText
TransformXML VBE BuilderString MSODebugOptions VGXFrameInterval
WizHook

BoundObjectFrame Object

Object

Combobox Object

Recordset

Control Object

Object

CurrentProject Object

AccessConnection BaseConnectionString CloseConnection Connection OpenConnection

Form Object

Dynaset Recordset RecordsetClone ChartSpace
ConnectControl ConnectSynch Module PivotTable

Hyperlink Object

AddToFavorites CreateNewDocument Follow

Listbox Object

Recordset

ObjectFrame Object

Object

Report Object

Recordset

SmartTagAction Property

Execute

Screen Object

ActiveDataAccessPage

#追記(2019/3/29)
編注:この記事がよく参照されるので確認したところ、こBlogs.technet.microsoft.comの記事はデッドリンクで「このサイトはもう利用できません。という表示になっている。(2019/3/29)

##代替の公式資料
Access 2.0 と Access 95 データベースを現在のバージョンにインポートする

Access for Office 365 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007

Access 2.0 形式 (.mdb)、または場合によっては Access 95 形式 (.mdb) で既存のデータベースを使用する場合は、.accdb ファイル形式を使用するより新しいバージョンの Access にそのデータベースからのテーブル、クエリ、マクロをインポートすることができます。

VBA コード (およびモジュール) を含むフォームとレポートをインポートするには、まず、Microsoft Office Access 2003、Access 2002、または Access 2000 を使用して、Access 2.0 または Access 95 データベースを Access 2002 - 2003 または Access 2000 ファイル形式に変換します。次に、Access 2007 などのより新しいバージョンを使用して、そのファイルを .accdb ファイル形式に変換できます。その後、Access 2010、Access 2013、Access 2016 によって、.accdb ファイル形式を開くことができます。

この記事の以下のセクションでは、これらのタスクを実行する方法について説明します。

##Access 2010、Access 2013、または Access 2016 を使用していますか?

Access 2007 は、Access 2.0 と Access 95 の表示、インポート、リンク、エクスポートをサポートしている最後のバージョンでした。Access 1.0 および 2.0 (Red 2、または Jet 2) ファイルおよび Access 95 データベースのデータのエクスポート、インポート、リンクには、Access 2007 が必要です。この場合は、Access 2007 を中間のステップとして使用し、Access 2.0 データベースをこれらのバージョンのいずれかに完全に変換する必要があります。

###Access 2.0 データベースを Access 2007 で開く
Access 2007 で Access 2.0 データベースを開く場合は、多数のプロンプトが表示されます。プロンプトに従うと、最後には「このデータベースは Microsoft Access 2.0 ファイル形式で保存されました」というメッセージが表示されます。(図略)
Access 2007 データベース (.accdb) には、Access 2.0 データベースのテーブル、クエリ、マクロをインポートできます。Access 2007 データベースにフォーム、レポート、モジュールをインポートするには、まず、以前のバージョンの Access を使用してデータベースを変換します。次に、Access 2007 を使用して変換後のデータベースを開き、そのデータベースを Access 2007 .accdb ファイル形式のデータベースに変換します。詳細については、「Access 2003、Access 2002、Access 2000 を使用して、Access 2.0 または Access 95 データベースを変換する」を参照してください。

Access 2.0 データベースのデータを Access 2007 にインポートする

別のデータベースからオブジェクトをインポートする場合は、インポートするオブジェクトのコピーがインポート先のデータベースに作成されます。ソースは変更されません。Access 2007 に Access 2.0 データベースのデータをインポートするには、最初にデータのインポート先のデータベースを開きます。次に、[外部データ] タブでコマンドを使用して、インポート処理を進めます。これには、インポート ウィザードの呼び出しが含まれます。
(略)

Access 2007 には、Access 2.0 データベースのテーブル、クエリ、マクロのみをインポートできることを忘れないでください。

Access 95 データベースのデータを Access 2007 にインポートする

Access 2007 に Access 95 データベースのデータをインポートするには、最初にデータのインポート先の Access 2007 データベースを開きます。次に、[外部データ] タブでコマンドを使用します。これには、インポート ウィザードの呼び出しが含まれます。

Access 2007 データベース (.accdb) には、Access 95 形式 (.mdb) データベースのテーブル、クエリ、マクロをインポートできます。VBA コードを使用しないフォームやレポートもインポートできます。VBA コード (およびモジュール) を含むフォームとレポートをインポートするには、まず、Microsoft Office Access 2003、Access 2002、Access 2000 を使用して、Access 95 データベースを Access 2002 - 2003 または Access 2000 ファイル形式に変換します。次に、Access 2007 を使用してそのファイルを Access 2007 .accdb ファイル形式に変換します。(略)

Access 2003、Access 2002、Access 2000 を使用して、Access 2.0 または Access 95 データベースを変換する

Access 2.0 データベースは、Access 2000 または Access 2002 - 2003 ファイル形式に変換することができます。これには、次の表に示す Access のバージョンのいずれかを使用します。ただし、そのバージョンの Access を購入し、コンピューターにインストールしている必要があります。Access のバージョンによっては、Access 2.0 コンバーターが既にインストールされています。(略)
Microsoft Office Access 2003

このバージョンでは、Access 2003 用 Access 2.0 コンバーターをダウンロードしてインストールする必要があります。ただし、Access 2003 は延長サポート対象外のため、Microsoft ダウンロード センターからこのツールを入手できません。
(略)

Access 2.0 または Access 95 ファイルは、Access 2000 または Access 2002 - 2003 .mdb ファイル形式に変換する必要があります。次に、Access 2007 を使用して、結果のファイルを Access 2007 .accdb ファイル形式に変換できます。その後、そのデータベースを Access 2007 で使用するか、Access 2010、Access 2013、または Access 2016 で開くことができます。以前のバージョンの Access では、以下の手順が必要な場合があります。
(略)
これ以降Access2007を使って変換する方法が続くが、Access2007を持っていないからこそ当方の記事を読んでいると思われるので、省略。

接続文字列の変更Jet OLEDB 12.0(2019/8/10追記)

64bit版Windowsでの「Microsoft.Jet.OLEDB.4.0」について
https://qiita.com/yaju/items/86314412741deb806366
ポイントはAccess 2007以降ではバージョン、64/32の違いにかかわらず、Oledb 12.0を使うということ。

Access2007のaccdb間の違い(2019/8/10追記)

https://dekiru.net/article/15674/
VBAから離れるとこうした点が異なる。最も重要なのは集計フィールドであると思われる。
Access2007形式のaccdbでは集計フィールドは使えない。

またmdbとaccdbの違いはmdbからaccdbにリンクできない点といえる。
http://www.dojeun.com/contentsview.php?listid=00147
このほかに添付ファイル型などaccdbでしか使えないデータ型があるなどの違いがある。
MDBのバージョンの違いはMDEを作ることができるバージョンが同じバージョンであるという点。

現行のPCにインストールされているAccessのバージョンの確認(2019/8/10追記)

英語ベースの記事だが、
https://support.microsoft.com/ja-jp/help/2798395/access-incorrect-current-version-registry-key

Access: Incorrect Current Version registry key
適用対象: Access 2010Access 2013Microsoft Office Access 2007
HKEY_CLASSES_ROOT\Access.Application\CurVer
カレントのAccessはバージョンはレジストリのこの場所で決まっているという。
この記述は複数のAccessを入れたときダブルクリックでmdb/accdbを開くAccessのバージョンがどこで決定しているのかをいいたいと考えられる。
この記事にはないがAccess2016のバージョンと2019のバージョンは同じなので、
Access 2007 - Access.Application.12
Access 2010 - Access.Application.14
Access 2013 - Access.Application.15
Access 2016/2019 - Access.Application.16
となる。
##Format での長さ 0 の文字列の使用はコードをテストする必要がある(2019/09/05追記)
Microsoft Access バージョン 2.0 以前では、Format 関数を使って、長さ 0 の文字列と値に異なる値を取得できます。たとえば、次のような書式設定式を Format 関数で使って、コードから適切な文字列値を返すことができます。

Dim varX As Variant
Dim varStrX As Variant
' Assign some value to varStrX and pass to Format function.
varX = Format(varStrX, "@;ZLS;Null")

Microsoft Access バージョン 97 以降では、Null のケースを個別にテストし、結果に基づいて適切な値を返す必要があります。たとえば、次のような Format 関数の式で IIf 関数を使うことができます。

varX = IIf(IsNull(varStrX),"Null", Format(varStrX, "@;ZLS"))

この変更は、Format 関数を使って長さ 0 の文字列か Null 値かに応じて文字列を書式設定するときにのみ適用されます。Format 関数で使われる他の書式設定式は以前のバージョンと同じように動作します。

Microsoft Access 2.0 以前のバージョンから Microsoft Access 2002 以降にデータベースを変換する場合、Null ケースを個別にテストするようにコードを変更する必要があります。
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=2ahUKEwjtwoGDnrfkAhUR_GEKHUn-CT8QFjABegQIAxAC&url=http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F4%2F6%2F8%2F46857b12-1bd9-4822-b5d9-6caaf52d5134%2FAcc2kvup.doc&usg=AOvVaw0v9VmiSFRGItYuvIyChpBY
ドキュメント Office クライアントの開発 Access Access デスクトップ データベース リファレンス 概念 変換 テーブル、フォーム、レポートを変換する

Access 2002 で導入された変更点が、Access Version 1.1 または 2.0 のアプリケーションの動作に影響を与える場合があります。以下に、変更の詳細を説明します。

表題からは全くわからないが、実はここはホワイトペーパーほどではないが上記の差を含め、Access 2.0以前のバージョンとの違いをまとめている。
このほかマクロの互換性については
Microsoft Office 2013 マクロ互換性について 日本語 PDF
http://download.microsoft.com/download/8/5/C/85CA5B92-0829-4966-AECE-C7B4FB2EDE07/Office2013_compatibility_for_macro.pdf

Office 365 APIを使ったアプリケーションを開発するためのホワイトペーパー
https://www.microsoft.com/ja-jp/download/details.aspx?id=49441
などがある。

重要:Access2019のユーザー、Office365 Solo等を2018年9月以降に新規、あるいはクリーンインストールしたときは64Bitではなく32Bitにしてください。

Access2019をインストールする場合、デフォルトが64bitに変更されている。64bit版ScriptControlの参照設定が不可能です。また、Windows 32Apiを64bitに手動で変換する必要があります。さらに、代替DLLの64bit版は存在せず、Microsoftは作る気もありません。このため、過去のmdbファイルを変換しても手動でも単純に変換ができず、フォームの再作成どころか最悪の場合、システムそのものを作り直す必要が発生する可能性があります。そのようなコストやリスクがあるにも関わらず、Microsoftはこれを説明していません。しかし、実際にはこうした問題がありますので、過去のmdb/accdb資産を継承する場合、必ず32bitのインストールを選択してください。また、Office 365 Soloを購入している場合、新しいPCにインストール、または再インストールの場合は64bitが標準になる場合があるので注意してください。(2019/8/10追記)

21
28
1

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
21
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?