Access2007をSP3にアップデートすると「引数が無効です」のエラーが発生する

Access2007をSP3にアップデートすると、クエリの実行時にErrorID:3001「引数が無効です」のエラーが発生することがあるようです。
原因はテーブル構造の内部的参照方法が変更になった(予測ですが)こと。
発生するのは、次に当てはまるとき
・ACCDB形式の場合
・Access2007 SP2以前で作成したテーブルを対象にしたデザイン変更、アクションクエリの実行
・テーブルに既定値を設定している列がある場合
2007 SP3の適用により、内部的には2010に近づける変更が行われるようです(あくまで予測)。
関連記事
Access2007(Office2007 SP3)に、アップデートすると、SP2以前のプログラムで、ErrorID:3001「引数が無効です」のエラーが、発生する(Microsoft Answers)
Access 2010 でテーブル編集時に、初回のみ “引数が無効です” とエラー メッセージ表示される(Microsoftサポート)
Access Runtime 2007 SP3 初期値が入らない
デコンパイルでも直らないこの現象の解決方法は、
・SP3をアンインストールしてSP2に戻す
・テーブルをSP3ですべて作り直す(この場合コピーではダメで、新規に作成する必要あり)
のいずれかでエラーが出なくなるようです。
なんとも厄介だ・・・

列名を「ID」とすると勝手にシーケンス列になるバグ Access2010

Access 2010 ADPファイル形式ではデータベースにSQL Serverを使用する。
SQL Server で複数テーブルを連結したビュー(Accessではクエリに表示される)を作成すると、ある条件で有り得ないバグが発生するのでその報告。
MDBでオートナンバーと言っていた自動シーケンス機能は、SQL Serverでは「Identityの指定」で設定する。複数のテーブルを連結したビューは、Accessでは「固有のテーブル」に編集するテーブル(以下、メインテーブルと呼ぶ)を指定することで変更できるようになるのが、特定の条件でこのバグは発生する。
・メインテーブルに「ID」という名称の列を作成する。「Identity」には指定しない。
・LEFT JOINされるサブテーブルにメインテーブルから2つ以上の列で連結する。
こうして作成したビューをAccess 2010で使用すると「ID」列が勝手にシーケンス列(Identity)になり、新規行の「ID」列に「(新規)」と表示される(本当は空白のまま)。
こうなると、「ID」列には値を代入できなくなる上に、シーケンスされないので行挿入も失敗してしまう。
いろいろ調べてみたが、問題は予約語(に近い?)になっている「ID」という列名のようだ。
このバグは以下の状況では発生しない。
・Access 2007では上記と同じビューでも正常に動作する。
・「ID」列があっても、LEFT JOINされるサブテーブルがすべて1つの列で連結されている。
・「ID」列を「明細ID」など別の名称に変更する。
「ID」という列はMDBやACCDBでは、作成すると自動的に「長整数型」がデフォルト値になる設定がオプションにある。ADPにはこのオプションはないが、このファイル形式は2003以降大幅に変化しておらず、リボンが追加され、VBAが強化されたバージョンであるので、内部的にどこか辻褄が合わないのだろうか。2007では発生しておらず、2010で埋めこまれてしまったバグなのは残念だ。

Windows XPに勝手にメイリオフォントが!?

