● Windows10の1703 (別名 Creators Update) 以降とExcel2000・Word2000・Acces2000のインストールについて
※1803でまたAccess2000が動くようになったもようです。
もちろん、Exce2000、Word2000も大丈夫みたいです。
1809もまたヒマを見てテストしてみたいとおもいます。
==============
以下本文です。
★ Win10へのインストールについて
Excel2000・Word2000・Acces2000などの、「Office2000」のWin10へのインストールについては、Excel2000とWord2000はとりあえずは大丈夫なようです。普通に動くみたいです。
マクロもユーザーフォームも一応、テストコードでは大丈夫でした。(厳密に調査するともしかしたらダメなのかも・・・)
しかし、Acces2000が正常動作するのは、とりあえず 1607(別名 Anniversary Update)までのお話となってしまいました。
※ご自分のパソコンのバージョンの調べ方は、「Windowsキー+R」(Windowsキーを押しながらRキーを押す)をして、「winver」と入力してEnterします。
出てきたダイアログの上のほうに「バージョン ×××× OSビルド ×××××××× 」と出てきたところの「バージョン」のところの数字を見ます。そこが例えば 1703なら1703(別名 Creators Update) です。(下図参照)下図の場合は、1607(別名 Anniversary Update)だ、ということになります。
Win10の1703では、例えばAccessは、メモリリーク?というか、mdbファイルを閉じてもAccess本体EXEがメモリに残るようになってしまいました。
一つでも「テーブル」か「連結フォーム」を開くと、その時点でメモリリーク決定となります。
タスクマネージャなどでMSACCESS.EXEを終了させてからでないと、次のmdbの画面がちゃんと開いてくれません。
(※ 連結フォームではない、ただの「非連結フォーム」の場合はメモリリークとなりません。なので作るフォームをすべて非連結フォームにすれば問題ないのかもしれませんが、それはちょっと面倒です。既存のフォームなら連結フォームも含まれているでしょうし・・・。また、非連結フォームにも何か不具合が出るかもしれません。未チェックです。なので、後述のようにAccess本体のプロセスを消すか、バージョン2003をお持ちならそれで2000のファイルを動かすほうが手っ取り早いです。)
何かレジストリなどの設定を変えれば良いのかもしれませんが、とりあえずその方法が分からないので、できることなら コマンドラインやVBAプログラム等々から消してしまいたいところです。
ただ、バージョン2003は大丈夫なようです。Accessの場合はメモリリークしません(将来の大型アップデートではするかもしれませんが)。
なので、もしOffice2003をお持ちなら、それを使うほうが面倒が無くていいと思います。
もちろん、Office2000で作ったファイルはExcel、Word、Access、基本的には動きます。
(AccessはSendkeysの問題があったかも。あと、カレンダーコントロールの曜日表示がおかしくなります。ただ、基本のVBAは正常に動きます。)
同様に、Office2002(OfficeXP)も行けるかもしれません。
テストしてOKでしたらまたご報告します。
※2017/11/05 追記
Office2002(OfficeXP)もAccessが大丈夫なようでした。テスト用に小さなテーブルとその連結フォームを作って開いてみましたが、終了させたのち、メモリに残ってしまうようなことはありませんでした。
ですので、Windows10の1703以降はとりあえず、OfficeXP以降で大丈夫なようです。(Accessが要らないならOffice2000でも大丈夫っぽいです。)
いずれにしましても、ご自身でも実際に色々と試してください。Windows10の大型アップデートで動くかもしれないし、動かなくなるかもしれません。また、いったん動かなくなっても、「更に次の」大型アップデートではまた動くようになるかもしれません。
どうしてもAccess2000を1703上で使いたい場合は、VMWareなどの仮想マシン作成・管理ソフトの上で、ゲストOSをXPやWindows2000などにして、その中で動かすほうが面倒が無いとは思います。
それもしたくなくて、なんとか1703の上でAccess2000を動かしたい、という場合は、コマンドプロンプトにて「PsKill」コマンドを使うことでメモリから消すことができます(タスクマネージャなどでMSACCESS.EXEを終了させたのと同じ状態にでき、他のmdbが開かない不具合を回避できます)。
コマンドプロンプトでやれる・・・、ということは、「VBA、UWSC、VB、等々からもやれる」、ということになります。
なので、mdbが開くときにプロセス番号を調べて開き、閉じるときまでにその番号をどこかに保存する、という形を取ってもいいかもしれません。それをランチャのような、mdb、あるいはexe、UWSCファイル、等々を作って監視し、mdbが閉じたときを狙って保存されたプロセスID(PID)でKillする、というような形でなんとかなるかもしれません。(やってみてないのでできるかどうかわかりませんが。ただ、タスクマネージャの「PID」の値で、「PsKill.exe」にてKillできることは間違いないです。ldbファイルは残ってしまうかもしれませんけど。)
※「PsKill.exe」は以下のダウンロードファイルの中に含まれています。
https://technet.microsoft.com/ja-jp/sysinternals/bb896683.aspx?f=255&MSPPError=-2147217396
「PSKill.exe」を「C:\Windows\System32」フォルダの中に放り込んであげればOKなはずです。
※参考Webページ「PsToolsを使いこなす」
http://itpro.nikkeibp.co.jp/article/COLUMN/20120601/399943/?rt=nocnt
開いたmdbのプロセスIDの取得は以下のコードを標準モジュールにコピペして、「task_id_get01()」をCallなどで呼び出せばOKです。Excelでも使えます。
もちろん、VBEのイミディエイトウィンドウで「? task_id_get01」でテストもできます。
なお、Declare文(Declare・・・の行)は、Function の塊とは分けて、別の標準モジュールに貼り付けても構いません。どのDeclare文とFunction が関係しているかのコメントさえ書いておけば大丈夫です。
1 2 3 4 5 6 7 8 |
' ' Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long Function task_id_get01() As Long task_id_get01 = GetCurrentProcessId End Function ’ |
※Declare文・・・「Win32API」という機能を使うための、その準備用の呪文です。