Access2007以降、新しいインターフェイスが採用されたので、そろそろ新しいデザインを考えようと思っていたところ、Vista以降に採用されたメイリオフォントはどうか?という話が出た。
参考ページ
Windows Vista で拡張された文字について
しかし・・・
Windows XPがまだまだ残っていることがネックになりそうだった。
ところが!
一部Windows XPにはすでにメイリオフォントがインストールされているではないか!?
従来の認識では、Windows Updateの推奨される更新プログラムに表示されているJIS2004フォントパッケージをインストールしない限り、メイリオフォントがインストールされることはないという認識だったのだが・・・・
Windows XP および Windows Server 2003 向けJIS2004 対応 MS ゴシック & MS 明朝フォントパッケージについて
ネットで調べてみると、一部マイクロソフト製アプリケーションをインストールすると、一緒にメイリオフォントがインストールされることがわかった。
・Microsoft Office 2010
・Microsoft Visual Studio 2008
つまり、Office2010をXPにインストールすると、意識せずにメイリオフォントがインストールされてしまうのだ。そこで、ひとつ気になった。Access 2010 ランタイムをインストールした場合はどうなるの?
Access2010ランタイム
XP MODEにランタイムのみインストールしたもの。入っている!
やはりランタイムのみでもOffice 2010シリーズに違いはなかった。
Office2007Pro
同様にXP MODEにOffice 2007 Proをインストールしたもの。メイリオは入っていない。こんな重要な変更をなぜ誰も気にかけていないのか?
Access2010ランタイム
メイリオフォントがインストールされるということは、単にフォントが増えるということを意味するわけでないあ。メイリオはJIS2004対応フォントなので、JIS2004対応が他のフォントにも影響を与えるということである。
「JIS2004 対応 MS ゴシック & MS 明朝フォントパッケージ」を導入していない場合は、
・MS Pゴシック
・MS ゴシック
・MS UI Gothic
・MS P明朝
・MS 明朝
の主要5フォントは影響を受けていないが、他の派生フォントは一部がJIS2004字形に変わっている。
JIS2004対応では
1.字形の変更
2.文字の追加
が移行を阻害してきた経緯があるが、フォントを主要フォント以外にしている場合、既存文書であっても変更されてしまうのだ。
ちなみに、Access 2010 ランタイムのみをインストールした場合は、IMEが標準の2002バージョンなので環境依存文字である追加された文字は表示できない状態になる。(たぶんインストールはされた状態なのだろう)

Windows 7 SP1で作成したAccessADPがWindowsXPでクラッシュする

Windows 7 SP1にアップデートしたOSでAccessADPプログラムを作成すると、SPなしWindows7やWindowsXPなどでファイルを開いたときにクラッシュする現象。
すでにブログを書いていたと思ったら、書いていなかったので報告しておく。
現象は、ADPファイルの起動時に、「クラスはオートメーションまたは予測したインターフェースをサポートしていません。」というエラーが出るというものだ。
ヒントはこちらから
KB2517589:ADOを使用しているアプリケーションの再コンパイルで互換性に問題が発生する
ADPはデータベース接続オブジェクトしてADOを使用しているが、参照設定のADOバージョンがたとえ同じでも、MDACのADOバージョンが違うために出ているエラーらしい。
なぜこんなことが起こるのかというと、Windows7 SP1でADOが勝手にバージョンアップされ、ファイル名が一緒なのに、バージョンが変わるため、SP1でコンパイルされたプログラムは下位互換がなくなる。
解決方法は、Windows7SP1でコンパイルしたAccessファイルは、それ以外のOSで参照設定のADOを一度外して閉じ、再度参照設定でADOを選択してコンパイルする。これだけ。
ADPでは必ずADOを使用するので関係するが、MDBやACCDBでもADOを使用する場合は注意が必要!

Office 2010 SP1でAccess2010が壊れる現象について

7月分のWindows Updateから「Microsoft Office 2010 Service Pack1:KB2510690」が自動インストール候補に出るようになった。始めは、32ビット版にもかかわらず、32ビット版と64ビット版が2つ出ていたが、8月になってそれは解消された。
が・・・・しかしである。
このOffice 2010 SP1をインストールするとAccessだけは大変なことになる。
今までのAccessファイルをAccess2010で開こうとするとクラッシュするのである。なぜ?と思って、SP1自体アンイストールしていたが、やっと原因がわかった。
まず、そもそも「KB2510690」というパッケージは存在しない。
Office 2010 SP1 全パッケージ一覧 KB2510690
「KB2510690」というのは、Office 2010シリーズすべてのサービスパック1を含む総称であって、個別にパッケージは存在する。Accessに関連していそうなのは、
・Microsoft Office 2010 Service Pack 1(KB2460049)
・Microsoft Office 2010 Language Pack Service Pack 1(KB2460043)
・Microsoft Access 2010 Runtime Service Pack 1(KB2460015)
・Microsoft Access Database Engine 2010 Service Pack 1(KB2460011)
っていうところか。
それで、ファイルが壊れる理由というのが、下の記事。
Access2010 SP1適用後に発生する現象について – Microsoft Answers
内容は、SP1の摘要によって、Accessに発生するエラーが3つ。
1) Access 2010 SP1 – You receive random crashes in certain database or when opening the VBA window in those databases after installing Office 2010 SP1
SP1適用後、特定のファイルがランダムにクラッシュ、またはVBEを開くときクラッシュする。
2) Access 2010 SP1 – Reports that are opened programmatically are no longer showing the expected filtered set of records
OpenReportメソッドでWhereConditionが適用されないことがある。
3) Access 2010 SP1 – You receive an error in Microsoft Access using the built-in wizards after installing Microsoft Office 2010 SP1
Access2010/64bitでビルトインウィザードが起動しない。
64ビット版Officeを使用している人は少ないでしょうから、32ビット版で考えると、1のクラッシュするのが最も影響が大きく、今回の原因もまさにこれによるもの。
KB2533794」でVBE7.DLLが更新されるのが根本の問題らしい。
Office2010 SP1 on track for late June (MukkuMuku備忘 頑張るのは明日から)
MukkuMukuさんのブログにはいつもお世話になります。感謝!!
Windows 7 SP1で勝手にADOをアップデートされた現象に似てないか?これは
解決方法としては、デコンパイルするしかないらしい。ADOもコンパイルし直せば問題なかったが、こちらはコマンドを使用しないといけないようだ。
デコンパイルの手順
1.該当ファイルのバックアップをしておく
2.コマンドラインスイッチ /decompileを使ってデコンパイル
 ファイルフルパス /decompile  例えば、 C:\Users\hogehoge\Documents\targetDB.accdb /decompile
3.データベースを閉じる
4.通常の方法でデータベースを開く
ああ面倒だ。結局SP1はインストールできないではないか。早く修正版を出してほしい。
<2011/08/18追記>
もう一度現象を確認しようと思って、Windows UpdateからSP1をインストールしてみた。
パソコンには、RuntimeとVisioも入っているので、インストールされた更新プログラムを確認してみると、
・Microsoft Office 2010 Service Pack 1(KB2460049)
・Microsoft Access 2010 Runtime Service Pack 1(KB2460015)
・Microsoft Viso 2010 Service Pack 1(KB2460061)
の3つがインストールされました。
下の2つはインストールされなかったようです。
・Microsoft Office 2010 Language Pack Service Pack 1(KB2460043)
・Microsoft Access Database Engine 2010 Service Pack 1(KB2460011)
既存のプログラムを起動して、クラッシュ?・・・・クラッシュしません。7月のときは起動するだけでクラッシュしたのに。
前回は32ビット版の他に、64ビット版も出ていて、1回目は両方インストールして失敗、2回目に32ビット版だけになって成功していた。
今回は32ビット版だけになったけど、1回目は一部が失敗(なぜかRuntime SP1のみ成功)、2回目に成功した。
64ビット版の選択が影響しているのか、それとも8月版でこっそり修正されているのか、すぐに現象が出ることはなくなったようなので、しばらくSP1をあてたまま運用を続けてみます。
ちなみに、SP1によってバージョンがどう変わるのかの確認方法は、
Access 2010 SPなし
「ファイル」メニューの「ヘルプ」画面の右側の「Microsoft Access のバージョン情報」では内部バージョン番号しか確認できない。そこで、バージョンの下の「バージョンと著作権の追加情報」というリンクから開く画面で確認することになる。
Access 2010 SPなし
適用前のバージョン番号は、「14.0.5128.5000」
Access 2010 SP1
SP1適用後は「14.0.6023.1000」
Access 2010 SP1
追加情報画面ではSP1の表記が見える。Access 2010とMSOのバージョンがずれるのは何でしょう?と思って調べたら、「MSO」とはOfficeのバージョンのようだ。AccessはOfficeの一部機能として今回はインストールしているので、ExcelやWordともMSOは同じ番号になっている。単体でセキュリティパッチが出るので、それぞれの内部バージョンは別にあるということなるが、今はSP1をあてた直後なので、いずれも「14.0.6024.1000」になっている。

Access 2010 データシートの列見出しのフィルター機能を非表示にする方法

Access 2007にリボンインターフェースが採用されてから便利になった部分もあれば、余計な部分も増えました。
Accessでビジネスアプリケーションを作る身としては、余計な機能だったのが「データシートのフィルター機能」(この機能の正式名称はなんだろう?)
データシート形式で表示した場合に、行見出しの左側にコンボボックスと同じ選択画像が表示されます。
Access2010 データシート フィルター機能を無効化
項目名が長かったり、狭い列ではこの一文字分を占有する選択画像はぜひとも消去したい!
と思うわけですが、ネットを検索してみてもその方法が全くわかりませんでした。
Access2010 データシート フィルター機能を無効化
元はエクセルをデータベース的に使用する時に使用する「フィルター」機能を、アクセスのデータシートに持ってきたみたい。
Access2010 データシート フィルター機能を無効化
列見出しを右クリックすると表示されるショートカットメニューとは内容が違います。
Access2010 データシート フィルター機能を無効化
フォームのプロパティにある「その他」タブの「ショートカットメニュー」を
「はい」(デフォルト)→「いいえ」
に変更すると、
Access2010 データシート フィルター機能を無効化
フィルター機能は使えなくなりますが、同様に右クリックのショートカットメニューも使えなくなります。
・新しく追加されたフィルター機能は無効にしたい
・右クリックのショートカットメニューは有効にしたい
このAccess2003時代に戻るために試行錯誤してみた結果が次の解決法です。
Access2010 データシート フィルター機能を無効化
・フォームのプロパティにある「その他」タブの「ショートカットメニュー」を「いいえ」
・フォームのOpenイベントに「Me.ShortcutMenu=True」と記述
Access2010 データシート フィルター機能を無効化
表示は「その他」タブの「ショートカットメニュー」を「いいえ」にした状態と変わりありませんが、
Access2010 データシート フィルター機能を無効化
右クリックのショートカットメニューはちゃんと使えますよ。
実は・・・・
この解決法を見つける過程で逆の現象を発見していました。
・フォームのプロパティにある「その他」タブの「ショートカットメニュー」を「はい」のまま
・フォームのOpenイベントに「Me.ShortcutMenu=False」と記述
この場合は、
・新しく追加されたフィルター機能は有効になる
・右クリックのショートカットメニューは無効になる
という結果になります。

Access 2010 の AutoKeys マクロの作り方

前回ネタ「Access 2010 でマクロがXML化した?」からの続き
仕事が一段落したところで、再び考えてみた。
Access 2007までの作り方で、Access 2010の変更時に問題なのは「アクションが空」であることです。ということは、何かアクションを指定して何事もなく終了する、という処理が一番良さそうだ。
ということで2010で新規でマクロを作ってみる。
Access 2010 の AutoKeys マクロの作り方
まず、先頭の「マクロ名」に当たる項目には「サブマクロ」を選択する。
Access 2010 の AutoKeys マクロの作り方
そして、名称として今までどおりSendKeys仕様で「ファンクション名」を指定する。
Access 2010 の AutoKeys マクロの作り方
次に「アクション」に当たる項目、ここが今までは空白だった訳だけど、2010では空は許されていないので、とりあえず「イベントの取り消し」(Docmd.CancelEvents)を指定する。
Access 2010 の AutoKeys マクロの作り方
これでファンクションキー1つ分が完成。
Access 2010 の AutoKeys マクロの作り方
あとは必要なファンクションを同じように作る。
単独キーでAccessで必要なのは
「F2」 ・・・ 編集状態のON・OFF
「F4」 ・・・ コンボボックスのリスト表示のON・OFF
の2つのみ。他はすべて運用時には止めるのが無難だろう。
Access 2010 の AutoKeys マクロの作り方
とここでひとつ問題が発生!
「イベントの取り消し」というアクションはキャンセルが有効なイベントの最中に該当キーを押されると、イベントがキャンセルされてしまうことが判明。
他のイベントに影響ないアクションを探した。
そこで見つけたのは「マクロエラーのクリア」というマクロ。マクロ実行中のエラーで蓄積されたエラーコードをクリアするアクション。マクロはAutoKeysのみなのでこれは他に影響を与えない。
他に適当なのは「警告音」(Beep)ぐらいか。押したファンクションキーが無効になった合図にビープ音を鳴らすのも良いかも。
Access 2010 の AutoKeys マクロの作り方
こうして作成したマクロをAccess 2007でデザインモードにすると、上のように見える。2010のXML形式はコメントとして下に残り、中のアクションが抽出されて上に並んでいる。
(「マクロ名」が見えない場合は、「デザイン」タブの「マクロ名」をクリック)
Access 2010で作成したマクロはそのまま動作するし、2007で変更したマクロ(上の今までの形式で変更する)も2010で動作する。
※今日時点の最新のサービスパック、アップデートを適用済み。
Access 2010 の AutoKeys マクロの作り方
しかし、Access 2003では真っ白でマクロは定義されていないものとして、変更すると上書きされてしまって、2010で作ったものがなくなる。2003では互換性がないようだ。
ここまでの結果をまとめると、
■Access 2003で新規作成したAutoKeysマクロ
 ○Access 2007で動作する
 ○Access 2010で動作する
■Access 2007で新規作成したAutoKeysマクロ
 ○Access 2003で動作する
 ○Access 2010で動作する
■Access 2010で新規作成したAutoKeysマクロ
 ×Access 2003で動作しない
 ○Access 2007で動作する
マクロの形式は過度期で、Accessの次バージョンの状況を見るまでは方針を決められないところはあるが、今までの資産からAccess2010以降へ移行するためにも、「アクション」は空にせずに、何か指定しておくと移行がスムーズになるだろう。

Access 2010 でマクロがXML化した?

Accessで業務アプリを開発する場合、マクロはほぼ使うことはなかったのだが、下のAutoKeysマクロだけは使用していた。
Access2007マクロ
これはAccess2007で見たものだが、Access2003と同じように見える。内容はファンクションキーを押したときのデフォルト動作(F1キーを押すと「Accessヘルプが開く」など)を無効化すること。(マクロ名は指定しているけどアクションが指定されていないので結果的に何も起きない)
ところが・・・
Access2010ではマクロのデザインビューが一新された。デザインビューだけかと思っていたら、下のように作成したマクロ(F1キーを押したときにアクション定義なし)は、
Access2010マクロ
Access2007で見ると下のように見える。コメント??しかもXML??
Access2010マクロ
結局、マクロの保存形式が全く変わって下位互換がなくなってしまった。
・Access2010で旧形式(2007以前)のAutoKeysマクロをインポートする
・Access2010でAutoKeysマクロを新規作成する
いずれの方法でも今までどおりの設定ではAutoKeysマクロは意図した動作をしてくれない。
とりあえずの回避策は、
Access2007でAutoKeysマクロをインポートし、Access2010で動作させること
この場合、マクロを変更しなければ意図通りの動作をしてくれる。
Access2010のみで如何に今までどおりのAutoKeysマクロを実現するかは思案中・・・
この記事の続き
Access 2010 の AutoKeys マクロの作り方

起動時の設定の「アプリケーション タイトル」を取得する方法

Access ADPで「起動時の設定」に入力した「アプリケーション タイトル」を取得する方法です。
一度も入力していない場合はエラーになる可能性があります。
‘ 起動時の設定の「アプリケーション タイトル」を取得する。
Private Function GetAppTitle() As String
GetAppTitle = CurrentProject.Properties(“AppTitle”)
Exit Function
Err_GetAppTitle:
GetAppTitle = “Microsoft Access”
End Function

AccessのMDEはすべて同じではない!?

Access(MDB)でフォームやレポートのVBAコードをコンパイルして実行可能のみの状態にするときは「MDE」形式にします。
Access2003までは・・・
Access2003
「ツール」メニュー → 「データベース ユーティリティ」 → 「MDE ファイルの作成」でした。
しかし、Office2007からリボンインターフェイスが採用されて、メニューの位置がわからなくなってしまいました。
ということで、ここで整理します。
Access2007は・・・
Access2007
「データベース ツール」リボン → 「データベース」 → 「MDEの作成」となりました。まだ2003に近いところに配置されています。
ところが、Access2010では・・・
Access2010
「ファイル」リボン → 「保存して発行」 → 「データベースに名前を付けて保存」 → 「MDE ファイルの作成」となりました。保存形式のひとつになってしまった。場所が大きく変わって迷います。
さて、上記どれでもファイル名は「*.mde」となるのですが、どれも同じかと思ったら、コンパイルされるとちょっと違うようです。
試しにAccess2007でmdeファイルを作成して、Access2003で実行してみます。
MDEエラー
「データベースの形式を認識できません。
データベースは、使用しているバージョンよりも新しいバージョンの Microsoft Office Access で作成されています。Microsoft Office Access を現在のバージョンにアップグレードしてからデータベースを開いてください。」
って、MDEになったらAccessのファイル形式は無視して、作成したバージョンを記録するようですね。MDEファイルを作成するなら、そのファイル形式の一番古いバージョンで作成することをおすすめします。